ZGlmZiAtLWdpdCBhLy5hc2YueWFtbCBiLy5hc2YueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhlYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvLmFzZi55YW1sCkBAIC0wLDAgKzEsMTEgQEAKK2dpdGh1YjoKKyAgZGVzY3JpcHRpb246ICJBcGFjaGUgVGlua2VyUG9wIC0gYSBncmFwaCBjb21wdXRpbmcgZnJhbWV3b3JrIgorICBob21lcGFnZTogaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy8KKyAgbGFiZWxzOgorICAgIC0gdGlua2VycG9wCisgICAgLSBncmVtbGluCisgICAgLSBncmFwaAorICAgIC0gZ3JhcGhkYgorICAgIC0gZ3JhcGgtZGF0YWJhc2UKKyAgICAtIGdyZW1saW4tc2VydmVyCisgICAgLSBhcGFjaGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8uZGVwZW5kYWJvdC9jb25maWcueW1sIGIvLmRlcGVuZGFib3QvY29uZmlnLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODcxYTAwCi0tLSAvZGV2L251bGwKKysrIGIvLmRlcGVuZGFib3QvY29uZmlnLnltbApAQCAtMCwwICsxLDEwIEBACit2ZXJzaW9uOiAxCit1cGRhdGVfY29uZmlnczoKKyAgLSBwYWNrYWdlX21hbmFnZXI6ICJqYXZhOm1hdmVuIgorICAgIGRpcmVjdG9yeTogIi8iCisgICAgdXBkYXRlX3NjaGVkdWxlOiAibW9udGhseSIKKyAgICBhbGxvd2VkX3VwZGF0ZXM6CisgICAgICAtIG1hdGNoOgorICAgICAgICAgIHVwZGF0ZV90eXBlOiAic2VjdXJpdHkiCisgICAgICAtIG1hdGNoOgorICAgICAgICAgIGRlcGVuZGVuY3lfbmFtZTogIm9yZy5hcGFjaGUudGlua2VycG9wOmRpZS1kZXBlbmRhYm90IgpkaWZmIC0tZ2l0IGEvLmdpdGlnbm9yZSBiLy5naXRpZ25vcmUKaW5kZXggMWRiNDRiOS4uYjJjZTEyNyAxMDA2NDQKLS0tIGEvLmdpdGlnbm9yZQorKysgYi8uZ2l0aWdub3JlCkBAIC0xMCw2ICsxMCw3IEBACiAuY2xhc3NwYXRoCiAucHJvamVjdAogLnNldHRpbmdzCisuZmFjdG9yeXBhdGgKIF9ic3AvCiBkb2Mvb3V0CiBkb2NzLyouYXNjaWlkb2MKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKaW5kZXggMTkwNTBjMy4uMjk1NGM3NCAxMDA2NDQKLS0tIGEvLnRyYXZpcy55bWwKKysrIGIvLnRyYXZpcy55bWwKQEAgLTIsOSArMiw5IEBACiBvczoKICAgLSBsaW51eAogamRrOgotICAtIG9wZW5qZGs4CisgIC0gb3BlbmpkazExCiBzdWRvOiByZXF1aXJlZAotZGlzdDogeGVuaWFsCitkaXN0OiBiaW9uaWMKIHNlcnZpY2VzOgogICAtIGRvY2tlcgogY2FjaGU6CkBAIC0zNiwxMiArMzYsMTMgQEAKICAgLSBzdWRvIGFwdCBpbnN0YWxsIHB5dGhvbjMuNgogICAtIHN1ZG8gcm0gL3Vzci9iaW4vcHl0aG9uMwogICAtIHN1ZG8gbG4gLXMgcHl0aG9uMy42IC91c3IvYmluL3B5dGhvbjMKKyAgLSBzdWRvIGFwdCBpbnN0YWxsIGdjYyBweXRob24zLjYtZGV2IGxpYmtyYjUtZGV2CiAKIGpvYnM6CiAgIGluY2x1ZGU6CiAgICAgLSBzdGFnZTogInRlc3RzIgogICAgICAgc2NyaXB0OiAibXZuIGNsZWFuIGluc3RhbGwgLURjaSAtLWJhdGNoLW1vZGUgLURvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLmxvZy5vcmcuYXBhY2hlLm1hdmVuLmNsaS50cmFuc2Zlci5TbGY0ak1hdmVuVHJhbnNmZXJMaXN0ZW5lcj13YXJuIgotICAgICAgbmFtZTogIm12biBjbGVhbiBpbnN0YWxsIgorICAgICAgbmFtZTogIm12biBjbGVhbiBpbnN0YWxsIC0gamRrMTEiCiAgICAgLSBzY3JpcHQ6ICJ0b3VjaCBncmVtbGluLWRvdG5ldC9zcmMvLmdsdiAmJiB0b3VjaCBncmVtbGluLWRvdG5ldC90ZXN0Ly5nbHYgJiYgbXZuIGNsZWFuIGluc3RhbGwgLXEgLURza2lwVGVzdHMgLURjaSAmJiBtdm4gdmVyaWZ5IC1wbCA6Z3JlbWxpbi1kb3RuZXQsOmdyZW1saW4tZG90bmV0LXRlc3RzIC1QIGdyZW1saW4tZG90bmV0IgogICAgICAgbmFtZTogIi5uZXQiCiAgICAgLSBzY3JpcHQ6ICJ0b3VjaCBncmVtbGluLXB5dGhvbi8uZ2x2ICYmIG12biBjbGVhbiBpbnN0YWxsIC1xIC1Ec2tpcFRlc3RzIC1EY2kgJiYgbXZuIHZlcmlmeSAtcGwgZ3JlbWxpbi1weXRob24iCkBAIC00OSw4ICs1MCwxMyBAQAogICAgIC0gc2NyaXB0OiAibXZuIGNsZWFuIGluc3RhbGwgLXEgLURza2lwVGVzdHMgLURjaSAmJiBtdm4gdmVyaWZ5IC1wbCA6Z3JlbWxpbi1qYXZhc2NyaXB0IgogICAgICAgbmFtZTogImphdmFzY3JpcHQiCiAgICAgLSBzY3JpcHQ6Ci0gICAgICAtICJtdm4gY2xlYW4gaW5zdGFsbCAtcSAtRHNraXBUZXN0cyAtRGNpIgotICAgICAgLSAibXZuIHZlcmlmeSAtcGwgOmdyZW1saW4tc2VydmVyIC1Ec2tpcFRlc3RzIC1Ec2tpcEludGVncmF0aW9uVGVzdHM9ZmFsc2UgLURpbmNsdWRlTmVvNGoiCisgICAgICAgIC0gIm12biAtdmVyc2lvbiIKKyAgICAgICAgLSAibXZuIGNsZWFuIGluc3RhbGwgLURjaSAtLWJhdGNoLW1vZGUgLURvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLmxvZy5vcmcuYXBhY2hlLm1hdmVuLmNsaS50cmFuc2Zlci5TbGY0ak1hdmVuVHJhbnNmZXJMaXN0ZW5lcj13YXJuIgorICAgICAgamRrOiBvcGVuamRrOAorICAgICAgbmFtZTogIm12biBjbGVhbiBpbnN0YWxsIC0gamRrOCIKKyAgICAtIHNjcmlwdDoKKyAgICAgICAgLSAibXZuIGNsZWFuIGluc3RhbGwgLXEgLURza2lwVGVzdHMgLURjaSIKKyAgICAgICAgLSAibXZuIHZlcmlmeSAtcGwgOmdyZW1saW4tc2VydmVyIC1Ec2tpcFRlc3RzIC1Ec2tpcEludGVncmF0aW9uVGVzdHM9ZmFsc2UgLURpbmNsdWRlTmVvNGoiCiAgICAgICBuYW1lOiAiZ3JlbWxpbiBzZXJ2ZXIiCiAgICAgLSBzY3JpcHQ6CiAgICAgICAgIC0gIm12biBjbGVhbiBpbnN0YWxsIC1xIC1Ec2tpcFRlc3RzIC1EY2kiCmRpZmYgLS1naXQgYS9DSEFOR0VMT0cuYXNjaWlkb2MgYi9DSEFOR0VMT0cuYXNjaWlkb2MKaW5kZXggYTFkODIyZC4uMDNhNTI2OCAxMDA2NDQKLS0tIGEvQ0hBTkdFTE9HLmFzY2lpZG9jCisrKyBiL0NIQU5HRUxPRy5hc2NpaWRvYwpAQCAtMTYsNiArMTYsNzMgQEAKIC8vLy8KID0gVGlua2VyUG9wMyBDSEFOR0VMT0cKIAorPT0gVGlua2VyUG9wIDMuNS4wIChUaGUgU2xlZXBpbmcgR3JlbWxpbjogTm8uIDE4IEVudHInYWN0ZSBzeW1waG9uaXF1ZSkKKworaW1hZ2U6Omh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcGFjaGUvdGlua2VycG9wL21hc3Rlci9kb2NzL3N0YXRpYy9pbWFnZXMvZ3JlbWxpbi1zbGVlcGluZy1iZWF1dHkucG5nW3dpZHRoPTE4NV0KKworW1tyZWxlYXNlLTMtNS0wXV0KKz09PSBUaW5rZXJQb3AgMy41LjAgKFJlbGVhc2UgRGF0ZTogTk9UIE9GRklDSUFMTFkgUkVMRUFTRUQgWUVUKQorCitUaGlzIHJlbGVhc2UgYWxzbyBpbmNsdWRlcyBjaGFuZ2VzIGZyb20gPDxyZWxlYXNlLTMtNC0zLCAzLjQuMz4+LgorCisqIEFsbG93ZWQgdGhlIHBvc3NpYmlsaXR5IGZvciB0aGUgcHJvcGFnYXRpb24gb2YgYG51bGxgIGFzIGEgYFRyYXZlcnNlcmAgaW4gR3JlbWxpbi4KKyogRml4ZWQgYSBidWcgd2hlcmUgc3BhcmstZ3JlbWxpbiB3YXMgbm90IHJlLWF0dGFjaGluZyBwcm9wZXJ0aWVzIHdoZW4gdXNpbmcgYGRlZHVwKClgLgorKiBFbnN1cmVkIGJldHRlciBjb25zaXN0ZW5jeSBvZiB0aGUgdXNlIG9mIGBudWxsYCBhcyBhcmd1bWVudHMgdG8gbXV0YXRpb24gc3RlcHMuCisqIEFsbG93ZWQgYHByb3BlcnR5KFQubGFiZWwsT2JqZWN0KWAgdG8gYmUgdXNlZCBpZiBubyB2YWx1ZSB3YXMgc3VwcGxpZWQgdG8gYGFkZFYoU3RyaW5nKWAuCisqIEFsbG93ZWQgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYENsaWVudC5zdWJtaXQoKWAgaW4gSmF2YXNjcmlwdCBkcml2ZXIgdG8gZW5hYmxlIHNldHRpbmcgb2YgcGFyYW1ldGVycyBsaWtlIGBzY3JpcHRFdmFsdWF0aW9uVGltZW91dGAuCisqIFN1cHBvcnRlZCBkZXNlcmlhbGl6YXRpb24gb2YgYGRpY3RgIGFzIGEga2V5IGluIGEgYGRpY3RgIGZvciBQeXRob24uCisqIEFkZGVkIGEgYEdyYXBoLkZlYXR1cmVgIGZvciBgc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXNgLgorKiBNb2RpZmllZCBgVG9rZW5UcmF2ZXJzYWxgIHRvIHN1cHBvcnQgYFByb3BlcnR5YCB0aHVzIGBieShrZXkpYCBhbmQgYGJ5KHZhbHVlKWAgY2FuIG5vdyBhcHBseSB0byBgRWRnZWAgYW5kIG1ldGEtcHJvcGVydGllcy4KKyogQWRkZWQgYFNlZWRTdHJhdGVneWAgdG8gYWxsb3cgZGV0ZXJtaW5pc3RpYyBiZWhhdmlvciBmb3IgYGNvaW4oKWAsIGBzYW1wbGUoKWAgYW5kIGBPcmRlci5zaHVmZmxlYC4KKyogQWRkZWQgYEdyb3VwaW5nYCBzdGVwIGludGVyZmFjZS4KKyogQWRkZWQgYFRyYXZlcnNhbFBhcmVudC5yZXBsYWNlVHJhdmVyc2FsKClgIHdoaWNoIGNhbiByZXBsYWNlIGEgZGlyZWN0IGNoaWxkIHRyYXZlcnNhbC4KKyogQWRkZWQgYEJ5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3lgIHdoaWNoIHJlcGxhY2VzIGNlcnRhaW4gc3RhbmRhcmQgdHJhdmVyc2FscyB3LyBvcHRpbWl6ZWQgdHJhdmVyc2FscyAoZS5nLiBgVG9rZW5UcmF2ZXJzYWxgKS4KKyogUmVmYWN0b3JlZCBgTWFwU3RlcGAgdG8gbW92ZSBpdHMgbG9naWMgdG8gYFNjYWxhck1hcFN0ZXBgIHNvIHRoYXQgdGhlIG9sZCBiZWhhdmlvciBjb3VsZCBiZSBwcmVzZXJ2ZWQgd2hpbGUgYWxsb3cgb3RoZXIgaW1wbGVtZW50YXRpb25zIHRvIGhhdmUgbW9yZSBmbGV4aWJpbGl0eS4KKyogTW9kaWZpZWQgVGlua2VyR3JhcGggdG8gc3VwcG9ydCBgbnVsbGAgcHJvcGVydHkgdmFsdWVzIGFuZCBjYW4gYmUgY29uZmlndXJlZCB0byBkaXNhYmxlIHRoYXQgZmVhdHVyZS4KKyogTW9kaWZpZWQgYG51bGxgIGhhbmRsaW5nIGluIG11dGF0aW9ucyB0byBiZSBjb25zaXN0ZW50IGZvciBhIG5ldyBgVmVydGV4YCBhcyB3ZWxsIGFzIHVwZGF0ZSB0byBhbiBleGlzdGluZyBvbmUuCisqIEVuZm9yY2VkIHVzZSBvZiBhbm9ueW1vdXMgY2hpbGQgdHJhdmVyc2Fscy4KKyogUmVtb3ZlZCBzdXBwb3J0IGZvciBQeXRob24gMi54IGluIGdyZW1saW5weXRob24uCisqIFVwZ3JhZGVkIHRvIEFwYWNoZSBDb21tb25zIENvbmZpZ3VyYXRpb24yLgorKiBSZW5hbWVkIGBTdG9yZVN0ZXBgIHRvIGBBZ2dyZWdhdGVMb2NhbFN0ZXBgLgorKiBSZW5hbWVkIGBBZ2dyZWdhdGVTdGVwYCB0byBgQWdncmVnYXRlR2xvYmFsU3RlcGAuCisqIFJlbmFtZWQgYFNFUlZFUl9FUlJPUl9TQ1JJUFRfRVZBTFVBVElPTmAgdG8gYFNFUlZFUl9FUlJPUl9FVkFMVUFUSU9OYCBnaXZlbiB0aGF0IHRoaXMgcmVzcG9uc2UgY29kZSBhcHBsaWVzIHRvIHJlbW90ZSB0cmF2ZXJzYWxzIGFzIHdlbGwgYXMgc2NyaXB0cy4KKyogUmVmYWN0b3JlZCBgVHJhdmVyc2FsU3RyYXRlZ2llc2AgdG8gaW1wbGVtZW50IGBJdGVyYWJsZWAuCisqIFJlZmFjdG9yZWQgYFRyYXZlcnNhbGAgc2VtYW50aWNzIHRvIGFsd2F5cyBleHBlY3QgYEVtcHR5U3RlcGAgYXMgYSBwYXJlbnQgaWYgaXQgaXMgbWVhbnQgdG8gYmUgdGhlIHJvb3QgYFRyYXZlcnNhbGAuCisqIENvbmZpZ3VyZWQgR3JhcGhCaW5hcnkgYXMgdGhlIGRlZmF1bHQgYmluYXJ5IHNlcmlhbGl6YXRpb24gZm9ybWF0IGZvciB0aGUgSmF2YSBEcml2ZXIuCisqIENvbmZpZ3VyZWQgR3JhcGhTT04gMy4wIGFzIHRoZSBkZWZhdWx0IHRleHQgc2VyaWFsaXphdGlvbiBmb3JtYXQgd2hlbiBubyBzZXJpYWxpemVyIGNhbiBiZSBkZXRlcm1pbmVkLgorKiBDb25maWd1cmVkIEdyYXBoU09OIDMuMCBhcyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgYEdyYXBoU09OTWFwcGVyYC4KKyogQnVtcGVkIHRvIE5lbzRqIDMuNC4xMS4KKyogQnVtcGVkIHRvIFNwYXJrIDMuMC4wLgorKiBCdW1wZWQgdG8gR3Jvb3Z5IDMuMC4zLgorKiBCdW1wZWQgdG8gSmFja3NvbiAyLjExLnguCisqIFN1cHBvcnRlZCBidWlsZCBmb3IgSmF2YSAxMS4KKyogQWRkZWQgYSBwYXJhbWV0ZXJpemVkIGBUeXBlVHJhbnNsYXRvcmAgZm9yIHVzZSB3aXRoIGBHcm9vdnlUcmFuc2xhdG9yYCB0aGF0IHNob3VsZCBwcm9kdWNlIG1vcmUgY2FjaGUgaGl0cy4KKyogQWRkZWQgc3VwcG9ydCBmb3IgYFRleHRQYCBpbiBOZW80aiB1c2luZyBpdHMgc3RyaW5nIHNlYXJjaCBmdW5jdGlvbnMuCisqIEFkZGVkIGEga2VyYmVyb3MgS0RDIHRvIHRoZSBkb2NrZXIgY29udGFpbmVyIGZvciB0ZXN0aW5nIEdMVidzLgorKiBBZGRlZCBrZXJiZXJvcyBhdXRoZW50aWNhdGlvbiB0byBHcmVtbGluLVB5dGhvbi4KKyogQWRkZWQgYXVkaXQgbG9nZ2luZyB0byBieXRlY29kZS1iYXNlZCB0cmF2ZXJzYWxzLgorKiBDaGFuZ2VkIGBUcmF2ZXJzYWxTdHJhdGVneWAgYXBwbGljYXRpb24gbWV0aG9kb2xvZ3kgdG8gYXBwbHkgZWFjaCBzdHJhdGVneSBpbiB0dXJuIHRvIGVhY2ggbGV2ZWwgb2YgdGhlIHRyYXZlcnNhbCBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbSByb290IGRvd24gdG8gY2hpbGRyZW4uCisqIFByZXZlbnRlZCBtb3JlIHRoYW4gb25lIGBDbGllbnRgIGZyb20gY29ubmVjdGluZyB0byB0aGUgc2FtZSBHcmVtbGluIFNlcnZlciBzZXNzaW9uLgorKiBSZW1vdmVkIGludGVybmFsIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBzZXNzaW9uIGNsb3NlIG1lc3NhZ2UgaW4gR3JlbWxpbiBTZXJ2ZXIgLSB0aGUgbWVzc2FnZSBpcyBhY2NlcHRlZCBidXQgaWdub3JlZCBpZiBzZW50LgorKiBSZW1vdmVkIGBQcm9wZXJ0eS5FeGNlcHRpb25zLnByb3BlcnR5VmFsdWVDYW5Ob3RCZU51bGxgIGV4Y2VwdGlvbiB0eXBlIGFzIGBudWxsYCBub3cgaGFzIG1lYW5pbmcgaW4gR3JlbWxpbi4KKyogUmVtb3ZlZCB0aGUgImV4cGVyaW1lbnRhbCIgc3VwcG9ydCBmb3IgbXVsdGkvbWV0YS1wcm9wZXJ0aWVzIGluIE5lbzRqLgorKiBSZW1vdmVkIEdyeW8gc2VyaWFsaXphdGlvbiBjb25maWd1cmF0aW9ucyBmcm9tIEdyZW1saW4gU2VydmVyIHNhbXBsZSBjb25maWd1cmF0aW9ucyBhbmQgZGVmYXVsdCBjb25maWd1cmF0aW9ucy4KKyogUmVtb3ZlZCBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgYENsdXN0ZXIubWF4V2FpdEZvclNlc3Npb25DbG9zZWAgY29uZmlndXJhdGlvbiBvcHRpb24uCisqIFJlbW92ZWQgcHJldmlvdXNseSBkZXByZWNhdGVkIGBUcmF2ZXJzYWxTdHJhdGVnaWVzLmFwcGx5U3RyYXRlZ2llcygpYC4KKyogUmVtb3ZlZCBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgYHNjcmlwdEV2YWx1YXRpb25UaW1lb3V0YC4KKyogUmVtb3ZlZCBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgYE5pb0NoYW5uZWxpemVyYCBhbmQgcmVsYXRlZCBjbGFzc2VzLgorKiBSZW1vdmVkIHByZXZpb3VzbHkgZGVwcmVjYXRlZCByZW1vdGUgdHJhdmVyc2FsIHNpZGUtZWZmZWN0cyBhbmQgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZS4KKyogUmVtb3ZlZCBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgYFNlcmlhbGl6ZXJzLkRFRkFVTFRfUkVTVUxUX1NFUklBTElaRVJgIGFuZCBgU2VyaWFsaXplcnMuREVGQVVMVF9SRVFVRVNUX1NFUklBTElaRVJgLgorKiBSZW1vdmVkIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBgZGVjcmAgYW5kIGBpbmNyYCBmcm9tIGBPcmRlcmAuCisqIFJlbW92ZWQgcHJldmlvdXNseSBkZXByZWNhdGVkIGBUcmF2ZXJzYWxTb3VyY2Uud2l0aFJlbW90ZSgpYC4KKyogUmVtb3ZlZCBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgYFJlc3BvbnNlSGFuZGxlckNvbnRleHRgIGluZnJhc3RydWN0dXJlLgorKiBSZW1vdmVkIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBgVmVydGV4UHJvZ3JhbWAgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZS4KKyogUmVtb3ZlZCBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgU1NMIHNldHRpbmdzOiBga2V5Q2VydENoYWluRmlsZWAsIGBrZXlGaWxlYCwgYGtleVBhc3N3b3JkYCBhbmQgYHRydXN0Q2VydENoYWluRmlsZWAgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUuCisqIFJlbW92ZWQgcHJldmlvdXNseSBkZXByZWNhdGVkIGBQcm9wZXJ0eU1hcFN0ZXBgIGNvbnN0cnVjdG9yIGFuZCBgaXNJbmNsdWRlVG9rZW5zYC4KKyogUmVtb3ZlZCBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgYFN0YXJHcmFwaC5idWlsZGVyKClgIGFuZCBgU3RhckdyYXBoLkJ1aWxkZXIuY3JlYXRlKClgLgorKiBSZW1vdmVkIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBgQWJzdHJhY3RPcFByb2Nlc3Nvci5nZW5lcmF0ZU1ldGFEYXRhKENoYW5uZWxIYW5kbGVyQ29udGV4dCwgUmVxdWVzdE1lc3NhZ2UsIFJlc3BvbnNlU3RhdHVzQ29kZSwgSXRlcmF0b3IpYAorKiBSZW1vdmVkIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBgQnVsa0R1bXBlclZlcnRleFByb2dyYW1gIGFuZCBgQnVsa0xvYWRlclZlcnRleFByb2dyYW1gLgorCiA9PSBUaW5rZXJQb3AgMy40LjAgKEF2YW50LUdyZW1saW4gQ29uc3RydWN0aW9uICMzIGZvciBUaGVyZW1pbiBhbmQgRmxvd2VycykKIAogaW1hZ2U6Omh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcGFjaGUvdGlua2VycG9wL21hc3Rlci9kb2NzL3N0YXRpYy9pbWFnZXMvYXZhbnQtZ3JlbWxpbi5wbmdbd2lkdGg9MTg1XQpAQCAtODMzLDYgKzkwMCw4IEBACiAqIEJ1bXBlZCBgaHR0cGNsaWVudGAgdG8gNC41LjcuCiAqIEJ1bXBlZCBgc2xmNGpgIHRvIDEuNy4yNS4KICogQnVtcGVkIGBjb21tb25zLWNvZGVjYCB0byAxLjEyLgorKiBCdW1wZWQgdG8gR3Jvb3Z5IDIuNS42LgorKiBCdW1wZWQgdG8gSGFkb29wIDIuNy43LgogKiBGaXhlZCBwYXJ0aWFsIHJlc3BvbnNlIGZhaWx1cmVzIHdoZW4gdXNpbmcgYXV0aGVudGljYXRpb24gaW4gYGdyZW1saW4tcHl0aG9uYC4KICogRml4ZWQgY29uY3VycmVuY3kgaXNzdWVzIGluIGBUcmF2ZXJzZXJTZXQudG9TdHJpbmcoKWAgYW5kIGBPYmplY3RXcml0YWJsZS50b1N0cmluZygpYC4KICogRml4ZWQgYSBidWcgaW4gYElubGluZUZpbHRlclN0cmF0ZWd5YCB0aGF0IG1peGVkIHVwIGFuZCdzIGFuZCBvcidzIHdoZW4gZm9sZGluZyBtZXJnaW5nIGNvbmRpdGlvbnMgdG9nZXRoZXIuCmRpZmYgLS1naXQgYS9SRUFETUUuYXNjaWlkb2MgYi9SRUFETUUuYXNjaWlkb2MKaW5kZXggNGY4ZTY1OS4uM2YyMzY3ZCAxMDA2NDQKLS0tIGEvUkVBRE1FLmFzY2lpZG9jCisrKyBiL1JFQURNRS5hc2NpaWRvYwpAQCAtMjksNyArMjksNyBAQAogCiA9PT0gQnVpbGRpbmcgYW5kIFRlc3RpbmcKIAotVGlua2VyUG9wIHVzZXMgbGluazpodHRwczovL21hdmVuLmFwYWNoZS5vcmcvW01hdmVuXSBhbmQgcmVxdWlyZXMgYEphdmEgMS44LjBfNDArYCBmb3IgcHJvcGVyIGJ1aWxkaW5nIGFuZCBwcm9wZXIgb3BlcmF0aW9ucy4gVG8gYnVpbGQsIGV4ZWN1dGUgdW5pdCB0ZXN0cyBhbmQgcGFja2FnZSBHcmVtbGluIENvbnNvbGUvU2VydmVyIHJ1bjoKK1RpbmtlclBvcCB1c2VzIGxpbms6aHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL1tNYXZlbl0gYW5kIHJlcXVpcmVzIGBKYXZhIDExYCBmb3IgcHJvcGVyIGJ1aWxkaW5nIGFuZCBwcm9wZXIgb3BlcmF0aW9ucy4gVG8gYnVpbGQsIGV4ZWN1dGUgdW5pdCB0ZXN0cyBhbmQgcGFja2FnZSBHcmVtbGluIENvbnNvbGUvU2VydmVyIHJ1bjoKIAogW3NvdXJjZSxiYXNoXQogbXZuIGNsZWFuIGluc3RhbGwKZGlmZiAtLWdpdCBhL2Jpbi9nZXBoaS1tb2NrLnB5IGIvYmluL2dlcGhpLW1vY2sucHkKaW5kZXggODU1MDFlNi4uMTAxODY3NyAxMDA3NTUKLS0tIGEvYmluL2dlcGhpLW1vY2sucHkKKysrIGIvYmluL2dlcGhpLW1vY2sucHkKQEAgLTEsNCArMSw0IEBACi0jIS91c3IvYmluL2VudiBweXRob24KKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKICMKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBCYXNlSFRUUFNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgorZnJvbSBodHRwLnNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgogCiAKIGNsYXNzIEdlcGhpSGFuZGxlcihCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKZGlmZiAtLWdpdCBhL2RvY2tlci9Eb2NrZXJmaWxlIGIvZG9ja2VyL0RvY2tlcmZpbGUKaW5kZXggZDk5N2JlNi4uZTViYWUzMyAxMDA2NDQKLS0tIGEvZG9ja2VyL0RvY2tlcmZpbGUKKysrIGIvZG9ja2VyL0RvY2tlcmZpbGUKQEAgLTI1LDcgKzI1LDcgQEAKIFJVTiBzaCAtYyAnY3VybCAtcyBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vY29uZmlnL3VidW50dS8xNi4wNC9wYWNrYWdlcy1taWNyb3NvZnQtcHJvZC5kZWIgLW8gcGFja2FnZXMtbWljcm9zb2Z0LXByb2QuZGViJwogUlVOIHNoIC1jICdkcGtnIC1pIHBhY2thZ2VzLW1pY3Jvc29mdC1wcm9kLmRlYicKIFJVTiBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBoa3A6Ly9rZXlzZXJ2ZXIudWJ1bnR1LmNvbTo4MCAtLXJlY3Yta2V5cyAzRkE3RTAzMjgwODFCRkY2QTE0REEyOUFBNkExOUIzOEQzRDgzMUVGCi1SVU4gYXB0LWdldCBpbnN0YWxsIGFwdC10cmFuc3BvcnQtaHR0cHMgY2EtY2VydGlmaWNhdGVzCitSVU4gYXB0LWdldCBpbnN0YWxsIGFwdC10cmFuc3BvcnQtaHR0cHMgZ251cGcgY2EtY2VydGlmaWNhdGVzCiBSVU4gc2ggLWMgJ2VjaG8gImRlYiBodHRwczovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby91YnVudHUgc3RhYmxlLXhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLW9mZmljaWFsLXN0YWJsZS5saXN0JwogUlVOIGFwdC1nZXQgdXBkYXRlCiAKQEAgLTM4LDcgKzM4LDkgQEAKICMgY3VzdG9tIGJ1aWxkIGFuZCBpbnN0YWxsIDMuNS4zIGFuZCB1cGdyYWRlIHBpcCBhbG9uZyB0aGUgd2F5LiB0aGlzIGNvdWxkIGJlIHJlc29sdmVkIGJ5IHVzaW5nIGJpb25pYwogIyBidXQgdHJ5aW5nIHRvIGtlZXAgYWxsIG9mIG91ciByZWxlYXNlIGJyYW5jaGVzIG9uIHRoZSBzYW1lIGRvY2tlciBpbWFnZSBhbmQgdGhlIG9sZGVyIHZlcnNpb25zIHNvcnRhCiAjIHN1aXQgMy4zLnggYW5kIDMuNC54Ci1SVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tZm9yY2UteWVzIHB5dGhvbiBweXRob24tZGV2IHB5dGhvbi1waXAgYnVpbGQtZXNzZW50aWFsIGNoZWNraW5zdGFsbCB6bGliMWctZGV2IGxpYnJlYWRsaW5lLWdwbHYyLWRldiBsaWJuY3Vyc2VzdzUtZGV2IGxpYnNzbC1kZXYgbGlic3FsaXRlMy1kZXYgdGstZGV2IGxpYmdkYm0tZGV2IGxpYmM2LWRldiBsaWJiejItZGV2CitFTlYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IHB5dGhvbiBweXRob24tZGV2IHB5dGhvbi1waXAgYnVpbGQtZXNzZW50aWFsIGNoZWNraW5zdGFsbCB6bGliMWctZGV2IGxpYnJlYWRsaW5lLWdwbHYyLWRldiBcCisgICAgbGlibmN1cnNlc3c1LWRldiBsaWJzc2wtZGV2IGxpYnNxbGl0ZTMtZGV2IHRrLWRldiBsaWJnZGJtLWRldiBsaWJjNi1kZXYgbGliYnoyLWRldiBsaWJrcmI1LWRldiBrcmI1LXVzZXIKIFJVTiBjZCAvb3B0ICYmIHdnZXQgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9mdHAvcHl0aG9uLzMuNS4zL1B5dGhvbi0zLjUuMy50Z3ogJiYgdGFyIC14dmYgUHl0aG9uLTMuNS4zLnRnegogUlVOIGNkIC9vcHQvUHl0aG9uLTMuNS4zICYmIC4vY29uZmlndXJlICYmIG1ha2UgJiYgbWFrZSBpbnN0YWxsCiBSVU4gbG4gLXNmIC91c3IvYmluL3B5dGhvbjMuNS4zIC91c3IvYmluL3B5dGhvbjMKZGlmZiAtLWdpdCBhL2RvY2tlci9ncmVtbGluLXNlcnZlci5zaCBiL2RvY2tlci9ncmVtbGluLXNlcnZlci5zaAppbmRleCBlZThkMTExLi45ZDkxZGE3IDEwMDc1NQotLS0gYS9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIuc2gKKysrIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyLnNoCkBAIC0yNSw2ICsyNSw3IEBACiAKIERJUj1gZGlybmFtZSAkMGAKIFBST0pFQ1RfSE9NRT0ke0RJUn0vLi4vCitBQlNfUFJPSkVDVF9IT01FPSQoZGlybmFtZSAkKHJlYWxwYXRoICQwKSkvLi4KIAogVElNRVNUQU1QPSQoZGF0ZSArJXMpCiBCVUlMRF9UQUc9ImdyZW1saW4tc2VydmVyLXRlc3QtJHtUSU1FU1RBTVB9IgpAQCAtNTcsNyArNTgsOCBAQAogc2VkIC1lICJzL0dSRU1MSU5fU0VSVkVSX1ZFUlNJT05cJC8ke0dSRU1MSU5fU0VSVkVSX1ZFUlNJT059LyIgZG9ja2VyL2dyZW1saW4tc2VydmVyL0RvY2tlcmZpbGUudGVtcGxhdGUgPiBEb2NrZXJmaWxlCiAKIGRvY2tlciBidWlsZCAtdCB0aW5rZXJwb3A6JHtCVUlMRF9UQUd9IC4KLWRvY2tlciBydW4gJHtUSU5LRVJQT1BfVEVTVF9ET0NLRVJfT1BUU30gJHtSRU1PVkVfQ09OVEFJTkVSfSAtdGkgLXAgNDU5NDA6NDU5NDAgLXAgNDU5NDE6NDU5NDEgLXYgIiR7SE9NRX0iLy5ncm9vdnk6L3Jvb3QvLmdyb292eSAtdiAiJHtIT01FfSIvLm0yOi9yb290Ly5tMiB0aW5rZXJwb3A6JHtCVUlMRF9UQUd9ICR7QH0KK2RvY2tlciBydW4gJHtUSU5LRVJQT1BfVEVTVF9ET0NLRVJfT1BUU30gJHtSRU1PVkVfQ09OVEFJTkVSfSAtcCA0NTk0MDo0NTk0MCAtcCA0NTk0MTo0NTk0MSAtcCA0NTk0Mjo0NTk0MiAtcCA0NTg4OjQ1ODggLWggZ3JlbWxpbi1zZXJ2ZXItdGVzdCAtdiAiJHtIT01FfSIvLmdyb292eTovcm9vdC8uZ3Jvb3Z5IFwKKyAgICAtdiAiJHtIT01FfSIvLm0yOi9yb290Ly5tMiAtdiAke0FCU19QUk9KRUNUX0hPTUV9L2dyZW1saW4tdGVzdC90YXJnZXQ6L29wdC9ncmVtbGluLXRlc3QgLXRpIHRpbmtlcnBvcDoke0JVSUxEX1RBR30gJHtAfQogCiBzdGF0dXM9JD8KIHBvcGQgPiAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2RvY2tlci9ncmVtbGluLXNlcnZlci9Eb2NrZXJmaWxlLnRlbXBsYXRlIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL0RvY2tlcmZpbGUudGVtcGxhdGUKaW5kZXggZGU0ZWI0NS4uY2JiMDYxMSAxMDA2NDQKLS0tIGEvZG9ja2VyL2dyZW1saW4tc2VydmVyL0RvY2tlcmZpbGUudGVtcGxhdGUKKysrIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL0RvY2tlcmZpbGUudGVtcGxhdGUKQEAgLTI1LDcgKzI1LDcgQEAKIFJVTiBjaG1vZCA3NTUgL29wdC9kb2NrZXItZW50cnlwb2ludC5zaAogRU5WIEdSRU1MSU5fU0VSVkVSX1ZFUlNJT049R1JFTUxJTl9TRVJWRVJfVkVSU0lPTgogCi1FWFBPU0UgNDU5NDAtNDU5NDEKK0VYUE9TRSA0NTk0MC00NTk0MiA0NTg4CiAKIEVOVFJZUE9JTlQgWyIvb3B0L2RvY2tlci1lbnRyeXBvaW50LnNoIl0KIENNRCBbXQpkaWZmIC0tZ2l0IGEvZG9ja2VyL2dyZW1saW4tc2VydmVyL2RvY2tlci1lbnRyeXBvaW50LnNoIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL2RvY2tlci1lbnRyeXBvaW50LnNoCmluZGV4IGFlNzUxMTYuLjcwMzFjZWMgMTAwNjQ0Ci0tLSBhL2RvY2tlci9ncmVtbGluLXNlcnZlci9kb2NrZXItZW50cnlwb2ludC5zaAorKysgYi9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIvZG9ja2VyLWVudHJ5cG9pbnQuc2gKQEAgLTE5LDE4ICsxOSw3MSBAQAogIwogCiBUSU5LRVJQT1BfSE9NRT0vb3B0L2dyZW1saW4tc2VydmVyCi0KIGNwIC9vcHQvdGVzdC9zY3JpcHRzLyogJHtUSU5LRVJQT1BfSE9NRX0vc2NyaXB0cwogCiBJUD0kKGhvc3RuYW1lIC1pKQotZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisKK2VjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgogZWNobyBJUCBpcyAkSVAKLWVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgorZWNobworZWNobyBBdmFpbGFibGUgR3JlbWxpbiBTZXJ2ZXIgaW5zdGFuY2VzOgorZWNobyAid3M6Ly8ke0lQfTo0NTk0MC9ncmVtbGluIHdpdGggYW5vbnltb3VzIGFjY2VzcyIKK2VjaG8gIndzOi8vJHtJUH06NDU5NDEvZ3JlbWxpbiB3aXRoIGJhc2ljIGF1dGhlbnRpY2F0aW9uIChzdGVwaGVuL3Bhc3N3b3JkKSIKK2VjaG8gIndzOi8vJHtJUH06NDU5NDIvZ3JlbWxpbiB3aXRoIGtlcmJlcm9zIGF1dGhlbnRpY2F0aW9uIChzdGVwaGVuL3Bhc3N3b3JkKSIKK2VjaG8KK2VjaG8gIlNlZSBkb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIvZG9ja2VyLWVudHJ5cG9pbnRzLnNoIGZvciB0cmFuc2NyaXB0cyBwZXIgR0xWLiIKK2VjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgogCiBjcCAqLnlhbWwgJHtUSU5LRVJQT1BfSE9NRX0vY29uZi8KIAogamF2YSAtdmVyc2lvbgogCi0vb3B0L2dyZW1saW4tc2VydmVyL2Jpbi9ncmVtbGluLXNlcnZlci5zaCBpbnN0YWxsIG9yZy5hcGFjaGUudGlua2VycG9wIGdyZW1saW4tcHl0aG9uICR7R1JFTUxJTl9TRVJWRVJfVkVSU0lPTn0KIC9vcHQvZ3JlbWxpbi1zZXJ2ZXIvYmluL2dyZW1saW4tc2VydmVyLnNoIGNvbmYvZ3JlbWxpbi1zZXJ2ZXItaW50ZWdyYXRpb24ueWFtbCAmCi1leGVjIC9vcHQvZ3JlbWxpbi1zZXJ2ZXIvYmluL2dyZW1saW4tc2VydmVyLnNoIGNvbmYvZ3JlbWxpbi1zZXJ2ZXItaW50ZWdyYXRpb24tc2VjdXJlLnlhbWwKKworL29wdC9ncmVtbGluLXNlcnZlci9iaW4vZ3JlbWxpbi1zZXJ2ZXIuc2ggY29uZi9ncmVtbGluLXNlcnZlci1pbnRlZ3JhdGlvbi1zZWN1cmUueWFtbCAmCisKK2phdmEgLWNwIC9vcHQvZ3JlbWxpbi10ZXN0L2dyZW1saW4tdGVzdC0ke0dSRU1MSU5fU0VSVkVSX1ZFUlNJT059LWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIgXAorICAgICAtRGxvZzRqLmNvbmZpZ3VyYXRpb249ImZpbGU6L29wdC9ncmVtbGluLXNlcnZlci9jb25mL2xvZzRqLXNlcnZlci5wcm9wZXJ0aWVzIiBcCisgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLktkY0ZpeHR1cmUgL29wdC9ncmVtbGluLXNlcnZlciAmCisKK2V4cG9ydCBKQVZBX09QVElPTlM9Ii1YbXM1MTJtIC1YbXg0MDk2bSAtRGphdmEuc2VjdXJpdHkua3JiNS5jb25mPS9vcHQvZ3JlbWxpbi1zZXJ2ZXIvdGFyZ2V0L2tkYy9rcmI1LmNvbmYiCitleGVjIC9vcHQvZ3JlbWxpbi1zZXJ2ZXIvYmluL2dyZW1saW4tc2VydmVyLnNoIGNvbmYvZ3JlbWxpbi1zZXJ2ZXItaW50ZWdyYXRpb24ta3JiNS55YW1sCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHJhbnNjcmlwdHMgZm9yIGNvbm5lY3RpbmcgdG8gZ3JlbWxpbi1zZXJ2ZXItdGVzdCB1c2luZyB2YXJpb3VzIEdMVidzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjZCAke0FQQUNIRV9USU5LRVJQT1B9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaXJzdCB0ZXJtaW5hbDogbG9jYXRpb24gb2YgY2xvbmVkIGdpdHJlcG8KKyMgZG9ja2VyL2dyZW1saW4tc2VydmVyLnNoCisKKyMgY2QgJHtBUEFDSEVfVElOS0VSUE9QfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2Vjb25kIHRlcm1pbmFsCisjIGV4cG9ydCBLUkI1X0NPTkZJRz1gcHdkYC9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIva3JiNS5jb25mCisjIGVjaG8gJ3Bhc3N3b3JkJyB8IGtpbml0IHN0ZXBoZW4KKyMga2xpc3QKKworIyBHcmVtbGluLUdyb292eQorIyAtLS0tLS0tLS0tLS0tLQorIyBLUkI1X09QVElPTj0iLURqYXZhLnNlY3VyaXR5LmtyYjUuY29uZj1gcHdkYC9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIva3JiNS5jb25mIgorIyBKQUFTX09QVElPTj0iLURqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnPWBwd2RgL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLWNvbnNvbGUtamFhcy5jb25mIgorIyBleHBvcnQgSkFWQV9PUFRJT05TPSIke0tSQjVfT1BUSU9OfSAke0pBQVNfT1BUSU9OfSIKKyMgY2QgZ3JlbWxpbi1jb25zb2xlL3RhcmdldC9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tY29uc29sZS0zLngueS1TTkFQU0hPVC1zdGFuZGFsb25lCisjIElmIG5lY2Vzc2FyeSAodmVyc2lvbnMgMy40LjItMy40LjYpOiBpbiBiaW4vZ3JlbWxpbi5zaCByZXBsYWNlIEpWTV9PUFRTKz0oICIke0pBVkFfT1BUSU9OU30iICkgYnkgSlZNX09QVFMrPSggJHtKQVZBX09QVElPTlN9ICkKKyMgYmluL2dyZW1saW4uc2gKKyMgZ3JlbWxpbj4gY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoIjE3Mi4xNy4wLjIiKS5wb3J0KDQ1OTQwKS5jcmVhdGUoKQorIyBncmVtbGluPiBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCgiMTcyLjE3LjAuMiIpLnBvcnQoNDU5NDEpLmNyZWRlbnRpYWxzKCJzdGVwaGVuIiwgInBhc3N3b3JkIikuY3JlYXRlKCkKKyMgZ3JlbWxpbj4gY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoIjE3Mi4xNy4wLjIiKS5wb3J0KDQ1OTQyKS5hZGRDb250YWN0UG9pbnQoImdyZW1saW4tc2VydmVyLXRlc3QiKS5wcm90b2NvbCgidGVzdC1zZXJ2aWNlIikuamFhc0VudHJ5KCJHcmVtbGluQ29uc29sZSIpLmNyZWF0ZSgpCisjIGdyZW1saW4+IGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKERyaXZlclJlbW90ZUNvbm5lY3Rpb24udXNpbmcoY2x1c3RlciwgImdtb2Rlcm4iKSkKKyMgZ3JlbWxpbj4gZy5WKCkKKworIyBHcmVtbGluLVB5dGhvbgorIyAtLS0tLS0tLS0tLS0tLQorIyBjZCBncmVtbGluLXB5dGhvbi90YXJnZXQvcHl0aG9uMworIyBzb3VyY2UgZW52L2Jpbi9hY3RpdmF0ZQorIyBweXRob24KKyMgPj4+IGZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5hbm9ueW1vdXNfdHJhdmVyc2FsIGltcG9ydCB0cmF2ZXJzYWwKKyMgPj4+IGZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLmRyaXZlcl9yZW1vdGVfY29ubmVjdGlvbiBpbXBvcnQgRHJpdmVyUmVtb3RlQ29ubmVjdGlvbgorIyA+Pj4gZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUoRHJpdmVyUmVtb3RlQ29ubmVjdGlvbignd3M6Ly8xNzIuMTcuMC4yOjQ1OTQwL2dyZW1saW4nLCdnbW9kZXJuJykpCisjID4+PiBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShEcml2ZXJSZW1vdGVDb25uZWN0aW9uKCd3czovLzE3Mi4xNy4wLjI6NDU5NDEvZ3JlbWxpbicsJ2dtb2Rlcm4nLCB1c2VybmFtZT0nc3RlcGhlbicsIHBhc3N3b3JkPSdwYXNzd29yZCcpKQorIyA+Pj4gZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUoRHJpdmVyUmVtb3RlQ29ubmVjdGlvbignd3M6Ly8xNzIuMTcuMC4yOjQ1OTQyL2dyZW1saW4nLCdnbW9kZXJuJywga2VyYmVyaXplZF9zZXJ2aWNlPSd0ZXN0LXNlcnZpY2VAZ3JlbWxpbi1zZXJ2ZXItdGVzdCcpKQorIyA+Pj4gZy5WKCkudG9MaXN0KCkKZGlmZiAtLWdpdCBhL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLWNvbnNvbGUtamFhcy5jb25mIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL2dyZW1saW4tY29uc29sZS1qYWFzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiOTJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLWNvbnNvbGUtamFhcy5jb25mCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitHcmVtbGluQ29uc29sZSB7CisgIGNvbS5zdW4uc2VjdXJpdHkuYXV0aC5tb2R1bGUuS3JiNUxvZ2luTW9kdWxlIHJlcXVpcmVkCisgIGRvTm90UHJvbXB0PXRydWUKKyAgdXNlVGlja2V0Q2FjaGU9dHJ1ZTsKK307CmRpZmYgLS1naXQgYS9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIvZ3JlbWxpbi1zZXJ2ZXItaW50ZWdyYXRpb24ta3JiNS55YW1sIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL2dyZW1saW4tc2VydmVyLWludGVncmF0aW9uLWtyYjUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmJhZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL2dyZW1saW4tc2VydmVyLWludGVncmF0aW9uLWtyYjUueWFtbApAQCAtMCwwICsxLDY2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2hvc3Q6IDAuMC4wLjAKK3BvcnQ6IDQ1OTQyCitldmFsdWF0aW9uVGltZW91dDogMzAwMDAKK2dyYXBoczogeworICBncmFwaDogY29uZi90aW5rZXJncmFwaC1lbXB0eS5wcm9wZXJ0aWVzLAorICBjbGFzc2ljOiBjb25mL3RpbmtlcmdyYXBoLWVtcHR5LnByb3BlcnRpZXMsCisgIG1vZGVybjogY29uZi90aW5rZXJncmFwaC1lbXB0eS5wcm9wZXJ0aWVzLAorICBjcmV3OiBjb25mL3RpbmtlcmdyYXBoLWVtcHR5LnByb3BlcnRpZXMsCisgIGdyYXRlZnVsOiBjb25mL3RpbmtlcmdyYXBoLWVtcHR5LnByb3BlcnRpZXMsCisgIHNpbms6IGNvbmYvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllc30KK3NjcmlwdEVuZ2luZXM6IHsKKyAgZ3JlbWxpbi1ncm9vdnk6IHsKKyAgICBwbHVnaW5zOiB7IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmpzcjIyMy5HcmVtbGluU2VydmVyR3JlbWxpblBsdWdpbjoge30sCisgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLmpzcjIyMy5UaW5rZXJHcmFwaEdyZW1saW5QbHVnaW46IHt9LAorICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyb292eUNvbXBpbGVyR3JlbWxpblBsdWdpbjoge2V4cGVjdGVkQ29tcGlsYXRpb25UaW1lOiAzMDAwMH0sCisgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5JbXBvcnRHcmVtbGluUGx1Z2luOiB7Y2xhc3NJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGhdLCBtZXRob2RJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGgjKl19LAorICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW46IHtmaWxlczogW3NjcmlwdHMvZ2VuZXJhdGUtYWxsLmdyb292eV19fX19CitzZXJpYWxpemVyczoKKyAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYxZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjFkMF0sIGN1c3RvbTogW2dyb292eS5qc29uLkpzb25CdWlsZGVyO29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5Kc29uQnVpbGRlckdyeW9TZXJpYWxpemVyXX19CisgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdLCBjdXN0b206IFtncm9vdnkuanNvbi5Kc29uQnVpbGRlcjtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuSnNvbkJ1aWxkZXJHcnlvU2VyaWFsaXplcl19fQorICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b0xpdGVNZXNzYWdlU2VyaWFsaXplclYxZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjFkMF0sIGN1c3RvbTogW2dyb292eS5qc29uLkpzb25CdWlsZGVyO29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5Kc29uQnVpbGRlckdyeW9TZXJpYWxpemVyXX19CisgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWMWQwLCBjb25maWc6IHsgc2VyaWFsaXplUmVzdWx0VG9TdHJpbmc6IHRydWV9fQorICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nOiB0cnVlfX0KKyAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19CisgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjJkMCwgY29uZmlnOiB7IGlvUmVnaXN0cmllczogW29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlcklvUmVnaXN0cnlWMmQwXSB9fQorICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplckdyZW1saW5WMWQwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYxZDBdIH19CisgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEgfQorICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLCBjb25maWc6IHsgc2VyaWFsaXplUmVzdWx0VG9TdHJpbmc6IHRydWUgfX0KK3Byb2Nlc3NvcnM6CisgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLm9wLnNlc3Npb24uU2Vzc2lvbk9wUHJvY2Vzc29yLCBjb25maWc6IHsgc2Vzc2lvblRpbWVvdXQ6IDI4ODAwMDAwIH19CisgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLm9wLnN0YW5kYXJkLlN0YW5kYXJkT3BQcm9jZXNzb3IsIGNvbmZpZzoge319CittZXRyaWNzOiB7CisgIHNsZjRqUmVwb3J0ZXI6IHtlbmFibGVkOiB0cnVlLCBpbnRlcnZhbDogMTgwMDAwfX0KK3N0cmljdFRyYW5zYWN0aW9uTWFuYWdlbWVudDogZmFsc2UKK2lkbGVDb25uZWN0aW9uVGltZW91dDogMAora2VlcEFsaXZlSW50ZXJ2YWw6IDAKK21heEluaXRpYWxMaW5lTGVuZ3RoOiA0MDk2CittYXhIZWFkZXJTaXplOiA4MTkyCittYXhDaHVua1NpemU6IDgxOTIKK21heENvbnRlbnRMZW5ndGg6IDEwMDAwMDAKK21heEFjY3VtdWxhdGlvbkJ1ZmZlckNvbXBvbmVudHM6IDEwMjQKK3Jlc3VsdEl0ZXJhdGlvbkJhdGNoU2l6ZTogNjQKK3dyaXRlQnVmZmVyTG93V2F0ZXJNYXJrOiAzMjc2OAord3JpdGVCdWZmZXJIaWdoV2F0ZXJNYXJrOiA2NTUzNgorYXV0aGVudGljYXRpb246IHsKKyAgYXV0aGVudGljYXRvcjogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuYXV0aC5LcmI1QXV0aGVudGljYXRvciwKKyAgY29uZmlnOiB7CisgICAgcHJpbmNpcGFsOiB0ZXN0LXNlcnZpY2UvZ3JlbWxpbi1zZXJ2ZXItdGVzdEBURVNULkNPTSwKKyAgICBrZXl0YWI6IC9vcHQvZ3JlbWxpbi1zZXJ2ZXIvdGFyZ2V0L2tkYy90ZXN0LXNlcnZpY2Uua2V5dGFifX0KZGlmZiAtLWdpdCBhL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLXNlcnZlci1pbnRlZ3JhdGlvbi1zZWN1cmUueWFtbCBiL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLXNlcnZlci1pbnRlZ3JhdGlvbi1zZWN1cmUueWFtbAppbmRleCBjNDg5ZTA3Li4xY2QzMTU2IDEwMDY0NAotLS0gYS9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIvZ3JlbWxpbi1zZXJ2ZXItaW50ZWdyYXRpb24tc2VjdXJlLnlhbWwKKysrIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL2dyZW1saW4tc2VydmVyLWludGVncmF0aW9uLXNlY3VyZS55YW1sCkBAIC0xNyw3ICsxNyw3IEBACiAKIGhvc3Q6IDAuMC4wLjAKIHBvcnQ6IDQ1OTQxCi1zY3JpcHRFdmFsdWF0aW9uVGltZW91dDogMzAwMDAKK2V2YWx1YXRpb25UaW1lb3V0OiAzMDAwMAogZ3JhcGhzOiB7CiAgIGdyYXBoOiBjb25mL3RpbmtlcmdyYXBoLWVtcHR5LnByb3BlcnRpZXMsCiAgIGNsYXNzaWM6IGNvbmYvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllcywKQEAgLTMxLDEwICszMSw3IEBACiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLmpzcjIyMy5UaW5rZXJHcmFwaEdyZW1saW5QbHVnaW46IHt9LAogICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyb292eUNvbXBpbGVyR3JlbWxpblBsdWdpbjoge2V4cGVjdGVkQ29tcGlsYXRpb25UaW1lOiAzMDAwMH0sCiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5JbXBvcnRHcmVtbGluUGx1Z2luOiB7Y2xhc3NJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGhdLCBtZXRob2RJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGgjKl19LAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW46IHtmaWxlczogW3NjcmlwdHMvZ2VuZXJhdGUtYWxsLmdyb292eV19fX0sCi0gIGdyZW1saW4tanl0aG9uOiB7fSwKLSAgZ3JlbWxpbi1weXRob246IHt9Ci19CisgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5TY3JpcHRGaWxlR3JlbWxpblBsdWdpbjoge2ZpbGVzOiBbc2NyaXB0cy9nZW5lcmF0ZS1hbGwuZ3Jvb3Z5XX19fX0KIHNlcmlhbGl6ZXJzOgogICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjFkMCwgY29uZmlnOiB7IGlvUmVnaXN0cmllczogW29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlcklvUmVnaXN0cnlWMWQwXSwgY3VzdG9tOiBbZ3Jvb3Z5Lmpzb24uSnNvbkJ1aWxkZXI7b3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkpzb25CdWlsZGVyR3J5b1NlcmlhbGl6ZXJdfX0KICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0sIGN1c3RvbTogW2dyb292eS5qc29uLkpzb25CdWlsZGVyO29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5Kc29uQnVpbGRlckdyeW9TZXJpYWxpemVyXX19CmRpZmYgLS1naXQgYS9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIvZ3JlbWxpbi1zZXJ2ZXItaW50ZWdyYXRpb24ueWFtbCBiL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLXNlcnZlci1pbnRlZ3JhdGlvbi55YW1sCmluZGV4IDdjNTQ0NWEuLjEzYzJkNmMgMTAwNjQ0Ci0tLSBhL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLXNlcnZlci1pbnRlZ3JhdGlvbi55YW1sCisrKyBiL2RvY2tlci9ncmVtbGluLXNlcnZlci9ncmVtbGluLXNlcnZlci1pbnRlZ3JhdGlvbi55YW1sCkBAIC0xNyw3ICsxNyw3IEBACiAKIGhvc3Q6IDAuMC4wLjAKIHBvcnQ6IDQ1OTQwCi1zY3JpcHRFdmFsdWF0aW9uVGltZW91dDogMzAwMDAKK2V2YWx1YXRpb25UaW1lb3V0OiAzMDAwMAogZ3JhcGhzOiB7CiAgIGdyYXBoOiBjb25mL3RpbmtlcmdyYXBoLWVtcHR5LnByb3BlcnRpZXMsCiAgIGNsYXNzaWM6IGNvbmYvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllcywKQEAgLTMxLDEwICszMSw3IEBACiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLmpzcjIyMy5UaW5rZXJHcmFwaEdyZW1saW5QbHVnaW46IHt9LAogICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyb292eUNvbXBpbGVyR3JlbWxpblBsdWdpbjoge2V4cGVjdGVkQ29tcGlsYXRpb25UaW1lOiAzMDAwMH0sCiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5JbXBvcnRHcmVtbGluUGx1Z2luOiB7Y2xhc3NJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGhdLCBtZXRob2RJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGgjKl19LAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW46IHtmaWxlczogW3NjcmlwdHMvZ2VuZXJhdGUtYWxsLmdyb292eV19fX0sCi0gIGdyZW1saW4tanl0aG9uOiB7fSwKLSAgZ3JlbWxpbi1weXRob246IHt9Ci19CisgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5TY3JpcHRGaWxlR3JlbWxpblBsdWdpbjoge2ZpbGVzOiBbc2NyaXB0cy9nZW5lcmF0ZS1hbGwuZ3Jvb3Z5XX19fX0KIHNlcmlhbGl6ZXJzOgogICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjFkMCwgY29uZmlnOiB7IGlvUmVnaXN0cmllczogW29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlcklvUmVnaXN0cnlWMWQwXSwgY3VzdG9tOiBbZ3Jvb3Z5Lmpzb24uSnNvbkJ1aWxkZXI7b3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkpzb25CdWlsZGVyR3J5b1NlcmlhbGl6ZXJdfX0KICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0sIGN1c3RvbTogW2dyb292eS5qc29uLkpzb25CdWlsZGVyO29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5Kc29uQnVpbGRlckdyeW9TZXJpYWxpemVyXX19CmRpZmYgLS1naXQgYS9kb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIva3JiNS5jb25mIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL2tyYjUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjljMzIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9ja2VyL2dyZW1saW4tc2VydmVyL2tyYjUuY29uZgpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitbbGliZGVmYXVsdHNdCisgICAga2RjX3JlYWxtID0gVEVTVC5DT00KKyAgICBkZWZhdWx0X3JlYWxtID0gVEVTVC5DT00KKyAgICB1ZHBfcHJlZmVyZW5jZV9saW1pdCA9IDQwOTYKKyAgICBrZGNfdGNwX3BvcnQgPSA0NTg4CisgICAga2RjX3VkcF9wb3J0ID0gNDU4OAorCitbcmVhbG1zXQorICAgIFRFU1QuQ09NID0geworICAgICAgICBrZGMgPSAxNzIuMTcuMC4yOjQ1ODgKKyAgICB9CmRpZmYgLS1naXQgYS9kb2NrZXIvc2NyaXB0cy9idWlsZC5zaCBiL2RvY2tlci9zY3JpcHRzL2J1aWxkLnNoCmluZGV4IGJmMGRmMGQuLjcyMjJhNzMgMTAwNzU1Ci0tLSBhL2RvY2tlci9zY3JpcHRzL2J1aWxkLnNoCisrKyBiL2RvY2tlci9zY3JpcHRzL2J1aWxkLnNoCkBAIC03Niw3ICs3Niw3IEBACiAgIGNwIHNldHRpbmdzLnhtbCB+Ly5tMi8KIGZpCiAKLWV4cG9ydCBKQVZBX0hPTUU9L3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CitleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKIAogbXZuIGNsZWFuIGluc3RhbGwgcHJvY2Vzcy1yZXNvdXJjZXMgLS1iYXRjaC1tb2RlICR7VElOS0VSUE9QX0JVSUxEX09QVElPTlN9IHx8IGV4aXQgMQogWyAteiAiJHtCVUlMRF9KQVZBX0RPQ1N9IiBdIHx8IG12biBwcm9jZXNzLXJlc291cmNlcyAtRGphdmFkb2MgfHwgZXhpdCAxCmRpZmYgLS1naXQgYS9kb2NzL3ByZXByb2Nlc3Nvci9hd2svaW5pdC1jb2RlLWJsb2Nrcy5hd2sgYi9kb2NzL3ByZXByb2Nlc3Nvci9hd2svaW5pdC1jb2RlLWJsb2Nrcy5hd2sKaW5kZXggNDY2Y2I5MC4uYzllYjUyOCAxMDA2NDQKLS0tIGEvZG9jcy9wcmVwcm9jZXNzb3IvYXdrL2luaXQtY29kZS1ibG9ja3MuYXdrCisrKyBiL2RvY3MvcHJlcHJvY2Vzc29yL2F3ay9pbml0LWNvZGUtYmxvY2tzLmF3awpAQCAtNTAsNDggKzUwLDYgQEAKICAgICBwcmludCAiZiA9IG5ldyBGaWxlKCcvdG1wL3RpbmtlcmdyYXBoLmtyeW8nKSIKICAgICBwcmludCAiaWYgKGYuZXhpc3RzKCkpIGYuZGVsZXRlRGlyKCkiCiAgICAgcHJpbnQgIjpzZXQgbWF4LWl0ZXJhdGlvbiAxMDAiCi0gICAgaWYgKGxhbmcgPT0gInB5dGhvbiIpIHsKLSAgICAgIHByaW50ICJpbXBvcnQgc3RhdGljIGphdmF4LnNjcmlwdC5TY3JpcHRDb250ZXh0LioiCi0gICAgICBwcmludCAiaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHl0aG9uLmpzcjIyMy5KeXRob25UcmFuc2xhdG9yIgotICAgICAgcHJpbnQgImp5dGhvbiA9IG5ldyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5qc3IyMjMuR3JlbWxpbkp5dGhvblNjcmlwdEVuZ2luZSgpIgotICAgICAgcHJpbnQgImp5dGhvbi5ldmFsKCdpbXBvcnQgb3MnKSIKLSAgICAgIHByaW50ICJqeXRob24uZXZhbCgnb3MuY2hkaXIoXCIiIFRQX0hPTUUgIlwiKScpIgotICAgICAgcHJpbnQgImp5dGhvbi5ldmFsKCdpbXBvcnQgc3lzJykiCi0gICAgICBwcmludCAianl0aG9uLmV2YWwoJ3N5cy5wYXRoLmFwcGVuZChcIiIgUFlUSE9OUEFUSCAiXCIpJykiCi0gICAgICBwcmludCAianl0aG9uLmV2YWwoJ3N5cy5wYXRoLmFwcGVuZChcIiIgVFBfSE9NRSAiL2dyZW1saW4tcHl0aG9uL3RhcmdldC9weXRob24yL2Vudi9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXNcIiknKSIKLSAgICAgIHByaW50ICJqeXRob24uZXZhbCgnZnJvbSBncmVtbGluX3B5dGhvbiBpbXBvcnQgc3RhdGljcycpIgotICAgICAgcHJpbnQgImp5dGhvbi5ldmFsKCdmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCAqJykiCi0gICAgICBwcmludCAianl0aG9uLmV2YWwoJ2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5zdHJhdGVnaWVzIGltcG9ydCAqJykiCi0gICAgICBwcmludCAianl0aG9uLmV2YWwoJ2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBHcmFwaCcpIgotICAgICAgcHJpbnQgImp5dGhvbi5ldmFsKCdmcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYzZDAgaW1wb3J0IEdyYXBoU09OV3JpdGVyJykiCi0gICAgICBwcmludCAianl0aG9uLmV2YWwoJ2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMCBpbXBvcnQgR3JhcGhTT05SZWFkZXInKSIKLSAgICAgICMgcHJpbnQgImp5dGhvbi5ldmFsKCdmcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvbiBpbXBvcnQgc2VyaWFsaXplcnMnKSIKLSAgICAgICMgcHJpbnQgImp5dGhvbi5ldmFsKCdmcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb24gaW1wb3J0IERyaXZlclJlbW90ZUNvbm5lY3Rpb24nKSIKLSAgICAgIHByaW50ICJqeXRob24uZXZhbCgnc3RhdGljcy5sb2FkX3N0YXRpY3MoZ2xvYmFscygpKScpIgotICAgICAgcHJpbnQgImp5dGhvbkJpbmRpbmdzID0ganl0aG9uLmNyZWF0ZUJpbmRpbmdzKCkiCi0gICAgICBwcmludCAianl0aG9uQmluZGluZ3MucHV0KCdnJywganl0aG9uLmV2YWwoJ0dyYXBoKCkudHJhdmVyc2FsKCknKSkiCi0gICAgICBwcmludCAianl0aG9uQmluZGluZ3MucHV0KCdoJywgZykiCi0gICAgICBwcmludCAianl0aG9uLmdldENvbnRleHQoKS5zZXRCaW5kaW5ncyhqeXRob25CaW5kaW5ncywgR0xPQkFMX1NDT1BFKSIKLSAgICAgIHByaW50ICJncm9vdnkgPSBuZXcgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUoKSIKLSAgICAgIHByaW50ICJncm9vdnlCaW5kaW5ncyA9IGdyb292eS5jcmVhdGVCaW5kaW5ncygpIgotICAgICAgcHJpbnQgImdyb292eUJpbmRpbmdzLnB1dCgnZycsIGcpIgotICAgICAgcHJpbnQgImdyb292eUJpbmRpbmdzLnB1dCgnVGlua2VyR3JhcGhDb21wdXRlcicsIFRpbmtlckdyYXBoQ29tcHV0ZXIpIgotICAgICAgcHJpbnQgImdyb292eS5nZXRDb250ZXh0KCkuc2V0QmluZGluZ3MoZ3Jvb3Z5QmluZGluZ3MsIEdMT0JBTF9TQ09QRSkiCi0gICAgICBwcmludCAiZGVmIHByb2Nlc3NUcmF2ZXJzYWwodCwganl0aG9uLCBncm9vdnkpIHsiCi0gICAgICBwcmludCAiICBqeXRob24uZ2V0Q29udGV4dCgpLmdldEJpbmRpbmdzKEdMT0JBTF9TQ09QRSkucHV0KCdqJywganl0aG9uLmV2YWwodC5yZXBsYWNlKCcudG9MaXN0KCknLCcnKSkpIgotICAgICAgcHJpbnQgIiAgaWYoanl0aG9uLmV2YWwoJ2lzaW5zdGFuY2UoaiwgVHJhdmVyc2FsKScpKSB7IgotICAgICAgcHJpbnQgIiAgICBtYXBwZXIgPSBHcmFwaFNPTk1hcHBlci5idWlsZCgpLnZlcnNpb24oR3JhcGhTT05WZXJzaW9uLlYyXzApLmNyZWF0ZSgpLmNyZWF0ZU1hcHBlcigpIgotICAgICAgcHJpbnQgIiAgICBieXRlY29kZSA9IG1hcHBlci5yZWFkVmFsdWUoanl0aG9uLmV2YWwoJ0dyYXBoU09OV3JpdGVyKCkud3JpdGVPYmplY3QoaiknKS50b1N0cmluZygpLCBCeXRlY29kZS5jbGFzcykiCi0gICAgICBwcmludCAiICAgIGxhbmd1YWdlID0gQnl0ZWNvZGVIZWxwZXIuZ2V0TGFtYmRhTGFuZ3VhZ2UoYnl0ZWNvZGUpLm9yRWxzZSgnZ3JlbWxpbi1ncm9vdnknKSIKLSAgICAgIHByaW50ICIgICAgcmVzdWx0ID0gbGFuZ3VhZ2UuZXF1YWxzKCdncmVtbGluLWdyb292eScpID8gZ3Jvb3Z5LmV2YWwob3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyb292eVRyYW5zbGF0b3Iub2YoXCJnXCIpLnRyYW5zbGF0ZShieXRlY29kZSkgKyAnLnRvTGlzdCgpJykudG9TdHJpbmcoKSA6IGp5dGhvbi5ldmFsKEp5dGhvblRyYW5zbGF0b3Iub2YoXCJoXCIpLnRyYW5zbGF0ZShieXRlY29kZSkgKyAnLnRvTGlzdCgpJykudG9TdHJpbmcoKSIKLSAgICAgIHByaW50ICIgICAganl0aG9uLmdldENvbnRleHQoKS5nZXRCaW5kaW5ncyhHTE9CQUxfU0NPUEUpLnB1dCgnanNvbicsIG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcocmVzdWx0KSkiCi0gICAgICBwcmludCAiICAgIHJldHVybiBqeXRob24uZXZhbCgnR3JhcGhTT05SZWFkZXIoKS5yZWFkT2JqZWN0KGpzb24pJykudG9TdHJpbmcoKSIKLSAgICAgIHByaW50ICIgIH0gZWxzZSB7IgotICAgICAgcHJpbnQgIiAgICBqID0ganl0aG9uLmdldENvbnRleHQoKS5nZXRCaW5kaW5ncyhHTE9CQUxfU0NPUEUpLmdldCgnaicpIgotICAgICAgcHJpbnQgIiAgICByZXR1cm4gbnVsbCA9PSBqID8gJ251bGwnIDogai50b1N0cmluZygpIgotICAgICAgcHJpbnQgIiAgfSIKLSAgICAgIHByaW50ICJ9IgotICAgIH0KICAgfQogICBwcmludCAiJy1JR05PUkUnIgogfQpAQCAtOTksOSArNTcsNiBAQAogIS9ecGJcKFswLTldKlwpOyAnXFtncmVtbGluLS8gewogICBpZiAoZGVsaW1pdGVyID09IDIgJiYgISgkMCB+IC9ecGJcKFswLTldKlwpOyAnLS0tLScvKSkgewogICAgIHN3aXRjaCAobGFuZykgewotICAgICAgY2FzZSAicHl0aG9uIjoKLSAgICAgICAgcHJpbnQgInByb2Nlc3NUcmF2ZXJzYWwoXCJcIlwiIiBnZW5zdWIoIkJpbmRpbmdzXFwub2ZcXCgnaWQnLChbMC05XSspXFwpIiwgIlxcMSIsICJnIikgIlwiXCJcIiwganl0aG9uLCBncm9vdnkpIgotICAgICAgICBicmVhawogICAgICAgZGVmYXVsdDoKICAgICAgICAgcHJpbnQKICAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2RvY3MvcHJlcHJvY2Vzc29yL2F3ay9sYW5ndWFnZS12YXJpYW50cy5hd2sgYi9kb2NzL3ByZXByb2Nlc3Nvci9hd2svbGFuZ3VhZ2UtdmFyaWFudHMuYXdrCmluZGV4IGQ2NjQ1ZDEuLmU4NDk0NDQgMTAwNjQ0Ci0tLSBhL2RvY3MvcHJlcHJvY2Vzc29yL2F3ay9sYW5ndWFnZS12YXJpYW50cy5hd2sKKysrIGIvZG9jcy9wcmVwcm9jZXNzb3IvYXdrL2xhbmd1YWdlLXZhcmlhbnRzLmF3awpAQCAtMzYsMTMgKzM2LDYgQEAKIAogeyBpZiAoaW5Db2RlQmxvY2spIHsKICAgICBzd2l0Y2ggKGxhbmcpIHsKLSAgICAgIGNhc2UgInB5dGhvbiI6Ci0gICAgICAgIGdzdWIoL15ncmVtbGluPi8sICI+Pj4iKQotICAgICAgICBnc3ViKC9ePT0+LywgIiIpCi0gICAgICAgICQwID0gZ2Vuc3ViKC9wcm9jZXNzVHJhdmVyc2FsXCgiIiIoLiopIiIiXCwganl0aG9uLCBncm9vdnkpLywgIlxcMSIsIDEpCi0gICAgICAgICQwID0gZ2Vuc3ViKCJnXFwuVlxcKChbXlxcKV0rKSIsICJnLlYoQmluZGluZ3NcXC5vZignaWQnLFxcMSkiLCAiZyIpCi0gICAgICAgIHByaW50IGdlbnN1YigiZ1xcLlZcXChCaW5kaW5ncy5vZlxcKCdpZCcsKEJpbmRpbmdzLm9mXFwoW15cXCldK1xcKSlcXClcXCkiLCAiZy5WKFxcMSkiLCAiZyIpCi0gICAgICAgIGJyZWFrCiAgICAgICBkZWZhdWx0OgogICAgICAgICBwcmludAogICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvZG9jcy9wcmVwcm9jZXNzb3IvYXdrL3ByZXBhcmUuYXdrIGIvZG9jcy9wcmVwcm9jZXNzb3IvYXdrL3ByZXBhcmUuYXdrCmluZGV4IDQxNWE2YjUuLjUyYTE0Y2MgMTAwNjQ0Ci0tLSBhL2RvY3MvcHJlcHJvY2Vzc29yL2F3ay9wcmVwYXJlLmF3aworKysgYi9kb2NzL3ByZXByb2Nlc3Nvci9hd2svcHJlcGFyZS5hd2sKQEAgLTcyLDkgKzcyLDYgQEAKICAgc3BsaXQoYiwgbCwgIiwiKQogICBsYW5nID0gbFsxXQogICBzd2l0Y2ggKGxhbmcpIHsKLSAgICBjYXNlICJweXRob24iOgotICAgICAgYyA9ICIjIgotICAgICAgYnJlYWsKICAgICBkZWZhdWx0OgogICAgICAgYyA9ICIvLyIKICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9kb2NzL3ByZXByb2Nlc3Nvci9hd2svdGFiaWZ5LmF3ayBiL2RvY3MvcHJlcHJvY2Vzc29yL2F3ay90YWJpZnkuYXdrCmluZGV4IGZjMDczMzEuLmZhMjJlZDUgMTAwNjQ0Ci0tLSBhL2RvY3MvcHJlcHJvY2Vzc29yL2F3ay90YWJpZnkuYXdrCisrKyBiL2RvY3MvcHJlcHJvY2Vzc29yL2F3ay90YWJpZnkuYXdrCkBAIC0xMTEsOSArMTExLDYgQEAKICAgICAgIH0KICAgICAgIHRhYnNbaV0gPSBsYW5nCiAgICAgICBzd2l0Y2ggKGxhbmcpIHsKLSAgICAgICAgY2FzZSAicHl0aG9uIjoKLSAgICAgICAgICBjID0gIiMiCi0gICAgICAgICAgYnJlYWsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBjID0gIi8vIgogICAgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9kb2NzL3ByZXByb2Nlc3Nvci9pbnN0YWxsLXBsdWdpbnMuc2ggYi9kb2NzL3ByZXByb2Nlc3Nvci9pbnN0YWxsLXBsdWdpbnMuc2gKaW5kZXggNTg1NWU5Mi4uYmE4ODIxMyAxMDA3NTUKLS0tIGEvZG9jcy9wcmVwcm9jZXNzb3IvaW5zdGFsbC1wbHVnaW5zLnNoCisrKyBiL2RvY3MvcHJlcHJvY2Vzc29yL2luc3RhbGwtcGx1Z2lucy5zaApAQCAtNTIsOSArNTIsNiBAQAogICAoKGkrKykpCiBkb25lCiAKLWVjaG8gImluc3RhbGxQbHVnaW4obmV3IEFydGlmYWN0KFwib3JnLmFwYWNoZS50aW5rZXJwb3BcIiwgXCJncmVtbGluLXB5dGhvblwiLCBcIiR7VFBfVkVSU0lPTn1cIikpIiA+PiAke0lOU1RBTExfRklMRX0KLWVjaG8gImdyZW1saW4tcHl0aG9uIiA+PiAke1RNUF9ESVJ9L3BsdWdpbnMuZGlyCi0KIGVjaG8gIlN5c3RlbS5leGl0KDApIiA+PiAke0lOU1RBTExfRklMRX0KIGVjaG8gLW5lICIgKiB0aW5rZXJwb3Atc3VnYXIgLi4uICIKIApkaWZmIC0tZ2l0IGEvZG9jcy9wcmVwcm9jZXNzb3IvcHJlcHJvY2Vzcy1maWxlLnNoIGIvZG9jcy9wcmVwcm9jZXNzb3IvcHJlcHJvY2Vzcy1maWxlLnNoCmluZGV4IGRiZWYyMmYuLjlhZTQzYzIgMTAwNzU1Ci0tLSBhL2RvY3MvcHJlcHJvY2Vzc29yL3ByZXByb2Nlc3MtZmlsZS5zaAorKysgYi9kb2NzL3ByZXByb2Nlc3Nvci9wcmVwcm9jZXNzLWZpbGUuc2gKQEAgLTEzMyw3ICsxMzMsNyBAQAogICBzZWQgJ3MvXHQvICAgIC9nJyAke2lucHV0fSB8CiAgIGF3ayAtZiAke0FXS19TQ1JJUFRTfS90YWJpZnkuYXdrIHwKICAgYXdrIC1mICR7QVdLX1NDUklQVFN9L3ByZXBhcmUuYXdrIHwKLSAgYXdrIC1mICR7QVdLX1NDUklQVFN9L2luaXQtY29kZS1ibG9ja3MuYXdrIC12IFRQX0hPTUU9IiR7VFBfSE9NRX0iIC12IFBZVEhPTlBBVEg9IiR7VFBfSE9NRX0vZ3JlbWxpbi1weXRob24vdGFyZ2V0L2NsYXNzZXMvTGliIiB8CisgIGF3ayAtZiAke0FXS19TQ1JJUFRTfS9pbml0LWNvZGUtYmxvY2tzLmF3ayAtdiBUUF9IT01FPSIke1RQX0hPTUV9IiB8CiAgIGF3ayAtZiAke0FXS19TQ1JJUFRTfS9wcm9ncmVzc2Jhci5hd2sgLXYgdHBsPSR7QVdLX1NDUklQVFN9L3Byb2dyZXNzYmFyLmdyb292eS50ZW1wbGF0ZSB8CiAgIEhBRE9PUF9HUkVNTElOX0xJQlM9IiR7Q09OU09MRV9IT01FfS9leHQvdGlua2VyZ3JhcGgtZ3JlbWxpbi9saWIiIGJpbi9ncmVtbGluLnNoIHwgJHtUUF9IT01FfS9kb2NzL3ByZXByb2Nlc3Nvci9jb250cm9sLWNoYXJhY3RlcnMuc2ggfAogICAke2xifSBhd2sgLWYgJHtBV0tfU0NSSVBUU30vaWdub3JlLmF3ayAgIHwKZGlmZiAtLWdpdCBhL2RvY3Mvc2l0ZS9ob21lL2Rvd25sb2Fkcy5odG1sIGIvZG9jcy9zaXRlL2hvbWUvZG93bmxvYWRzLmh0bWwKaW5kZXggZjg5NjYxYi4uOGZmOTdmMCAxMDA2NDQKLS0tIGEvZG9jcy9zaXRlL2hvbWUvZG93bmxvYWRzLmh0bWwKKysrIGIvZG9jcy9zaXRlL2hvbWUvZG93bmxvYWRzLmh0bWwKQEAgLTE4LDQ3ICsxOCw0NyBAQAogIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgPGgzPkRvd25sb2FkIEFwYWNoZSBUaW5rZXJQb3AmdHJhZGU7PC9oMz4KICAgICA8cD48aW1nIHNyYz0iaW1nL2dyZW1saW4tZG93bmxvYWQucG5nIiAgc3R5bGU9ImZsb2F0OnJpZ2h0O3dpZHRoOjE1MHB4O3BhZGRpbmc6MTBweDsiLz5BcGFjaGUgVGlua2VyUG9wIHByb3ZpZGVzIHRocmVlIHBhY2thZ2VkIGRvd25sb2FkcyBwZXIgcmVsZWFzZSB2ZXJzaW9uLiBUaGUKLSAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1jb25zb2xlIj5HcmVtbGluIENvbnNvbGU8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1zZXJ2ZXIiPkdyZW1saW4gU2VydmVyPC9hPgorICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1jb25zb2xlIj5HcmVtbGluIENvbnNvbGU8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tc2VydmVyIj5HcmVtbGluIFNlcnZlcjwvYT4KICAgICAgICBkb3dubG9hZHMgYXJlIGJpbmFyeSBkaXN0cmlidXRpb25zLCB3aGljaCBjb250YWluIHByZS1wYWNrYWdlZCB2ZXJzaW9ucyBvZiB0aGVzZSBpbXBvcnRhbnQgVGlua2VyUG9wIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBkZXNpZ25lZCB0byB3b3JrIG91dC1vZi10aGUtYm94CiAgICAgICAgd2hlbiB1bnBhY2thZ2VkLiBUaGUgc291cmNlIGRpc3RyaWJ1dGlvbiBpcyBhIHNuYXBzaG90IG9mIHRoZSBzb3VyY2UgY29kZSBhbmQgZmlsZXMgdXNlZCBpbiB0aGUgYnVpbGRpbmcgb2YgdGhvc2UgIGJpbmFyeSBkaXN0cmlidXRpb25zLjwvcD4KICAgICA8aDQ+Q3VycmVudCBSZWxlYXNlczwvaDQ+CiAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CiAgICAgICAgIDx0cj4KICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPjMuNC4yPC9zdHJvbmc+IChsYXRlc3QsIHN0YWJsZSkKKyAgICAgICAgICAgICAgICA8c3Ryb25nPjMuNC44PC9zdHJvbmc+IChsYXRlc3QsIHN0YWJsZSkKICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgMjgtTWF5LTIwMTkKKyAgICAgICAgICAgICAgICAzLUF1Zy0yMDIwCiAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGlua2VycG9wL2Jsb2IvMy40LjIvQ0hBTkdFTE9HLmFzY2lpZG9jI3JlbGVhc2UtMy00LTIiPnJlbGVhc2Ugbm90ZXM8L2E+IHwKLSAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8zLjQuMi91cGdyYWRlLyNfdGlua2VycG9wXzNfNF8yIj51cGdyYWRlPC9hPiB8Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvMy40LjIvIj5kb2N1bWVudGF0aW9uPC9hPiB8Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NvbnRyaWJ1dG9ycy0zXzRfMiI+Y29udHJpYnV0b3JzPC9hPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGlua2VycG9wL2Jsb2IvMy40LjgvQ0hBTkdFTE9HLmFzY2lpZG9jI3JlbGVhc2UtMy00LTgiPnJlbGVhc2Ugbm90ZXM8L2E+IHwKKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvMy40LjgvdXBncmFkZS8jX3RpbmtlcnBvcF8zXzRfOCI+dXBncmFkZTwvYT4gfAorICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8zLjQuOC8iPmRvY3VtZW50YXRpb248L2E+IHwKKyAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29udHJpYnV0b3JzLTNfNF84Ij5jb250cmlidXRvcnM8L2E+CiAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmx1YS90aW5rZXJwb3AvMy40LjIvYXBhY2hlLXRpbmtlcnBvcC1ncmVtbGluLWNvbnNvbGUtMy40LjItYmluLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R3JlbWxpbiBDb25zb2xlIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjQuMi9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tc2VydmVyLTMuNC4yLWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gU2VydmVyIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjQuMi9hcGFjaGUtdGlua2VycG9wLTMuNC4yLXNyYy56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPlNvdXJjZSA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZC1hbHQiPjwvc3Bhbj48L2E+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmx1YS90aW5rZXJwb3AvMy40LjgvYXBhY2hlLXRpbmtlcnBvcC1ncmVtbGluLWNvbnNvbGUtMy40LjgtYmluLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R3JlbWxpbiBDb25zb2xlIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjQuOC9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tc2VydmVyLTMuNC44LWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gU2VydmVyIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjQuOC9hcGFjaGUtdGlua2VycG9wLTMuNC44LXNyYy56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPlNvdXJjZSA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZC1hbHQiPjwvc3Bhbj48L2E+CiAgICAgICAgICAgICA8L3RkPgogICAgICAgICA8L3RyPgogICAgICAgICA8dHI+CiAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz4zLjMuNzwvc3Ryb25nPiAobWFpbnRlbmFuY2UpCisgICAgICAgICAgICAgICAgPHN0cm9uZz4zLjMuMTE8L3N0cm9uZz4gKG1haW50ZW5hbmNlKQogICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAyOC1NYXktMjAxOQorICAgICAgICAgICAgICAgIDEtSnVuLTIwMjAKICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aW5rZXJwb3AvYmxvYi8zLjMuNy9DSEFOR0VMT0cuYXNjaWlkb2MjcmVsZWFzZS0zLTMtNyI+cmVsZWFzZSBub3RlczwvYT4gfAotICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzLzMuMy43L3VwZ3JhZGUvI190aW5rZXJwb3BfM18zXzciPnVwZ3JhZGU8L2E+IHwKLSAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8zLjMuNy8iPmRvY3VtZW50YXRpb248L2E+IHwKLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29udHJpYnV0b3JzLTNfM183Ij5jb250cmlidXRvcnM8L2E+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aW5rZXJwb3AvYmxvYi8zLjMuMTEvQ0hBTkdFTE9HLmFzY2lpZG9jI3JlbGVhc2UtMy0zLTExIj5yZWxlYXNlIG5vdGVzPC9hPiB8CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzLzMuMy4xMS91cGdyYWRlLyNfdGlua2VycG9wXzNfM18xMSI+dXBncmFkZTwvYT4gfAorICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8zLjMuMTEvIj5kb2N1bWVudGF0aW9uPC9hPiB8CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NvbnRyaWJ1dG9ycy0zXzNfMTEiPmNvbnRyaWJ1dG9yczwvYT4KICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjMuNy9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tY29uc29sZS0zLjMuNy1iaW4uemlwIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HcmVtbGluIENvbnNvbGUgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tZG93bmxvYWQtYWx0Ij48L3NwYW4+PC9hPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5sdWEvdGlua2VycG9wLzMuMy43L2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1zZXJ2ZXItMy4zLjctYmluLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R3JlbWxpbiBTZXJ2ZXIgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tZG93bmxvYWQtYWx0Ij48L3NwYW4+PC9hPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5sdWEvdGlua2VycG9wLzMuMy43L2FwYWNoZS10aW5rZXJwb3AtMy4zLjctc3JjLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+U291cmNlIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjMuMTEvYXBhY2hlLXRpbmtlcnBvcC1ncmVtbGluLWNvbnNvbGUtMy4zLjExLWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gQ29uc29sZSA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZC1hbHQiPjwvc3Bhbj48L2E+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmx1YS90aW5rZXJwb3AvMy4zLjExL2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1zZXJ2ZXItMy4zLjExLWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gU2VydmVyIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjMuMTEvYXBhY2hlLXRpbmtlcnBvcC0zLjMuMTEtc3JjLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+U291cmNlIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KQEAgLTY3LDggKzY3LDE4IEBACiAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCByb3ciPgogICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMyI+CiAgICAgPHNlbGVjdCBpZD0iZHJvcGRvd25BcmNoaXZlcyIgY2xhc3M9ImZvcm0tY29udHJvbCI+Ci0gICAgICAgIDxvcHRpb24gc2VsZWN0ZWQ9InNlbGVjdGVkIj4zLjQuMSAoMTgtTWFyLTIwMTkpPC9vcHRpb24+CisgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQ9InNlbGVjdGVkIj4zLjQuNyAoMS1KdW4tMjAyMCk8L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbj4zLjQuNiAoMjAtRmViLTIwMjApPC9vcHRpb24+CisgICAgICAgIDxvcHRpb24+My40LjUgKDMtRmViLTIwMjApPC9vcHRpb24+CisgICAgICAgIDxvcHRpb24+My40LjQgKDE0LU9jdC0yMDE5KTwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uPjMuNC4zICg1LUF1Zy0yMDE5KTwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uPjMuNC4yICgyOC1NYXktMjAxOSk8L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbj4zLjQuMSAoMTgtTWFyLTIwMTkpPC9vcHRpb24+CiAgICAgICAgIDxvcHRpb24+My40LjAgKDItSmFuLTIwMTkpPC9vcHRpb24+CisgICAgICAgIDxvcHRpb24+My4zLjEwICgzLUZlYi0yMDIwKTwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uPjMuMy45ICgxNC1PY3QtMjAxOSk8L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbj4zLjMuOCAoNS1BdWctMjAxOSk8L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbj4zLjMuNyAoMjgtTWF5LTIwMTkpPC9vcHRpb24+CiAgICAgICAgIDxvcHRpb24+My4zLjYgKDE4LU1hci0yMDE5KTwvb3B0aW9uPgogICAgICAgICA8b3B0aW9uPjMuMy41ICgyLUphbi0yMDE5KTwvb3B0aW9uPgogICAgICAgICA8b3B0aW9uPjMuMy40ICgxNS1PY3QtMjAxOCk8L29wdGlvbj4KQEAgLTExMSwyMSArMTIxLDIxIEBACiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQgaWQ9ImFyY2hpdmVSZWxlYXNlRGF0ZSI+PC90ZD4KICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgIDxhIGlkPSJhcmNoaXZlUmVsZWFzZU5vdGVzIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RpbmtlcnBvcC9ibG9iLzMuNC4xL0NIQU5HRUxPRy5hc2NpaWRvYyNyZWxlYXNlLTMtNC0xIj5yZWxlYXNlIG5vdGVzPC9hPiB8Ci0gICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJhcmNoaXZlVXBncmFkZSI+PGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvMy40LjEvdXBncmFkZS8jX3RpbmtlcnBvcF8zXzRfMSI+dXBncmFkZTwvYT4gfDwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgPGEgaWQ9ImFyY2hpdmVEb2NzIiBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8zLjQuMS8iPmRvY3VtZW50YXRpb248L2E+IHwKLSAgICAgICAgICAgICAgICAgPGEgaWQ9ImFyY2hpdmVDb250cmlidXRvcnMiIGhyZWY9IiMiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjb250cmlidXRvcnMtM180XzEiPmNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgPGEgaWQ9ImFyY2hpdmVSZWxlYXNlTm90ZXMiIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGlua2VycG9wL2Jsb2IvMy40LjIvQ0hBTkdFTE9HLmFzY2lpZG9jI3JlbGVhc2UtMy00LTIiPnJlbGVhc2Ugbm90ZXM8L2E+IHwKKyAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImFyY2hpdmVVcGdyYWRlIj48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvMy40LjIvdXBncmFkZS8jX3RpbmtlcnBvcF8zXzRfMiI+dXBncmFkZTwvYT4gfDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgPGEgaWQ9ImFyY2hpdmVEb2NzIiBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvMy40LjIvIj5kb2N1bWVudGF0aW9uPC9hPiB8CisgICAgICAgICAgICAgICAgIDxhIGlkPSJhcmNoaXZlQ29udHJpYnV0b3JzIiBocmVmPSIjIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29udHJpYnV0b3JzLTNfNF8yIj5jb250cmlidXRvcnM8L2E+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgICAgICAgICAgICAgPGEgaWQ9ImFyY2hpdmVEb3dubG9hZENvbnNvbGUiIGhyZWY9Imh0dHBzOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdGlua2VycG9wLzMuNC4xL2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1jb25zb2xlLTMuNC4xLWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gQ29uc29sZSA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZC1hbHQiPjwvc3Bhbj48L2E+Ci0gICAgICAgICAgICAgICAgIDxhIGlkPSJhcmNoaXZlRG93bmxvYWRTZXJ2ZXIiIGhyZWY9Imh0dHBzOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdGlua2VycG9wLzMuNC4xL2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1zZXJ2ZXItMy40LjEtYmluLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R3JlbWxpbiBTZXJ2ZXIgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tZG93bmxvYWQtYWx0Ij48L3NwYW4+PC9hPgotICAgICAgICAgICAgICAgICA8YSBpZD0iYXJjaGl2ZURvd25sb2FkU291cmNlIiBocmVmPSJodHRwczovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RpbmtlcnBvcC8zLjQuMS9hcGFjaGUtdGlua2VycG9wLTMuNC4xLXNyYy56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPlNvdXJjZSA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZC1hbHQiPjwvc3Bhbj48L2E+CisgICAgICAgICAgICAgICAgIDxhIGlkPSJhcmNoaXZlRG93bmxvYWRDb25zb2xlIiBocmVmPSJodHRwczovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RpbmtlcnBvcC8zLjQuMi9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tY29uc29sZS0zLjQuMi1iaW4uemlwIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HcmVtbGluIENvbnNvbGUgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tZG93bmxvYWQtYWx0Ij48L3NwYW4+PC9hPgorICAgICAgICAgICAgICAgICA8YSBpZD0iYXJjaGl2ZURvd25sb2FkU2VydmVyIiBocmVmPSJodHRwczovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RpbmtlcnBvcC8zLjQuMi9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tc2VydmVyLTMuNC4yLWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gU2VydmVyIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgICAgPGEgaWQ9ImFyY2hpdmVEb3dubG9hZFNvdXJjZSIgaHJlZj0iaHR0cHM6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90aW5rZXJwb3AvMy40LjIvYXBhY2hlLXRpbmtlcnBvcC0zLjQuMi1zcmMuemlwIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5Tb3VyY2UgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tZG93bmxvYWQtYWx0Ij48L3NwYW4+PC9hPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgIDxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPiB0aGF0IHVwZ3JhZGUgZG9jdW1lbnRhdGlvbiB3YXMgb25seSBpbnRyb2R1Y2VkIGF0IDMuMS4xLWluY3ViYXRpbmcgd2hpY2ggaXMgd2h5IHRoZXJlIGFyZSBubyAidXBncmFkZSIgbGlua3MgaW4gdmVyc2lvbnMgcHJpb3IgdG8gdGhhdCBvbmUuCiAgICAgPHA+QXMgYSBjb252ZW5pZW5jZSwgVGlua2VyUG9wIGFsc28gZGVwbG95cyBwYWNrYWdlZCBhcnRpZmFjdHMgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotICAgIDxwPjxhIGhyZWY9Imh0dHBzOi8vaHViLmRvY2tlci5jb20vdS90aW5rZXJwb3AvIj5Eb2NrZXI8L2E+IHwgPGEgaHJlZj0iaHR0cDovL3NlYXJjaC5tYXZlbi5vcmcvI3NlYXJjaCU3Q2dhJTdDMSU3Q2clM0ElMjJvcmcuYXBhY2hlLnRpbmtlcnBvcCUyMiI+TWF2ZW4gQ2VudHJhbDwvYT4gfCA8YSBocmVmPSJodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL2dyZW1saW5weXRob24vIj5QeVBJPC9hPiB8IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2dyZW1saW4iPm5wbTwvYT4gfCA8YSBocmVmPSJodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvR3JlbWxpbi5OZXQvIj5OdUdldDwvYT48L3A+CisgICAgPHA+PGEgaHJlZj0iaHR0cHM6Ly9odWIuZG9ja2VyLmNvbS91L3RpbmtlcnBvcC8iPkRvY2tlcjwvYT4gfCA8YSBocmVmPSJodHRwczovL3NlYXJjaC5tYXZlbi5vcmcvI3NlYXJjaCU3Q2dhJTdDMSU3Q2clM0ElMjJvcmcuYXBhY2hlLnRpbmtlcnBvcCUyMiI+TWF2ZW4gQ2VudHJhbDwvYT4gfCA8YSBocmVmPSJodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL2dyZW1saW5weXRob24vIj5QeVBJPC9hPiB8IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2dyZW1saW4iPm5wbTwvYT4gfCA8YSBocmVmPSJodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvR3JlbWxpbi5OZXQvIj5OdUdldDwvYT48L3A+CiAKICAgICAgPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+IHRoaXMgcGFnZSBsaXN0cyBvZmZpY2lhbCBBcGFjaGUgcmVsZWFzZXMgb25seS4gVGlua2VyUG9wIG9jY2FzaW9uYWxseSBwcm9kdWNlcyB1bm9mZmljaWFsIGJpbmFyeSByZWxlYXNlIGNhbmRpZGF0ZXMgKGRlbm90ZWQgYnkgdGhlIHN1ZmZpeCAiLVJDIikgd2hpY2ggYXJlIE5PVCBwcm9tb3RlZCBvciBhbm5vdW5jZWQgYXMgYWN0dWFsIHJlbGVhc2UgdmVyc2lvbnMuIDxpPlN1Y2ggcmVsZWFzZXMgYXJlIGZvciBlYXJseSBkZXZlbG9wbWVudCBhbmQgZXZhbHVhdGlvbiBwdXJwb3NlcyBvbmx5LjwvaT48L3A+CiAKQEAgLTE2Miw2ICsxNzIsMTc2IEBACiAgPC9kaXY+CiAKICAgICA8IS0tIENvbnRyaWJ1dG9yIE1vZGFscyAtLT4KKyAgICA8IS0tIDMuNC44IC0tPgorICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjb250cmlidXRvcnMtM180XzgiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+PHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPjMuNC44PC9oND4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHA+UmVsZWFzZSBNYW5hZ2VyOiBTdGVwaGVuIE1hbGxldHRlPC9wPgorICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlPiQgZ2l0IHNob3J0bG9nIC1zbiAzLjQuNy4uMy40LjgKKyAgICAyMSAgU3RlcGhlbiBNYWxsZXR0ZQorICAgICA0ICBNYXJrIEJyb2FkbW9yZQorICAgICAzICBGbG9yaWFuIEhvY2ttYW5uCisgICAgIDMgIEplcm15IExpCisgICAgIDEgIENob2xlcmFlIEh1CisgICAgIDEgIERpdmlqIFZhaWR5YQorICAgICAxICBHdXN0YXZvIENhdmFsaWVyaSBGZXJuYW5kZXM8L2NvZGU+PC9wcmU+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8IS0tIDMuNC43IC0tPgorICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjb250cmlidXRvcnMtM180XzciIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+PHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPjMuNC43PC9oND4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHA+UmVsZWFzZSBNYW5hZ2VyOiBTdGVwaGVuIE1hbGxldHRlPC9wPgorICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlPiQgZ2l0IHNob3J0bG9nIC1zbiAzLjQuNi4uMy40LjcKKyAgIDEwNiAgU3RlcGhlbiBNYWxsZXR0ZQorICAgIDE4ICBMaXUgSmlhbnBpbmcKKyAgICAxNyAgRmxvcmlhbiBIb2NrbWFubgorICAgICA0ICBSb2JlcnQgRGFsZQorICAgICAzICBKb3JnZSBCYXkgR29uZHJhCisgICAgIDIgIERhbmllbCBDLiBXZWJlcgorICAgICAyICBkem1pdHJ5LmxhaG9kYQorICAgICAxICBDb25ub3IgVC4gU2tlbm5lcnRvbgorICAgICAxICBFZHVhcmQgVHVkZW5ob2VmbmVyCisgICAgIDEgIEp1aGEgSGFhcHNhYXJpCisgICAgIDEgIEp1c3RpbiBDaHUKKyAgICAgMSAgTmljb2xhcyBUcmFuZ29zaQorICAgICAxICBvbGltN3Q8L2NvZGU+PC9wcmU+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8IS0tIDMuNC42IC0tPgorICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjb250cmlidXRvcnMtM180XzYiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+PHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPjMuNC42PC9oND4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHA+UmVsZWFzZSBNYW5hZ2VyOiBTdGVwaGVuIE1hbGxldHRlPC9wPgorICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlPiQgZ2l0IHNob3J0bG9nIC1zbiAzLjQuNS4uMy40LjYKKyAgICAxMCAgU3RlcGhlbiBNYWxsZXR0ZQorICAgICAxICBOaWNvbGFzIFRyYW5nb3NpPC9jb2RlPjwvcHJlPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPCEtLSAzLjQuNSAtLT4KKyAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY29udHJpYnV0b3JzLTNfNF81IiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyI+CisgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPjxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj4zLjQuNTwvaDQ+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CisgICAgICAgICAgICAgICAgICAgIDxwPlJlbGVhc2UgTWFuYWdlcjogU3RlcGhlbiBNYWxsZXR0ZTwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT4kIGdpdCBzaG9ydGxvZyAtc24gMy40LjQuLjMuNC41CisgICAxMDcgIFN0ZXBoZW4gTWFsbGV0dGUKKyAgICAxNyAgSm9yZ2UgQmF5IEdvbmRyYQorICAgICA5ICBSdXNpIFBvcG92CisgICAgIDggIFJvYmVydCBEYWxlCisgICAgIDQgIEplcm15IExpCisgICAgIDMgIHRoZXZhbHpvCisgICAgIDIgIERhbmllbCBLdXBwaXR6CisgICAgIDIgIE5vcmlvIEFrYWdpCisgICAgIDEgIENob2xlcmFlIEh1CisgICAgIDEgIHJvb3QKKyAgICAgMSAgd2FuZ3NoYW9nYW4KKyAgICAgMSAg6Ie76IezPC9jb2RlPjwvcHJlPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPCEtLSAzLjQuNCAtLT4KKyAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY29udHJpYnV0b3JzLTNfNF80IiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyI+CisgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPjxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj4zLjQuNDwvaDQ+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CisgICAgICAgICAgICAgICAgICAgIDxwPlJlbGVhc2UgTWFuYWdlcjogU3RlcGhlbiBNYWxsZXR0ZTwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT4kIGdpdCBzaG9ydGxvZyAtc24gMy40LjMuLjMuNC40CisgICAxNTcgIFN0ZXBoZW4gTWFsbGV0dGUKKyAgICAgNSAgdGhpcnN0eWNyb3cKKyAgICAgMyAgRGFuaWVsIEt1cHBpdHoKKyAgICAgMyAgSm9yZ2UgQmF5IEdvbmRyYQorICAgICAyICBKdXN0aW4gQ2h1CisgICAgIDIgIFJvYmVydCBEYWxlCisgICAgIDIgIGdpb24KKyAgICAgMiAgc2FuZHN6aG91LnpqCisgICAgIDEgIEFtbWFyb3ZlCisgICAgIDEgIERhbiBMYVJvY3F1ZQorICAgICAxICBNYXJ0aW4gS3VsaGF2eQorICAgICAxICBzZWwtZmlzaDwvY29kZT48L3ByZT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDwhLS0gMy40LjMgLS0+CisgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNvbnRyaWJ1dG9ycy0zXzRfMyIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciPgorICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj48c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+My40LjM8L2g0PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgorICAgICAgICAgICAgICAgICAgICA8cD5SZWxlYXNlIE1hbmFnZXI6IFN0ZXBoZW4gTWFsbGV0dGU8L3A+CisgICAgICAgICAgICAgICAgICAgIDxwcmU+PGNvZGU+JCBnaXQgc2hvcnRsb2cgLXNuIDMuNC4yLi4zLjQuMworICAgMjA3ICBTdGVwaGVuIE1hbGxldHRlCisgICAgMTMgIFJvYmVydCBEYWxlCisgICAgMTEgIERpdmlqIFZhaWR5YQorICAgIDExICBqb24tc2NobworICAgICA4ICBEYW5pZWwgS3VwcGl0egorICAgICA0ICBicnluCisgICAgIDMgIEVkdWFyZCBUdWRlbmhvZWZuZXIKKyAgICAgMiAgc2FuZHN6aG91LnpqCisgICAgIDEgIERhbiBMYVJvY3F1ZQorICAgICAxICB4aXl1Lnd4eTwvY29kZT48L3ByZT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKwogICAgIDwhLS0gMy40LjIgLS0+CiAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNvbnRyaWJ1dG9ycy0zXzRfMiIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciPgogICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4KQEAgLTE3Miw3ICszNTIsMjEgQEAKICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgPHA+UmVsZWFzZSBNYW5hZ2VyOiBTdGVwaGVuIE1hbGxldHRlPC9wPgotICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlPiQgZ2l0IHNob3J0bG9nIC1zbiAzLjQuMS4uMy40LjI8L2NvZGU+PC9wcmU+CisgICAgICAgICAgICAgICAgICAgIDxwcmU+PGNvZGU+JCBnaXQgc2hvcnRsb2cgLXNuIDMuNC4xLi4zLjQuMgorICAgMTE5ICBTdGVwaGVuIE1hbGxldHRlCisgICAgMjAgIFJvYmVydCBEYWxlCisgICAgIDUgIEVkdWFyZCBUdWRlbmhvZWZuZXIKKyAgICAgNCAgRGl2aWogVmFpZHlhCisgICAgIDQgIEpvcmdlIEJheSBHb25kcmEKKyAgICAgMyAgRGFuaWVsIEt1cHBpdHoKKyAgICAgMyAgS2V2aW4gR2FsbGFyZG8KKyAgICAgMiAgRHdpdHJ5CisgICAgIDEgIEJyZXR0IFBlYXZsZXIKKyAgICAgMSAgRGFuIExhUm9jcXVlCisgICAgIDEgIERhbmllbCBDLiBXZWJlcgorICAgICAxICBGbG9yaWFuIEhvY2ttYW5uCisgICAgIDEgIEhpZXUgTmd1eWVuCisgICAgIDEgIHNlbC1maXNoPC9jb2RlPjwvcHJlPgogICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgpAQCAtMjU5LDYgKzQ1MywxMTcgQEAKICAgICAgICAgPC9kaXY+CiAgICAgPC9kaXY+CiAKKyAgICA8IS0tIDMuMy4xMSAtLT4KKyAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY29udHJpYnV0b3JzLTNfM18xMSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciPgorICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj48c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+My4zLjExPC9oND4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHA+UmVsZWFzZSBNYW5hZ2VyOiBTdGVwaGVuIE1hbGxldHRlPC9wPgorICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlPiQgZ2l0IHNob3J0bG9nIC1zbiAzLjMuMTAuLjMuMy4xMQorICAgIDQ2ICBTdGVwaGVuIE1hbGxldHRlCisgICAgMTMgIExpdSBKaWFucGluZworICAgICA3ICBGbG9yaWFuIEhvY2ttYW5uCisgICAgIDIgIERhbmllbCBDLiBXZWJlcgorICAgICAyICBKb3JnZSBCYXkgR29uZHJhCisgICAgIDEgIEp1c3RpbiBDaHUKKyAgICAgMSAgUm9iZXJ0IERhbGUKKyAgICAgMSAgb2xpbTd0PC9jb2RlPjwvcHJlPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPCEtLSAzLjMuMTAgLS0+CisgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNvbnRyaWJ1dG9ycy0zXzNfMTAiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+PHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPjMuMy4xMDwvaDQ+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CisgICAgICAgICAgICAgICAgICAgIDxwPlJlbGVhc2UgTWFuYWdlcjogU3RlcGhlbiBNYWxsZXR0ZTwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT4kIGdpdCBzaG9ydGxvZyAtc24gMy4zLjkuLjMuMy4xMAorICAgIDQ0ICBTdGVwaGVuIE1hbGxldHRlCisgICAgIDkgIFJ1c2kgUG9wb3YKKyAgICAgOCAgSm9yZ2UgQmF5IEdvbmRyYQorICAgICA0ICBSb2JlcnQgRGFsZQorICAgICAxICBDaG9sZXJhZSBIdQorICAgICAxICBEYW5pZWwgS3VwcGl0egorICAgICAxICBOb3JpbyBBa2FnaQorICAgICAxICB3YW5nc2hhb2dhbjwvY29kZT48L3ByZT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDwhLS0gMy4zLjkgLS0+CisgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNvbnRyaWJ1dG9ycy0zXzNfOSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciPgorICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj48c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+My4zLjk8L2g0PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgorICAgICAgICAgICAgICAgICAgICA8cD5SZWxlYXNlIE1hbmFnZXI6IFN0ZXBoZW4gTWFsbGV0dGU8L3A+CisgICAgICAgICAgICAgICAgICAgIDxwcmU+PGNvZGU+JCBnaXQgc2hvcnRsb2cgLXNuIDMuMy44Li4zLjMuOQorICAgIDQ3ICBTdGVwaGVuIE1hbGxldHRlCisgICAgIDQgIHRoaXJzdHljcm93CisgICAgIDIgIEpvcmdlIEJheSBHb25kcmEKKyAgICAgMiAgSnVzdGluIENodQorICAgICAyICBnaW9uCisgICAgIDIgIHNhbmRzemhvdS56agorICAgICAxICBBbW1hcm92ZQorICAgICAxICBEYW5pZWwgS3VwcGl0egorICAgICAxICBNYXJ0aW4gS3VsaGF2eQorICAgICAxICBSb2JlcnQgRGFsZQorICAgICAxICBzZWwtZmlzaDwvY29kZT48L3ByZT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDwhLS0gMy4zLjggLS0+CisgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNvbnRyaWJ1dG9ycy0zXzNfOCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciPgorICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj48c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+My4zLjg8L2g0PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgorICAgICAgICAgICAgICAgICAgICA8cD5SZWxlYXNlIE1hbmFnZXI6IFN0ZXBoZW4gTWFsbGV0dGU8L3A+CisgICAgICAgICAgICAgICAgICAgIDxwcmU+PGNvZGU+JCBnaXQgc2hvcnRsb2cgLXNuIDMuMy43Li4zLjMuOAorICAgIDk5ICBTdGVwaGVuIE1hbGxldHRlCisgICAgMTEgIERpdmlqIFZhaWR5YQorICAgICA2ICBqb24tc2NobworICAgICAzICBEYW5pZWwgS3VwcGl0egorICAgICAyICBFZHVhcmQgVHVkZW5ob2VmbmVyCisgICAgIDIgIFJvYmVydCBEYWxlCisgICAgIDEgIHNhbmRzemhvdS56agorICAgICAxICB4aXl1Lnd4eTwvY29kZT48L3ByZT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKwogICAgIDwhLS0gMy4zLjcgLS0+CiAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNvbnRyaWJ1dG9ycy0zXzNfNyIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciPgogICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4KQEAgLTI2OSw3ICs1NzQsMTUgQEAKICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgPHA+UmVsZWFzZSBNYW5hZ2VyOiBTdGVwaGVuIE1hbGxldHRlPC9wPgotICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlPiQgZ2l0IHNob3J0bG9nIC1zbiAzLjMuNi4uMy4zLjc8L2NvZGU+PC9wcmU+CisgICAgICAgICAgICAgICAgICAgIDxwcmU+PGNvZGU+JCBnaXQgc2hvcnRsb2cgLXNuIDMuMy42Li4zLjMuNworICAgIDQ2ICBTdGVwaGVuIE1hbGxldHRlCisgICAgIDkgIFJvYmVydCBEYWxlCisgICAgIDQgIEVkdWFyZCBUdWRlbmhvZWZuZXIKKyAgICAgMiAgRGFuaWVsIEt1cHBpdHoKKyAgICAgMiAgRHdpdHJ5CisgICAgIDIgIEpvcmdlIEJheSBHb25kcmEKKyAgICAgMSAgSGlldSBOZ3V5ZW4KKyAgICAgMSAgS2V2aW4gR2FsbGFyZG88L2NvZGU+PC9wcmU+CiAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CkBAIC0xMjc1LDcgKzE1ODgsNyBAQAogICAgICAgICAgICAgJCgiI2FyY2hpdmVWZXJzaW9uIikuaHRtbCh2ZXJzaW9uKTsKICAgICAgICAgICAgICQoIiNhcmNoaXZlUmVsZWFzZURhdGUiKS5odG1sKHJlbGVhc2VEYXRlKTsKICAgICAgICAgICAgICQoIiNhcmNoaXZlUmVsZWFzZU5vdGVzIikuYXR0cigiaHJlZiIsICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RpbmtlcnBvcC9ibG9iL21hc3Rlci9DSEFOR0VMT0cuYXNjaWlkb2MjcmVsZWFzZS0iICsgdmVyc2lvbkh5cGhlbmVkKTsKLSAgICAgICAgICAgICQoIiNhcmNoaXZlRG9jcyIpLmF0dHIoImhyZWYiLCAiaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvIiArIHZlcnNpb24pOworICAgICAgICAgICAgJCgiI2FyY2hpdmVEb2NzIikuYXR0cigiaHJlZiIsICJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvIiArIHZlcnNpb24pOwogICAgICAgICAgICAgJCgiI2FyY2hpdmVDb250cmlidXRvcnMiKS5hdHRyKCJkYXRhLXRhcmdldCIsICIjY29udHJpYnV0b3JzLSIgKyB2ZXJzaW9uVW5kZXJzY29yZWQpOwogCiAgICAgICAgICAgICB2YXIgdmVyc2lvbnNXaXRoT2xkTmFtaW5nID0gWyIzLjIuMSIsICIzLjEuMyIsICIzLjIuMC1pbmN1YmF0aW5nIiwgIjMuMS4yLWluY3ViYXRpbmciLCAiMy4xLjEtaW5jdWJhdGluZyIsCkBAIC0xMjk5LDcgKzE2MTIsNyBAQAogICAgICAgICAgICAgICAgICQoIiNhcmNoaXZlVXBncmFkZSBhIikuYXR0cigiaHJlZiIsICIjIik7CiAgICAgICAgICAgICAgICAgJCgiI2FyY2hpdmVVcGdyYWRlIikuaGlkZSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAkKCIjYXJjaGl2ZVVwZ3JhZGUgYSIpLmF0dHIoImhyZWYiLCAiaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvIiArIHZlcnNpb24gKyAiL3VwZ3JhZGUvI190aW5rZXJwb3BfIiArIHZlcnNpb25VbmRlcnNjb3JlZCk7CisgICAgICAgICAgICAgICAgJCgiI2FyY2hpdmVVcGdyYWRlIGEiKS5hdHRyKCJocmVmIiwgImh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8iICsgdmVyc2lvbiArICIvdXBncmFkZS8jX3RpbmtlcnBvcF8iICsgdmVyc2lvblVuZGVyc2NvcmVkKTsKICAgICAgICAgICAgICAgICAkKCIjYXJjaGl2ZVVwZ3JhZGUiKS5zaG93KCk7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2RvY3Mvc2l0ZS9ob21lL2dyZW1saW4uaHRtbCBiL2RvY3Mvc2l0ZS9ob21lL2dyZW1saW4uaHRtbAppbmRleCBhOGE2Y2QzLi43YzNlNmFhIDEwMDY0NAotLS0gYS9kb2NzL3NpdGUvaG9tZS9ncmVtbGluLmh0bWwKKysrIGIvZG9jcy9zaXRlL2hvbWUvZ3JlbWxpbi5odG1sCkBAIC0yNiw3ICsyNiw3IEBACiAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS0xMCBjb2wtbWQtMTAiPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hcnhpdi5vcmcvYWJzLzE1MDguMDM4NDMiPkdyZW1saW48L2E+IGlzIHRoZSBncmFwaCB0cmF2ZXJzYWwgbGFuZ3VhZ2Ugb2YgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnLyI+QXBhY2hlIFRpbmtlclBvcDwvYT4uCisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwOC4wMzg0MyI+R3JlbWxpbjwvYT4gaXMgdGhlIGdyYXBoIHRyYXZlcnNhbCBsYW5ndWFnZSBvZiA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnLyI+QXBhY2hlIFRpbmtlclBvcDwvYT4uCiAgICAgICAgICAgR3JlbWxpbiBpcyBhIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Z1bmN0aW9uYWxfcHJvZ3JhbW1pbmciPmZ1bmN0aW9uYWw8L2E+LCA8YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRhZmxvd19wcm9ncmFtbWluZyI+ZGF0YS1mbG93PC9hPgogICAgICAgICAgIGxhbmd1YWdlIHRoYXQgZW5hYmxlcyB1c2VycyB0byBzdWNjaW5jdGx5IGV4cHJlc3MgY29tcGxleCB0cmF2ZXJzYWxzIG9uIChvciBxdWVyaWVzIG9mKSB0aGVpciBhcHBsaWNhdGlvbidzIHByb3BlcnR5IGdyYXBoLiBFdmVyeSBHcmVtbGluIHRyYXZlcnNhbCBpcyBjb21wb3NlZCBvZiBhIHNlcXVlbmNlIG9mIChwb3RlbnRpYWxseSBuZXN0ZWQpIHN0ZXBzLiBBIHN0ZXAKICAgICAgICAgICBwZXJmb3JtcyBhbiBhdG9taWMgb3BlcmF0aW9uIG9uIHRoZSBkYXRhIHN0cmVhbS4gRXZlcnkgc3RlcCBpcyBlaXRoZXIgYSA8ZW0+bWFwPC9lbT4tc3RlcCAodHJhbnNmb3JtaW5nIHRoZSBvYmplY3RzIGluIHRoZSBzdHJlYW0pLCBhIDxlbT5maWx0ZXI8L2VtPi1zdGVwIChyZW1vdmluZyBvYmplY3RzCkBAIC0yNTAsMTQgKzI1MCwxNCBAQAogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS03IGNvbC1tZC04Ij4KICAgICAgICAgICBBIGRlY2xhcmF0aXZlIEdyZW1saW4gdHJhdmVyc2FsIGRvZXMgbm90IHRlbGwgdGhlIHRyYXZlcnNlcnMgdGhlIG9yZGVyIGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlaXIgd2FsaywgYnV0IGluc3RlYWQsIGFsbG93cyBlYWNoIHRyYXZlcnNlciB0byBzZWxlY3QgYSBwYXR0ZXJuIHRvIGV4ZWN1dGUgZnJvbSBhIGNvbGxlY3Rpb24KLSAgICAgICAgICBvZiAocG90ZW50aWFsbHkgbmVzdGVkKSBwYXR0ZXJucy4gVGhlIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNtYXRjaC1zdGVwIj5kZWNsYXJhdGl2ZSB0cmF2ZXJzYWw8L2E+IG9uIHRoZSBsZWZ0IHlpZWxkcyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGltcGVyYXRpdmUgdHJhdmVyc2FsIGFib3ZlLiBIb3dldmVyLCB0aGUgZGVjbGFyYXRpdmUgdHJhdmVyc2FsIGhhcyB0aGUgYWRkZWQgYmVuZWZpdAorICAgICAgICAgIG9mIChwb3RlbnRpYWxseSBuZXN0ZWQpIHBhdHRlcm5zLiBUaGUgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNtYXRjaC1zdGVwIj5kZWNsYXJhdGl2ZSB0cmF2ZXJzYWw8L2E+IG9uIHRoZSBsZWZ0IHlpZWxkcyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGltcGVyYXRpdmUgdHJhdmVyc2FsIGFib3ZlLiBIb3dldmVyLCB0aGUgZGVjbGFyYXRpdmUgdHJhdmVyc2FsIGhhcyB0aGUgYWRkZWQgYmVuZWZpdAogICAgICAgICAgIHRoYXQgaXQgbGV2ZXJhZ2VzIG5vdCBvbmx5IGEgY29tcGlsZS10aW1lIHF1ZXJ5IHBsYW5uZXIgKGxpa2UgaW1wZXJhdGl2ZSB0cmF2ZXJzYWxzKSwgYnV0IGFsc28gYSBydW50aW1lIHF1ZXJ5IHBsYW5uZXIgdGhhdCBjaG9vc2VzIHdoaWNoIHRyYXZlcnNhbCBwYXR0ZXJuIHRvIGV4ZWN1dGUgbmV4dCBiYXNlZCBvbiB0aGUKICAgICAgICAgICBoaXN0b3JpYyBzdGF0aXN0aWNzIG9mIGVhY2ggcGF0dGVybiAtLSBmYXZvcmluZyB0aG9zZSBwYXR0ZXJucyB3aGljaCB0ZW5kIHRvIHJlZHVjZS9maWx0ZXIgdGhlIG1vc3QgZGF0YS4KICAgICAgICA8L2Rpdj4KICAgICA8L2Rpdj4KICAgICA8YnIvPgogICAgIFRoZSB1c2VyIGNhbiB3cml0ZSB0aGVpciB0cmF2ZXJzYWxzIGluIGFueSB3YXkgdGhleSBjaG9vc2UuIEhvd2V2ZXIsIHVsdGltYXRlbHkgd2hlbiB0aGVpciB0cmF2ZXJzYWwgaXMgY29tcGlsZWQsIGFuZCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgZXhlY3V0aW9uIGVuZ2luZQotICAgIChpLmUuIGFuIE9MVFAgZ3JhcGggZGF0YWJhc2Ugb3IgYW4gT0xBUCBncmFwaCBwcm9jZXNzb3IpLCB0aGUgdXNlcidzIHRyYXZlcnNhbCBpcyByZXdyaXR0ZW4gYnkgYSBzZXQgb2YgPGVtPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyN0cmF2ZXJzYWxzdHJhdGVneSI+dHJhdmVyc2FsIHN0cmF0ZWdpZXM8L2E+PC9lbT4gd2hpY2ggZG8gdGhlaXIgYmVzdCB0byBkZXRlcm1pbmUgdGhlIG1vc3Qgb3B0aW1hbCBleGVjdXRpb24KKyAgICAoaS5lLiBhbiBPTFRQIGdyYXBoIGRhdGFiYXNlIG9yIGFuIE9MQVAgZ3JhcGggcHJvY2Vzc29yKSwgdGhlIHVzZXIncyB0cmF2ZXJzYWwgaXMgcmV3cml0dGVuIGJ5IGEgc2V0IG9mIDxlbT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI3RyYXZlcnNhbHN0cmF0ZWd5Ij50cmF2ZXJzYWwgc3RyYXRlZ2llczwvYT48L2VtPiB3aGljaCBkbyB0aGVpciBiZXN0IHRvIGRldGVybWluZSB0aGUgbW9zdCBvcHRpbWFsIGV4ZWN1dGlvbgogICAgIHBsYW4gYmFzZWQgb24gYW4gdW5kZXJzdGFuZGluZyBvZiBncmFwaCBkYXRhIGFjY2VzcyBjb3N0cyBhcyB3ZWxsIGFzIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3lzdGVtcydzIHVuaXF1ZSBjYXBhYmlsaXRpZXMgKGUuZy4gZmV0Y2ggdGhlIEdyZW1saW4gdmVydGV4IGZyb20gdGhlIGdyYXBoIGRhdGFiYXNlJ3MgIm5hbWUiLWluZGV4KS4KICAgICBHcmVtbGluIGhhcyBiZWVuIGRlc2lnbmVkIHRvIGdpdmUgdXNlcnMgZmxleGliaWxpdHkgaW4gaG93IHRoZXkgZXhwcmVzcyB0aGVpciBxdWVyaWVzIGFuZCBncmFwaCBzeXN0ZW0gcHJvdmlkZXJzIGZsZXhpYmlsaXR5IGluIGhvdyB0byBlZmZpY2llbnRseSBldmFsdWF0ZSB0cmF2ZXJzYWxzIGFnYWluc3QgdGhlaXIgVGlua2VyUG9wLWVuYWJsZWQgZGF0YSBzeXN0ZW0uCiAgPC9kaXY+CkBAIC0yNzcsNyArMjc3LDcgQEAKICAgICAgICAgICAicHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIiBhcmUgbm90IGFzIGdyZWF0IGFzIHdlIGFyZSB0YXVnaHQgdG8gYmVsaWV2ZS4gR3JlbWxpbiB1bmlmaWVzIHRoaXMgZGl2aWRlIGJlY2F1c2UgdHJhdmVyc2FscyBjYW4gYmUgd3JpdHRlbiBpbiBhbnkKICAgICAgICAgICBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGF0IHN1cHBvcnRzIGZ1bmN0aW9uIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Z1bmN0aW9uX2NvbXBvc2l0aW9uIj5jb21wb3NpdGlvbjwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05lc3RlZF9mdW5jdGlvbiI+bmVzdGluZzwvYT4gKHdoaWNoIGV2ZXJ5IG1ham9yIHByb2dyYW1taW5nIGxhbmd1YWdlIHN1cHBvcnRzKS4gSW4gdGhpcyB3YXksIHRoZSB1c2VyJ3MKICAgICAgICAgICBHcmVtbGluIHRyYXZlcnNhbHMgYXJlIHdyaXR0ZW4gYWxvbmcgc2lkZSB0aGVpciBhcHBsaWNhdGlvbiBjb2RlIGFuZCBiZW5lZml0IGZyb20gdGhlIGFkdmFudGFnZXMgYWZmb3JkZWQgYnkgdGhlIGhvc3QgbGFuZ3VhZ2UgYW5kIGl0cyB0b29saW5nCi0gICAgICAgICAgKGUuZy4gdHlwZSBjaGVja2luZywgc3ludGF4IGhpZ2hsaWdodGluZywgZG90IGNvbXBsZXRpb24sIGV0Yy4pLiBWYXJpb3VzIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvdHV0b3JpYWxzL2dyZW1saW4tbGFuZ3VhZ2UtdmFyaWFudHMvIj5HcmVtbGluIGxhbmd1YWdlIHZhcmlhbnRzPC9hPiBleGlzdCBpbmNsdWRpbmc6IEdyZW1saW4tSmF2YSwgR3JlbWxpbi1Hcm9vdnksIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLXB5dGhvbiI+R3JlbWxpbi1QeXRob248L2E+LAorICAgICAgICAgIChlLmcuIHR5cGUgY2hlY2tpbmcsIHN5bnRheCBoaWdobGlnaHRpbmcsIGRvdCBjb21wbGV0aW9uLCBldGMuKS4gVmFyaW91cyA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC90dXRvcmlhbHMvZ3JlbWxpbi1sYW5ndWFnZS12YXJpYW50cy8iPkdyZW1saW4gbGFuZ3VhZ2UgdmFyaWFudHM8L2E+IGV4aXN0IGluY2x1ZGluZzogR3JlbWxpbi1KYXZhLCBHcmVtbGluLUdyb292eSwgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLXB5dGhvbiI+R3JlbWxpbi1QeXRob248L2E+LAogICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tcG9sbG1laWVyL2dyZW1saW4tc2NhbGEiPkdyZW1saW4tU2NhbGE8L2E+LCBldGMuCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIj4KZGlmZiAtLWdpdCBhL2RvY3Mvc2l0ZS9ob21lL2luZGV4Lmh0bWwgYi9kb2NzL3NpdGUvaG9tZS9pbmRleC5odG1sCmluZGV4IGMxN2M3MjguLjIzODViODQgMTAwNjQ0Ci0tLSBhL2RvY3Mvc2l0ZS9ob21lL2luZGV4Lmh0bWwKKysrIGIvZG9jcy9zaXRlL2hvbWUvaW5kZXguaHRtbApAQCAtMjYsMjMgKzI2LDIzIEBACiAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8Yj48Zm9udCBzaXplPSI0Ij5UaW5rZXJQb3A8L2ZvbnQ+IDxmb250IHNpemU9IjQiPjMuNC4yPC9mb250PjwvYj4gKDxmb250IHNpemU9IjIiPlJlbGVhc2VkOiAyOC1NYXktMjAxOTwvZm9udD4pCisgICAgICAgICAgICA8Yj48Zm9udCBzaXplPSI0Ij5UaW5rZXJQb3A8L2ZvbnQ+IDxmb250IHNpemU9IjQiPjMuNC44PC9mb250PjwvYj4gKDxmb250IHNpemU9IjIiPlJlbGVhc2VkOiAzLUF1Zy0yMDIwPC9mb250PikKICAgICAgICAgICAgIDxwPjxiPkRvd25sb2FkczwvYj48L3A+CiAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5sdWEvdGlua2VycG9wLzMuNC4yL2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1jb25zb2xlLTMuNC4yLWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gQ29uc29sZSA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZC1hbHQiPjwvc3Bhbj48L2E+Ci0gICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjQuMi9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tc2VydmVyLTMuNC4yLWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gU2VydmVyIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KLSAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5sdWEvdGlua2VycG9wLzMuNC4yL2FwYWNoZS10aW5rZXJwb3AtMy40LjItc3JjLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+U291cmNlIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5sdWEvdGlua2VycG9wLzMuNC44L2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1jb25zb2xlLTMuNC44LWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gQ29uc29sZSA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZC1hbHQiPjwvc3Bhbj48L2E+CisgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIubHVhL3RpbmtlcnBvcC8zLjQuOC9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tc2VydmVyLTMuNC44LWJpbi56aXAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdyZW1saW4gU2VydmVyIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5sdWEvdGlua2VycG9wLzMuNC44L2FwYWNoZS10aW5rZXJwb3AtMy40Ljgtc3JjLnppcCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+U291cmNlIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWRvd25sb2FkLWFsdCI+PC9zcGFuPjwvYT4KICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNiI+CiAgICAgICAgICAgICAgICAgICA8cD48Yj5Eb2N1bWVudGF0aW9uPC9iPjwvcD4KICAgICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50LyI+VGlua2VyUG9wIERvY3VtZW50YXRpb248L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC8iPlRpbmtlclBvcCBEb2N1bWVudGF0aW9uPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UiPlJlZmVyZW5jZSBEb2N1bWVudGF0aW9uPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlIj5SZWZlcmVuY2UgRG9jdW1lbnRhdGlvbjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8zLjQuMi91cGdyYWRlLyNfdGlua2VycG9wXzNfNF8yIj5VcGdyYWRlIEluZm9ybWF0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICA8bGk+VGlua2VyUG9wIEphdmFkb2MgLSA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvY3VycmVudC9jb3JlLyI+Y29yZTwvYT4gLyA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvY3VycmVudC9mdWxsLyI+ZnVsbDwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8zLjQuOC91cGdyYWRlLyNfdGlua2VycG9wXzNfNF84Ij5VcGdyYWRlIEluZm9ybWF0aW9uPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+VGlua2VyUG9wIEphdmFkb2MgLSA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2phdmFkb2NzL2N1cnJlbnQvY29yZS8iPmNvcmU8L2E+IC8gPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9qYXZhZG9jcy9jdXJyZW50L2Z1bGwvIj5mdWxsPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNiI+CkBAIC05NSwxOSArOTUsMTkgQEAKICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0iPgogICAgICAgICAgICAgICAgICAgPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtZ3JlbWxpbiI+CiAgICAgLy8gV2hhdCBhcmUgdGhlIG5hbWVzIG9mIHByb2plY3RzIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IHR3byBmcmllbmRzPwotICAgIGcuVigpLm1hdGNoKAotICAgICAgYXMoImEiKS5vdXQoImtub3dzIikuYXMoImIiKSwKLSAgICAgIGFzKCJhIikub3V0KCJjcmVhdGVkIikuYXMoImMiKSwKLSAgICAgIGFzKCJiIikub3V0KCJjcmVhdGVkIikuYXMoImMiKSwKLSAgICAgIGFzKCJjIikuaW4oImNyZWF0ZWQiKS5jb3VudCgpLmlzKDIpKS4KLSAgICAgICAgc2VsZWN0KCJjIikuYnkoIm5hbWUiKQorICAgIGcuVigpLgorICAgICAgbWF0Y2goYXMoImEiKS5vdXQoImtub3dzIikuYXMoImIiKSwKKyAgICAgICAgICAgIGFzKCJhIikub3V0KCJjcmVhdGVkIikuYXMoImMiKSwKKyAgICAgICAgICAgIGFzKCJiIikub3V0KCJjcmVhdGVkIikuYXMoImMiKSwKKyAgICAgICAgICAgIGFzKCJjIikuaW4oImNyZWF0ZWQiKS5jb3VudCgpLmlzKDIpKS4KKyAgICAgIHNlbGVjdCgiYyIpLmJ5KCJuYW1lIikKICAgICAgICAgICA8L2NvZGU+PC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0iPgogICAgICAgICAgICAgICAgICAgPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtZ3JlbWxpbiI+CiAKLSAgICAvLyBXaGF0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIG1hbmFnZXJzIGluCi0gICAgLy8gIHRoZSBtYW5hZ2VtZW50IGNoYWluIGdvaW5nIGZyb20gR3JlbWxpbiB0byB0aGUgQ0VPPworICAgIC8vIFdoYXQgYXJlIHRoZSBuYW1lcyBvZiB0aGUgbWFuYWdlcnMgaW4gdGhlCisgICAgLy8gbWFuYWdlbWVudCBjaGFpbiBnb2luZyBmcm9tIEdyZW1saW4gdG8gdGhlIENFTz8KICAgICBnLlYoKS5oYXMoIm5hbWUiLCJncmVtbGluIikuCiAgICAgICByZXBlYXQoaW4oIm1hbmFnZXMiKSkudW50aWwoaGFzKCJ0aXRsZSIsImNlbyIpKS4KICAgICAgIHBhdGgoKS5ieSgibmFtZSIpCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAvLyBXaGF0IGlzIHRoZSBkaXN0cmlidXRpb24gb2Ygam9iIHRpdGxlcyBhbW9uZ3N0IEdyZW1saW4ncyBjb2xsYWJvcmF0b3JzPwogICAgIGcuVigpLmhhcygibmFtZSIsImdyZW1saW4iKS5hcygiYSIpLgogICAgICAgb3V0KCJjcmVhdGVkIikuaW4oImNyZWF0ZWQiKS4KLSAgICAgICAgd2hlcmUobmVxKCJhIikpLgorICAgICAgd2hlcmUobmVxKCJhIikpLgogICAgICAgZ3JvdXBDb3VudCgpLmJ5KCJ0aXRsZSIpCiAKICAgICAgICAgICA8L2NvZGU+PC9wcmU+CkBAIC0xMzEsOSArMTMxLDkgQEAKICAgICAvLyBHZXQgYSByYW5raW5nIG9mIHRoZSBtb3N0IHJlbGV2YW50IHByb2R1Y3RzIGZvciBHcmVtbGluIGdpdmVuIGhpcyBwdXJjaGFzZSBoaXN0b3J5LgogICAgIGcuVigpLmhhcygibmFtZSIsImdyZW1saW4iKS5vdXQoImJvdWdodCIpLmFnZ3JlZ2F0ZSgic3Rhc2giKS4KICAgICAgIGluKCJib3VnaHQiKS5vdXQoImJvdWdodCIpLgotICAgICAgICB3aGVyZShub3Qod2l0aGluKCJzdGFzaCIpKSkuCisgICAgICB3aGVyZShub3Qod2l0aGluKCJzdGFzaCIpKSkuCiAgICAgICBncm91cENvdW50KCkuCi0gICAgICAgIG9yZGVyKGxvY2FsKS5ieSh2YWx1ZXMsZGVzYykKKyAgICAgIG9yZGVyKGxvY2FsKS5ieSh2YWx1ZXMsZGVzYykKICAgICAgICAgICA8L2NvZGU+PC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgIDwvZGl2PgpAQCAtMTQ0LDEyICsxNDQsMTIgQEAKICAgICAgIDxwPjxpbWcgc3JjPSJpbWcvZ3JhcGgtZ2xvYmUucG5nIiBzdHlsZT0iZmxvYXQ6bGVmdDt3aWR0aDoxNSU7cGFkZGluZzoxMHB4OyI+IEEgPHN0cm9uZz5ncmFwaDwvc3Ryb25nPiBpcyBhIHN0cnVjdHVyZSBjb21wb3NlZCBvZiA8c3Ryb25nPnZlcnRpY2VzPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmVkZ2VzPC9zdHJvbmc+LgogICAgICAgICAgQm90aCB2ZXJ0aWNlcyBhbmQgZWRnZXMgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBrZXkvdmFsdWUtcGFpcnMgY2FsbGVkIDxzdHJvbmc+cHJvcGVydGllczwvc3Ryb25nPi4KICAgICAgICAgIFZlcnRpY2VzIGRlbm90ZSBkaXNjcmV0ZSBvYmplY3RzIHN1Y2ggYXMgYSBwZXJzb24sIGEgcGxhY2UsIG9yIGFuIGV2ZW50LiBFZGdlcyBkZW5vdGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHZlcnRpY2VzLiBGb3IgaW5zdGFuY2UsIGEgcGVyc29uIG1heSBrbm93Ci0gICAgICAgICBhbm90aGVyIHBlcnNvbiwgaGF2ZSBiZWVuIGludm9sdmVkIGluIGFuIGV2ZW50LCBhbmQvb3Igd2FzIHJlY2VudGx5IGF0IGEgcGFydGljdWxhciBwbGFjZS4gUHJvcGVydGllcyBleHByZXNzIG5vbi1yZWxhdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICAgdmVydGljZXMgYW5kIGVkZ2VzLiBFeGFtcGxlIHByb3BlcnRpZXMgaW5jbHVkZSBhIHZlcnRleCBoYXZpbmcgYSBuYW1lLCBhbiBhZ2UgYW5kIGFuIGVkZ2UgaGF2aW5nIGEgdGltZXN0YW1wIGFuZC9vciBhIHdlaWdodC4gVG9nZXRoZXIsIHRoZSBhZm9yZW1lbnRpb25lZAorICAgICAgICAgYW5vdGhlciBwZXJzb24sIGhhdmUgYmVlbiBpbnZvbHZlZCBpbiBhbiBldmVudCwgYW5kL29yIGhhdmUgcmVjZW50bHkgYmVlbiBhdCBhIHBhcnRpY3VsYXIgcGxhY2UuIFByb3BlcnRpZXMgZXhwcmVzcyBub24tcmVsYXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgIHZlcnRpY2VzIGFuZCBlZGdlcy4gRXhhbXBsZSBwcm9wZXJ0aWVzIGluY2x1ZGUgYSB2ZXJ0ZXggaGF2aW5nIGEgbmFtZSBhbmQgYW4gYWdlLCBhbmQgYW4gZWRnZSBoYXZpbmcgYSB0aW1lc3RhbXAgYW5kL29yIGEgd2VpZ2h0LiBUb2dldGhlciwgdGhlIGFmb3JlbWVudGlvbmVkCiAgICAgICAgICBncmFwaCBpcyBrbm93biBhcyBhIDxzdHJvbmc+cHJvcGVydHkgZ3JhcGg8L3N0cm9uZz4gYW5kIGl0IGlzIHRoZSBmb3VuZGF0aW9uYWwgZGF0YSBzdHJ1Y3R1cmUgb2YgQXBhY2hlIFRpbmtlclBvcC4KICAgICAgIDwvcD4KICAgICAgIDxici8+Ci0gICAgICA8cD48aW1nIHNyYz0iaW1nL2dyYXBoLXZzLXRhYmxlLnBuZyIgc3R5bGU9ImZsb2F0OnJpZ2h0O3dpZHRoOjIyJTtwYWRkaW5nOjEwcHg7Ij5JZiBhIHVzZXIncyBkb21haW4gaXMgY29tcG9zZWQgb2YgYSBoZXRlcm9nZW5vdXMgc2V0IG9mIG9iamVjdHMgKHZlcnRpY2VzKSB0aGF0IGNhbiBiZSByZWxhdGVkIHRvIG9uZSBhbm90aGVyIGluIGEgbXVsdGl0dWRlIG9mIHdheXMgKGVkZ2VzKSwKKyAgICAgIDxwPjxpbWcgc3JjPSJpbWcvZ3JhcGgtdnMtdGFibGUucG5nIiBzdHlsZT0iZmxvYXQ6cmlnaHQ7d2lkdGg6MjIlO3BhZGRpbmc6MTBweDsiPklmIGEgdXNlcidzIGRvbWFpbiBpcyBjb21wb3NlZCBvZiBhIGhldGVyb2dlbmVvdXMgc2V0IG9mIG9iamVjdHMgKHZlcnRpY2VzKSB0aGF0IGNhbiBiZSByZWxhdGVkIHRvIG9uZSBhbm90aGVyIGluIGEgbXVsdGl0dWRlIG9mIHdheXMgKGVkZ2VzKSwKICAgICAgICAgIHRoZW4gYSBncmFwaCBtYXkgYmUgdGhlIHJpZ2h0IHJlcHJlc2VudGF0aW9uIHRvIHVzZS4gSW4gYSBncmFwaCwgZWFjaCB2ZXJ0ZXggaXMgc2VlbiBhcyBhbiBhdG9taWMgZW50aXR5IChub3Qgc2ltcGx5IGEgInJvdyBpbiBhIHRhYmxlIikgdGhhdAogICAgICAgICAgY2FuIGJlIGxpbmtlZCB0byBhbnkgb3RoZXIgdmVydGV4IG9yIGhhdmUgcHJvcGVydGllcyBhZGRlZCBvciByZW1vdmVkIGF0IHdpbGwuIFRoaXMgZW1wb3dlcnMgdGhlIGRhdGEgbW9kZWxlciB0byB0aGluayBpbiB0ZXJtcyBvZiBhY3RvcnMgd2l0aGluCiAgICAgICAgICBhIHdvcmxkIG9mIGNvbXBsZXggcmVsYXRpb25zIGFzIG9wcG9zZWQgdG8sIGluIHJlbGF0aW9uYWwgZGF0YWJhc2VzLCBzdGF0aWNhbGx5LXR5cGVkIHRhYmxlcyBqb2luZWQgaW4gYWdncmVnYXRlLiBPbmNlIGEgZG9tYWluIGlzIG1vZGVsZWQsIHRoYXQKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgICAgICAgZWZmZWN0aXZlbHkgbGV2ZXJhZ2UgdGhhdCBzdHJ1Y3R1cmUuCiAgICAgICA8L3A+CiAgICAgICA8YnIvPgotICAgICAgPHA+PGEgaHJlZj0iIyI+PGltZyBzcmM9ImltZy9hcGFjaGUtdGlua2VycG9wLWxvZ28ucG5nIiBzdHlsZT0iZmxvYXQ6bGVmdDt3aWR0aDoyMiU7cGFkZGluZzoxMHB4OyIvPjwvYT5BcGFjaGUgVGlua2VyUG9wJnRyYWRlOyBpcyBhbiBvcGVuIHNvdXJjZSwgdmVuZG9yLWFnbm9zdGljLCBncmFwaCBjb21wdXRpbmcgZnJhbWV3b3JrIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBjb21tZXJjaWFsIGZyaWVuZGx5IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlMiBsaWNlbnNlPC9hPi4KKyAgICAgIDxwPjxhIGhyZWY9IiMiPjxpbWcgc3JjPSJpbWcvYXBhY2hlLXRpbmtlcnBvcC1sb2dvLnBuZyIgc3R5bGU9ImZsb2F0OmxlZnQ7d2lkdGg6MjIlO3BhZGRpbmc6MTBweDsiLz48L2E+QXBhY2hlIFRpbmtlclBvcCZ0cmFkZTsgaXMgYW4gb3BlbiBzb3VyY2UsIHZlbmRvci1hZ25vc3RpYywgZ3JhcGggY29tcHV0aW5nIGZyYW1ld29yayBkaXN0cmlidXRlZCB1bmRlciB0aGUgY29tbWVyY2lhbCBmcmllbmRseSA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5BcGFjaGUyIGxpY2Vuc2U8L2E+LgogICAgICAgICAgV2hlbiBhIGRhdGEgc3lzdGVtIGlzIDxhIGhyZWY9InByb3ZpZGVycy5odG1sIj5UaW5rZXJQb3AtZW5hYmxlZDwvYT4sIGl0cyB1c2VycyBhcmUgYWJsZSB0byBtb2RlbCB0aGVpciBkb21haW4gYXMgYSBncmFwaCBhbmQgYW5hbHl6ZSB0aGF0IGdyYXBoIHVzaW5nIHRoZSA8YSBocmVmPSJncmVtbGluLmh0bWwiPkdyZW1saW4gZ3JhcGggdHJhdmVyc2FsIGxhbmd1YWdlPC9hPi4KICAgICAgICAgIEZ1cnRoZXJtb3JlLCBhbGwgVGlua2VyUG9wLWVuYWJsZWQgc3lzdGVtcyBpbnRlZ3JhdGUgd2l0aCBvbmUgYW5vdGhlciBhbGxvd2luZyB0aGVtIHRvIGVhc2lseSBleHBhbmQgdGhlaXIgb2ZmZXJpbmdzIGFzIHdlbGwgYXMgYWxsb3dpbmcgdXNlcnMgdG8gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBncmFwaAogICAgICAgICAgdGVjaG5vbG9neSBmb3IgdGhlaXIgYXBwbGljYXRpb24uIFNvbWV0aW1lcyBhbiBhcHBsaWNhdGlvbiBpcyBiZXN0IHNlcnZlZCBieSBhbiBpbi1tZW1vcnksIHRyYW5zYWN0aW9uYWwgZ3JhcGggZGF0YWJhc2UuIFNvbWV0aW1lcyBhIG11bHRpLW1hY2hpbmUgZGlzdHJpYnV0ZWQgZ3JhcGggZGF0YWJhc2Ugd2lsbCBkbyB0aGUgam9iLgpAQCAtMTcyLDExICsxNzIsMTEgQEAKICAgICAgIDxkaXYgY2xhc3M9ImNvbC14cy0xMiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXhzLTgiPgotICAgICAgICAgICAgICAgVGlua2VyUG9wIGlzIGFuIG9wZW4gc291cmNlIHByb2plY3QgdGhhdCA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L2Rldi9kZXZlbG9wZXIjX2NvbnRyaWJ1dGluZyI+d2VsY29tZXMgY29udHJpYnV0aW9uczwvYT4uIFRoZXJlIGFyZSBtYW55IHdheXMgdG8gZ2V0IGludm9sdmVkOgorICAgICAgICAgICAgICAgVGlua2VyUG9wIGlzIGFuIG9wZW4gc291cmNlIHByb2plY3QgdGhhdCA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9kZXYvZGV2ZWxvcGVyI19jb250cmlidXRpbmciPndlbGNvbWVzIGNvbnRyaWJ1dGlvbnM8L2E+LiBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIGdldCBpbnZvbHZlZDoKICAgICAgICAgICAgICAgIDxwLz4KICAgICAgICAgICAgICAgIDxvbD4KICAgICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgIEpvaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9ncmVtbGluLXVzZXJzIj5HcmVtbGluLVVzZXJzPC9hPiBwdWJsaWMgbWFpbGluZyBsaXN0LgorICAgICAgICAgICAgICAgICAgICAgSm9pbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9ncmVtbGluLXVzZXJzIj5HcmVtbGluLVVzZXJzPC9hPiBwdWJsaWMgbWFpbGluZyBsaXN0LgogICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkhlbHAgdXNlcnMgYnkgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhbmQgZGVtb25zdHJhdGluZyB5b3VyIGV4cGVydGlzZSBpbiBUaW5rZXJQb3AgYW5kIGdyYXBocy48L2xpPgogICAgICAgICAgICAgICAgICAgICAgPC91bD4KQEAgLTE5OSwxNyArMTk5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICA8bGk+QmVjb21lIGEgVGlua2VyUG9wIENvbW1pdHRlciBhbmQgaGVscCBkZXRlcm1pbmUgdGhlIGV2b2x1dGlvbiBvZiBUaGUgVGlua2VyUG9wLjwvbGk+CiAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9vbD4KLSAgICAgICAgICAgICAgIDxwPlRvIGJ1aWxkIFRpbmtlclBvcCBmcm9tIHNvdXJjZSwgcGxlYXNlIHJldmlldyB0aGUgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9kZXYvZGV2ZWxvcGVyLyNidWlsZGluZy10ZXN0aW5nIj5kZXZlbG9wZXIgZG9jdW1lbnRhdGlvbjwvYT4uCisgICAgICAgICAgICAgICA8cD5UbyBidWlsZCBUaW5rZXJQb3AgZnJvbSBzb3VyY2UsIHBsZWFzZSByZXZpZXcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L2Rldi9kZXZlbG9wZXIvI2J1aWxkaW5nLXRlc3RpbmciPmRldmVsb3BlciBkb2N1bWVudGF0aW9uPC9hPi4KICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXhzLTQiPgotICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9kZXYvZGV2ZWxvcGVyLyI+PGltZyBzcmM9ImltZy9ncmVtbGluLWFwYWNoZS5wbmciIHdpZHRoPSIyNTAiIGNsYXNzPSJpbWctcmVzcG9uc2l2ZSIgLz48L2E+CisgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9kZXYvZGV2ZWxvcGVyLyI+PGltZyBzcmM9ImltZy9ncmVtbGluLWFwYWNoZS5wbmciIHdpZHRoPSIyNTAiIGNsYXNzPSJpbWctcmVzcG9uc2l2ZSIgLz48L2E+CiAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGgzPkNvbW11bml0eSBDb250cmlidXRpb25zPC9oMz4KICAgICAgICAgIFRpbmtlclBvcCBpcyBhdCB0aGUgY2VudGVyIG9mIGEgbGFyZ2VyIGRldmVsb3BtZW50IGVjb3N5c3RlbSB0aGF0IGV4dGVuZHMgb24gaXRzIGNvcmUgaW50ZXJmYWNlcywgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgaWRlYXMuICBUaGUgZ3JhcGggc3lzdGVtcyBhbmQgbGlicmFyaWVzIGJlbG93IHJlcHJlc2VudCBib3RoCi0gICAgICAgICBUaW5rZXJQb3AtbWFpbnRhaW5lZCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25zIGFzIHdlbGwgYXMgdGhpcmQtcGFydHkgbWFuYWdlZCBwcm9qZWN0cy4gVGhlIFRpbmtlclBvcCBjb21tdW5pdHkgaXMgYWx3YXlzIGludGVyZXN0ZWQgaW4gaGVhcmluZyBhYm91dCBwcm9qZWN0cyBsaWtlIHRoZXNlIGFuZCBhaWRpbmcKKyAgICAgICAgIFRpbmtlclBvcC1tYWludGFpbmVkIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbnMgYW5kIHRoaXJkLXBhcnR5IG1hbmFnZWQgcHJvamVjdHMuIFRoZSBUaW5rZXJQb3AgY29tbXVuaXR5IGlzIGFsd2F5cyBpbnRlcmVzdGVkIGluIGhlYXJpbmcgYWJvdXQgcHJvamVjdHMgbGlrZSB0aGVzZSBhbmQgYWlkaW5nCiAgICAgICAgICBpbiB0aGVpciBzdXBwb3J0LiBQbGVhc2UgcmVhZCBvdXIgPGEgaHJlZj0icG9saWN5Lmh0bWwiPnByb3ZpZGVyIGxpc3RpbmcgcG9saWN5PC9hPiBhbmQgZmVlbCBmcmVlIHRvIHByb21vdGUgc3VjaCBwcm9qZWN0cyBvbiB0aGUgdXNlciBhbmQgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdHMuIEluZm9ybWF0aW9uIG9uCi0gICAgICAgICBob3cgdG8gYnVpbGQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSB2YXJpb3VzIGludGVyZmFjZXMgdGhhdCBUaW5rZXJQb3AgZXhwb3NlcyBjYW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvZGV2L3Byb3ZpZGVyLyI+UHJvdmlkZXIgRG9jdW1lbnRhdGlvbjwvYT4uCisgICAgICAgICBob3cgdG8gYnVpbGQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSB2YXJpb3VzIGludGVyZmFjZXMgdGhhdCBUaW5rZXJQb3AgZXhwb3NlcyBjYW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L2Rldi9wcm92aWRlci8iPlByb3ZpZGVyIERvY3VtZW50YXRpb248L2E+LgogICAgICAgICAgPHAvPgogICAgICAgICAgPGEgbmFtZT0iZ3JhcGgtc3lzdGVtcyI+PC9hPgogICAgICAgICAgPGg0IGlkPSJncmFwaC1zeXN0ZW1zIj5HcmFwaCBTeXN0ZW1zPC9oND4KQEAgLTIyMiwyMiArMjIyLDIzIEBACiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JsYXplZ3JhcGgvdGlua2VycG9wMyI+QmxhemVncmFwaDwvYT4gLSBSREYgZ3JhcGggZGF0YWJhc2Ugd2l0aCBPTFRQIHN1cHBvcnQuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9jb3Ntb3MtZGIvZ3JhcGgtaW50cm9kdWN0aW9uIj5Db3Ntb3NEQjwvYT4gLSBNaWNyb3NvZnQncyBkaXN0cmlidXRlZCBPTFRQIGdyYXBoIGRhdGFiYXNlLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL01hcnRpbkhhZXVzbGVyL2Nocm9ub3MvdHJlZS9tYXN0ZXIvb3JnLmNocm9ub3MuY2hyb25vZ3JhcGgiPkNocm9ub0dyYXBoPC9hPiAtIEEgdmVyc2lvbmVkIGdyYXBoIGRhdGFiYXNlLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5kYXRhc3RheC5jb20vcHJvZHVjdHMvZGF0YXN0YXgtZW50ZXJwcmlzZS1ncmFwaCI+RFNFR3JhcGg8L2E+IC0gRGF0YVN0YXggZ3JhcGggZGF0YWJhc2Ugd2l0aCBPTFRQIGFuZCBPTEFQIHN1cHBvcnQuPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhc3RheC5jb20vcHJvZHVjdHMvZGF0YXN0YXgtZW50ZXJwcmlzZS1ncmFwaCI+RFNFR3JhcGg8L2E+IC0gRGF0YVN0YXggZ3JhcGggZGF0YWJhc2Ugd2l0aCBPTFRQIGFuZCBPTEFQIHN1cHBvcnQuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dyYWtuLmFpLyI+R1JBS04uQUk8L2E+IC0gRGlzdHJpYnV0ZWQgT0xUUC9PTEFQIGtub3dsZWRnZSBncmFwaCBzeXN0ZW0uPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcmtncmFwaGNvbXB1dGVyIj5IYWRvb3AgKFNwYXJrKTwvYT4gLSBPTEFQIGdyYXBoIHByb2Nlc3NvciB1c2luZyBTcGFyay48L2xpPgorICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcmtncmFwaGNvbXB1dGVyIj5IYWRvb3AgKFNwYXJrKTwvYT4gLSBPTEFQIGdyYXBoIHByb2Nlc3NvciB1c2luZyBTcGFyay48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yYXlva290YS9oZ3JhcGhkYiI+SEdyYXBoREI8L2E+IC0gT0xUUCBncmFwaCBkYXRhYmFzZSBydW5uaW5nIG9uIEFwYWNoZSBIQmFzZS48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3Lmh1YXdlaWNsb3VkLmNvbS9lbi11cy9wcm9kdWN0L2dlcy5odG1sIj5IdWF3ZWkgR3JhcGggRW5naW5lIFNlcnZpY2U8L2E+IC0gRnVsbHktbWFuYWdlZCwgZGlzdHJpYnV0ZWQsIGF0LXNjYWxlIGdyYXBoIHF1ZXJ5IGFuZCBhbmFseXNpcyBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgYSB2aXN1YWxpemVkIGludGVyYWN0aXZlIGFuYWx5dGljcyBwbGF0Zm9ybS48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vY29uc29sZS5uZy5ibHVlbWl4Lm5ldC9jYXRhbG9nL3NlcnZpY2VzL2libS1ncmFwaC8iPklCTSBHcmFwaDwvYT4gLSBPTFRQIGdyYXBoIGRhdGFiYXNlIGFzIGEgc2VydmljZS48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYW51c2dyYXBoLm9yZy8iPkphbnVzR3JhcGg8L2E+IC0gRGlzdHJpYnV0ZWQgT0xUUCBhbmQgT0xBUCBncmFwaCBkYXRhYmFzZSB3aXRoIEJlcmtlbGV5REIsIEFwYWNoZSBDYXNzYW5kcmEgYW5kIEFwYWNoZSBIQmFzZSBzdXBwb3J0LjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvZHluYW1vZGItamFudXNncmFwaC1zdG9yYWdlLWJhY2tlbmQvLyI+SmFudXNHcmFwaCAoQW1hem9uKTwvYT4gLSBUaGUgQW1hem9uIER5bmFtb0RCIFN0b3JhZ2UgQmFja2VuZCBmb3IgSmFudXNHcmFwaC48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNuZW80ai1ncmVtbGluIj5OZW80ajwvYT4gLSBPTFRQIGdyYXBoIGRhdGFiYXNlIChlbWJlZGRlZCBhbmQgaGlnaCBhdmFpbGFiaWxpdHkpLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNuZW80ai1ncmVtbGluIj5OZW80ajwvYT4gLSBPTFRQIGdyYXBoIGRhdGFiYXNlIChlbWJlZGRlZCBhbmQgaGlnaCBhdmFpbGFiaWxpdHkpLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1N0ZWVsQnJpZGdlTGFicy9uZW80ai1ncmVtbGluLWJvbHQiPm5lbzRqLWdyZW1saW4tYm9sdDwvYT4gLSBPTFRQIGdyYXBoIGRhdGFiYXNlICh1c2luZyBCb2x0IFByb3RvY29sKS48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vcmllbnRlY2hub2xvZ2llcy9vcmllbnRkYi1ncmVtbGluIj5PcmllbnREQjwvYT4gLSBPTFRQIGdyYXBoIGRhdGFiYXNlPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vczJncmFwaC5hcGFjaGUub3JnLyI+QXBhY2hlIFMyR3JhcGg8L2E+IC0gT0xUUCBncmFwaCBkYXRhYmFzZSBydW5uaW5nIG9uIEFwYWNoZSBIQmFzZS48L2xpPgorICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9TaGlmdExlZnRTZWN1cml0eS9vdmVyZmxvd2RiIj5PdmVyZmxvd0RCPC9hPiAtIEluLW1lbW9yeSBncmFwaCBkYXRhYmFzZSB3aXRoIGxvdyBtZW1vcnkgZm9vdHByaW50PC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3MyZ3JhcGguYXBhY2hlLm9yZy8iPkFwYWNoZSBTMkdyYXBoPC9hPiAtIE9MVFAgZ3JhcGggZGF0YWJhc2UgcnVubmluZyBvbiBBcGFjaGUgSEJhc2UuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcGlldGVybWFydGluL3NxbGciPlNxbGc8L2E+IC0gT0xUUCBpbXBsZW1lbnRhdGlvbiBvbiBTUUwgZGF0YWJhc2VzLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3N0YXJkb2cuY29tLyI+U3RhcmRvZzwvYT4gLSBSREYgZ3JhcGggZGF0YWJhc2Ugd2l0aCBPTFRQIGFuZCBPTEFQIHN1cHBvcnQuPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jdGlua2VyZ3JhcGgtZ3JlbWxpbiI+VGlua2VyR3JhcGg8L2E+IC0gSW4tbWVtb3J5IE9MVFAgYW5kIE9MQVAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RoaW5rYXVyZWxpdXMuZ2l0aHViLmlvL3RpdGFuLyI+VGl0YW48L2E+IC0gRGlzdHJpYnV0ZWQgT0xUUCBhbmQgT0xBUCBncmFwaCBkYXRhYmFzZSB3aXRoIEJlcmtlbGV5REIsIEFwYWNoZSBDYXNzYW5kcmEgYW5kIEFwYWNoZSBIQmFzZSBzdXBwb3J0LjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9zdGFyZG9nLmNvbS8iPlN0YXJkb2c8L2E+IC0gUkRGIGdyYXBoIGRhdGFiYXNlIHdpdGggT0xUUCBhbmQgT0xBUCBzdXBwb3J0LjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyN0aW5rZXJncmFwaC1ncmVtbGluIj5UaW5rZXJHcmFwaDwvYT4gLSBJbi1tZW1vcnkgT0xUUCBhbmQgT0xBUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RoaW5rYXVyZWxpdXMuZ2l0aHViLmlvL3RpdGFuLyI+VGl0YW48L2E+IC0gRGlzdHJpYnV0ZWQgT0xUUCBhbmQgT0xBUCBncmFwaCBkYXRhYmFzZSB3aXRoIEJlcmtlbGV5REIsIEFwYWNoZSBDYXNzYW5kcmEgYW5kIEFwYWNoZSBIQmFzZSBzdXBwb3J0LjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvZHluYW1vZGItdGl0YW4tc3RvcmFnZS1iYWNrZW5kIj5UaXRhbiAoQW1hem9uKTwvYT4gLSBUaGUgQW1hem9uIER5bmFtb0RCIHN0b3JhZ2UgYmFja2VuZCBmb3IgVGl0YW4uPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2xhc3NtZXRob2QvdHVwbC10aXRhbi1zdG9yYWdlLWJhY2tlbmQiPlRpdGFuIChUdXBsKTwvYT4gLSBUaGUgVHVwbCBzdG9yYWdlIGJhY2tlbmQgZm9yIFRpdGFuLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JtYWdlbi91bmlwb3AiPlVuaXBvcDwvYT4gLSBPTFRQIEVsYXN0aWNzZWFyY2ggYW5kIEpEQkMgYmFja2VkIGdyYXBoLjwvbGk+CkBAIC0yNDYsMjIgKzI0NywyNCBAQAogICAgICAgICAgPGg0IGlkPSJsYW5ndWFnZS12YXJpYW50cy1jb21waWxlcnMiPlF1ZXJ5IExhbmd1YWdlczwvaDQ+CiAgICAgICAgICA8c21hbGw+WzxhIGhyZWY9InByb3ZpZGVycy5odG1sI3F1ZXJ5LWxhbmd1YWdlLXByb3ZpZGVycyI+bGVhcm4gbW9yZTwvYT5dPC9zbWFsbD4KICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3BlbmN5cGhlci9jeXBoZXItZm9yLWdyZW1saW4iPmN5cGhlci1mb3ItZ3JlbWxpbjwvYT4gLSBBIEN5cGhlciB0byBHcmVtbGluIHRyYXZlcnNhbCB0cmFuc3BpbGVyLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29wZW5jeXBoZXIvY3lwaGVyLWZvci1ncmVtbGluIj5jeXBoZXItZm9yLWdyZW1saW48L2E+IC0gQSBDeXBoZXItdG8tR3JlbWxpbiB0cmF2ZXJzYWwgdHJhbnNwaWxlci48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zeW5jbGV1cy5jb20vRmVybWEvIj5GZXJtYTwvYT4gKGphdmEvZHNsKSAtIEFuIE9STSAvIE9HTSBmb3IgQXBhY2hlIFRpbmtlclBvcC48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlYnNob3cvZ29ibGluIj5Hb2JsaW48L2E+IChweXRob24vZHNsKSAtIEdvYmxpbiBPR00gZm9yIHRoZSBUaW5rZXJQb3AgMyBHcmVtbGluIFNlcnZlci48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLURvdE5ldCI+R3JlbWxpbi5OZXQ8L2E+ICguTkVUIC0gQyMvdmFyaWFudCkgLSBHcmVtbGluIGhvc3RlZCBpbiBDIyBmb3IgdXNlIHdpdGggYW55IC5ORVQtYmFzZWQgVk0uPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1qYXZhc2NyaXB0Ij5ncmVtbGluLWphdmFzY3JpcHQ8L2E+IChqcykgLSBHcmVtbGluIGhvc3RlZCBpbiBKYXZhU2NyaXB0IGZvciB1c2Ugd2l0aCBOb2RlLmpzLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLURvdE5ldCI+R3JlbWxpbi5OZXQ8L2E+ICguTkVUIC0gQyMvdmFyaWFudCkgLSBHcmVtbGluIGhvc3RlZCBpbiBDIyBmb3IgdXNlIHdpdGggYW55IC5ORVQtYmFzZWQgVk0uPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tamF2YXNjcmlwdCI+Z3JlbWxpbi1qYXZhc2NyaXB0PC9hPiAoanMpIC0gR3JlbWxpbiBob3N0ZWQgaW4gSmF2YVNjcmlwdCBmb3IgdXNlIHdpdGggTm9kZS5qcy48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ncmVtbGluLW9ybS9ncmVtbGluLW9ybSI+Z3JlbWxpbi1vcm08L2E+IChqYXZhc2NyaXB0KSBHcmVtbGluIE9STSBmb3IgTm9kZS5qcy48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLXB5dGhvbiI+Z3JlbWxpbi1weXRob248L2E+IChweXRob24vdmFyaWFudCkgLSBHcmVtbGluIGhvc3RlZCBpbiBQeXRob24gZm9yIHVzZSB3aXRoIGFueSBQeXRob24tYmFzZWQgVk0uPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tcHl0aG9uIj5ncmVtbGluLXB5dGhvbjwvYT4gKHB5dGhvbi92YXJpYW50KSAtIEdyZW1saW4gaG9zdGVkIGluIFB5dGhvbiBmb3IgdXNlIHdpdGggYW55IFB5dGhvbi1iYXNlZCBWTS48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lbWVocmtheS9ncmVtbGlucHkiPmdyZW1saW4tcHk8L2E+IChweXRob24vdmFyaWFudCkgLSBXcml0ZSBwdXJlIFB5dGhvbiBHcmVtbGluIHRoYXQgY2FuIGJlIHNlbnQgdG8gR3JlbWxpbiBTZXJ2ZXIuPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vd29sZjRvb2QvZ3JlbWxpbi1ycyI+Z3JlbWxpbi1yczwvYT4gKHJ1c3QvdmFyaWFudCkgLSBBIEdyZW1saW4gU2VydmVyIGRyaXZlciBhbmQgbGFuZ3VhZ2UgdmFyaWFudCBmb3IgUnVzdC48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tcG9sbG1laWVyL2dyZW1saW4tc2NhbGEiPmdyZW1saW4tc2NhbGE8L2E+IChzY2FsYS92YXJpYW50KSAtIEEgU2NhbGEtYmFzZWQgR3JlbWxpbiBsYW5ndWFnZSB2YXJpYW50IGZvciBUaW5rZXJQb3AzLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2thcnRoaWNrcy9ncmVtbGluLW9nbSI+Z3JlbWxpbi1vYmplY3RzPC9hPiAoamF2YS9kc2wpIC0gQW4gT2JqZWN0IEdyYXBoIE1hcHBpbmcgTGlicmFyeSBGb3IgR3JlbWxpbi48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYm11c3NvL2dyZW1saW4tdGVtcGxhdGUtc3RyaW5nIj5ncmVtbGluLXRlbXBsYXRlLXN0cmluZzwvYT4gKGpzL3ZhcmlhbnQpIC0gQSBHcmVtbGluIGxhbmd1YWdlIGJ1aWxkZXIuPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGVidWctaXRvL2dyZXNrZWxsIj5ncmVza2VsbDwvYT4gKGhhc2tlbGwvdmFyaWFudCkgLSBIYXNrZWxsIGJpbmRpbmcgZm9yIEdyZW1saW4gZ3JhcGggcXVlcnkgbGFuZ3VhZ2UuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGF2ZWJzaG93L2lweXRob24tZ3JlbWxpbiI+aXB5dGhvbi1ncmVtbGluPC9hPiAocHl0aG9uL3ZhcmlhbnQpIC0gR3JlbWxpbiBpbiBJUHl0aG9uIGFuZCBKdXB5dGVyLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3BtLWRldi9rb3RsaW4tZ3JlbWxpbi1vZ20iPmtvdGxpbi1ncmVtbGluLW9nbTwvYT4gKGtvdGxpbi9kc2wpIC0gQW4gT2JqZWN0IEdyYXBoIE1hcHBpbmcgTGlicmFyeSBmb3IgS290bGluIGFuZCBHcmVtbGluLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL29ncmUuY2xvanVyZXdlcmt6Lm9yZy8iPm9ncmU8L2E+IChjbG9qdXJlL3ZhcmlhbnQpIC0gQSBDbG9qdXJlIGxhbmd1YWdlIHdyYXBwZXIgZm9yIFRpbmtlclBvcDMuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYmF5b2ZtYW55LmdpdGh1Yi5pby8iPlBlYXBvZDwvYT4gKGphdmEvZHNsKSAtIEFuIG9iamVjdC1ncmFwaC13cmFwcGVyLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI3NwYXJxbC1ncmVtbGluIj5zcGFycWwtZ3JlbWxpbjwvYT4gKHNwYXJxbC9kaXN0aW5jdCkgLSBBIFNQQVJRTCB0byBHcmVtbGluIHRyYXZlcnNhbCBjb21waWxlci48L2xpPgorICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcnFsLWdyZW1saW4iPnNwYXJxbC1ncmVtbGluPC9hPiAoc3BhcnFsL2Rpc3RpbmN0KSAtIEEgU1BBUlFMIHRvIEdyZW1saW4gdHJhdmVyc2FsIGNvbXBpbGVyLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9zcHJpbmctZGF0YS1ncmVtbGluIj5zcHJpbmctZGF0YS1ncmVtbGluPC9hPiAoamF2YS9kc2wpIC0gU3ByaW5nIERhdGEgc3VwcG9ydCBmb3IgVGlua2VyUG9wLWVuYWJsZWQgZ3JhcGggc3lzdGVtcy48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2lsbWVzL3NxbC1ncmVtbGluIj5zcWwtZ3JlbWxpbjwvYT4gKHNxbC9kaXN0aW5jdCkgLSBBbiBTUUwgdG8gR3JlbWxpbiB0cmF2ZXJzYWwgY29tcGlsZXIuPC9saT4KICAgICAgICAgIDwvdWw+CkBAIC0yNzAsMTIgKzI3MywxMyBAQAogICAgICAgICAgPHVsPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlYnNob3cvZ3JlbWxpbmNsaWVudCI+Z3JlbWxpbmNsaWVudDwvYT4gKHB5dGhvbikgLSBBbiBhc3luY2hyb25vdXMgUHl0aG9uIDIvMyBjbGllbnQgZm9yIEdyZW1saW4gU2VydmVyIHRoYXQgYWxsb3dzIGZvciBmbGV4aWJsZSBjb3JvdXRpbmUgc3ludGF4IC0gVHJvbGxpdXMsIFRvcm5hZG8sIEFzeW5jaW8uPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyY2Vsb2NmL2dyZW1saW5fY2xpZW50Ij5ncmVtbGluX2NsaWVudDwvYT4gKHJ1YnkpIC0gQSBHcmVtbGluIFNlcnZlciBkcml2ZXIgZm9yIFJ1YnkuPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jY29ubmVjdGluZy12aWEtamF2YSI+Z3JlbWxpbi1kcml2ZXI8L2E+IChqYXZhKSAtIEEgR3JlbWxpbiBTZXJ2ZXIgZHJpdmVyIGZvciBKYXZhLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNjb25uZWN0aW5nLXZpYS1qYXZhIj5ncmVtbGluLWRyaXZlcjwvYT4gKGphdmEpIC0gQSBHcmVtbGluIFNlcnZlciBkcml2ZXIgZm9yIEphdmEuPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbm9ydGh3ZXN0ZXJubXV0dWFsL2dyYW1tZXMiPmdyYW1tZXM8L2E+IChnbykgLSBBIHN0cm9uZ2x5IHR5cGVkIEdyZW1saW4gc2VydmVyIGRyaXZlciBmb3IgR28uPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcWFzYXVyL2dyZW1nbyI+Z3JlbWdvPC9hPiAoZ28pIC0gQSBHcmVtbGluIFNlcnZlciBkcml2ZXIgZm9yIEdvLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1Jldm1ha2VyL2dyZW1sZXgiPmdyZW1sZXg8L2E+IChlbGl4aXIpIC0gQSBHcmVtbGluIFNlcnZlciBkcml2ZXIgZm9yIEVsaXhpci48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLURvdE5ldCI+R3JlbWxpbi5OZXQ8L2E+ICguTkVUIC0gQyMpIC0gR3JlbWxpbiBTZXJ2ZXIgZHJpdmVyIGZvciAuTkVULjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLURvdE5ldCI+R3JlbWxpbi5OZXQ8L2E+ICguTkVUIC0gQyMpIC0gR3JlbWxpbiBTZXJ2ZXIgZHJpdmVyIGZvciAuTkVULjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1BvbW1lVmVydGUvZ3JlbWxpbi1waHAiPmdyZW1saW4tcGhwPC9hPiAocGhwKSAtIEEgR3JlbWxpbiBTZXJ2ZXIgZHJpdmVyIGZvciBQSFAuPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1weXRob24iPmdyZW1saW4tcHl0aG9uPC9hPiAocHl0aG9uKSAtIEdyZW1saW4gU2VydmVyIGRyaXZlciBmb3IgUHl0aG9uLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLXB5dGhvbiI+Z3JlbWxpbi1weXRob248L2E+IChweXRob24pIC0gR3JlbWxpbiBTZXJ2ZXIgZHJpdmVyIGZvciBQeXRob24uPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZ3JlbWxpbnJlc3RjbGllbnQucmVhZHRoZWRvY3Mub3JnL2VuL2xhdGVzdC8iPmdyZW1saW5yZXN0Y2xpZW50PC9hPiAocHl0aG9uKSAtIFB5dGhvbiAyLzMgbGlicmFyeSB0aGF0IHVzZXMgSFRUUCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBHcmVtbGluIFNlcnZlciBvdmVyIFJFU1QuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRXhSYW0vRXhSYW0uR3JlbWxpbnEiPkdyZW1saW5xPC9hPiAoLk5FVCkgLSBBIHN0cm9uZ2x5IHR5cGVkIHNlcnZlciBkcml2ZXIuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vd2luZGowMDcvcHl0aG9uLWdyZW1saW4tcmVzdCI+cHl0aG9uLWdyZW1saW4tcmVzdDwvYT4gKHB5dGhvbikgLSBBIFJFU1QtYmFzZWQgY2xpZW50IGZvciBHcmVtbGluIFNlcnZlci48L2xpPgpAQCAtMjg5LDYgKzI5Myw4IEBACiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZXhha2F0LmlvLyI+ZXhha2F0LmlvPC9hPiAtIFN0YXRpYyBhbmFseXNpcyBlbmdpbmUgZm9yIFBIUCwgcG93ZXJlZCBieSBHcmVtbGluLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9icmljYXVkLmdpdGh1Yi5pby9ncmFwaGV4cC9ncmFwaGV4cC5odG1sIj5HcmFwaGV4cDwvYT4gLSBJbnRlcmFjdGl2ZSB2aXN1YWxpemF0aW9uIG9mIHRoZSBHcmVtbGluIGdyYXBoIGRhdGFiYXNlIHdpdGggRDMuanMuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmVjaGJkL2dyZW1saW4taWRlIj5ncmVtbGluLWlkZTwvYT4gLSBBbiBJREUgZm9yIEFwYWNoZSBUaW5rZXJQb3AtZW5hYmxlZCBkYXRhYmFzZXMgdXNpbmcgUmVhY3QgYW5kIEVsZWN0cm9uLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9ncmVtbGlmeS5jb20vIj5ncmVtbGlmeTwvYT4gLSBBIEdyZW1saW4gd29ya3NwYWNlIGZvciBxdWVyaWVzIGFuZCB2aXN1YWxpemF0aW9uLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3ByYWJ1c2hpdGhhL2dyZW1saW4tdmlzdWFsaXplciI+R3JlbWxpbi1WaXN1YWxpemVyPC9hPiBBIHZpc3VhbGl6YXRpb24gdG9vbCBmb3IgdGhlIHJlc3VsdHMgb2YgZ3JlbWxpbiB0cmF2ZXJzYWxzLjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NhbWJyaWRnZS1pbnRlbGxpZ2VuY2UuY29tL2tleWxpbmVzLyI+S2V5TGluZXM8L2E+IC0gQSBKYXZhU2NyaXB0IFNESyBmb3IgYnVpbGRpbmcgcG93ZXJmdWwsIGN1c3RvbSBhbmQgc2NhbGFibGUgZ3JhcGggdmlzdWFsaXphdGlvbiBhcHBsaWNhdGlvbnMuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWVsdHdhdGVyL2p1Z3JpIj5KVUdSSTwvYT4gLSBBIEp1cHl0ZXIgR3JlbWxpbiBpbnRlcmZhY2UuPC9saT4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbGlua3VyaW8udXMvIj5MaW5rdXJpb3VzPC9hPiAtIEEgYnJvd3Nlci1iYXNlZCBncmFwaCB2aXN1YWxpemF0aW9uIHNvZnR3YXJlIHRvIHNlYXJjaCwgZXhwbG9yZSBhbmQgdmlzdWFsaXplIGNvbm5lY3RlZCBkYXRhLjwvbGk+CkBAIC0zMDMsMzcgKzMwOSwzNCBAQAogICAgICAgICAgZGV2ZWxvcG1lbnQsIHRlc3RpbmcsIGRvY3VtZW50YXRpb24sIGV0Yy4gc2tpbGxzIHRvIHRoZSBncm91cC4gVGhlc2UgaW5kaXZpZHVhbHMgY29udHJpYnV0ZSB0byBUaW5rZXJQb3AgYmV5b25kIHRoZSBldmVyLWNoYW5naW5nIHJlcXVpcmVtZW50cyBvZiB0aGVpciBkYXktdG8tZGF5IGpvYnMgYW5kIG1haW50YWluCiAgICAgICAgICByZXNwb25zaWJpbGl0eSBmb3IgdGhlaXIgY29udHJpYnV0aW9ucyB0aHJvdWdoIHRpbWUuCiAgICAgICAgICA8cC8+Ci0gICAgICAgICA8IS0tIHRvIGJlIHVuY29tbWVudGVkIGFzIG5lY2Vzc2FyeSwganVzdCBlc3RhYmxpc2hpbmcgdGhlIHRlbXBsYXRlIC0tLS0tLS0tLS0tCiAgICAgICAgICA8aDQgaWQ9ImNvbnRyaWJ1dG9ycy1hY3RpdmUiPkFjdGl2ZTwvaDQ+Ci0gICAgICAgICAtLT4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWFya29yb2RyaWd1ZXouY29tIj5NYXJrbyBBLiBSb2RyaWd1ZXo8L2E+ICgyMDA5IC0gUE1DKTogR3JlbWxpbiBsYW5ndWFnZSwgR3JlbWxpbiBtYWNoaW5lLCBkb2N1bWVudGF0aW9uLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2tldHJpbmFkcmF3c2Fsb3QudHVtYmxyLmNvbSI+S2V0cmluYSBZaW08L2E+ICgyMDA5IC0gQ29tbWl0dGVyKTogSWxsdXN0cmF0b3IsIGNyZWF0b3Igb2YgR3JlbWxpbiBhbmQgaGlzIG1lcnJ5IGJhbmQgb2Ygcm9ib3RzLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2pvc2h1YXNoaW5hdmllci8iPkpvc2h1YSBTaGluYXZpZXI8L2E+ICgyMDA5IC0gQ29tbWl0dGVyKTogR3JhcGggZGF0YSBtb2RlbHMsIHNlbWFudGljcywgYW5kIGludGVyb3BlcmFiaWxpdHk8L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20vIj5TdGVwaGVuIE1hbGxldHRlPC9hPiAoMjAxMSAtIFBNQyBDaGFpcik6IEdyZW1saW4gQ29uc29sZS9TZXJ2ZXIvRHJpdmVyLCBMYW5ndWFnZSBWYXJpYW50cyBhbmQgZ2VuZXJhbCBjb3JlIGRldmVsb3BtZW50LjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phbWVzdGhvcm50b24uY29tLyI+SmFtZXMgVGhvcm50b248L2E+ICgyMDEzIC0gUE1DKTogUHJvbW90aW9ucywgZXZhbmdlbGlzbS48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9ncmVtbGluLmd1cnUiPkRhbmllbCBLdXBwaXR6PC9hPiAoMjAxNCAtIFBNQyk6IEdyZW1saW4gbGFuZ3VhZ2UgZGVzaWduLCBiZW5jaG1hcmtpbmcsIHRlc3RpbmcsIGRvY3VtZW50YXRpb24sIG1haWxpbmcgbGlzdCBzdXBwb3J0LjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2h6YmFyY2VhIj5IYWRyaWFuIFpiYXJjZWE8L2E+ICgyMDE1IC0gUE1DKTogUHJvamVjdCBtZW50b3IsIHByb3ZpZGVyIGxpYXNvbi48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9IdW1iZWRvb2giPkRhbmllbCBHcnVubzwvYT4gKDIwMTUgLSBQTUMpOiBQcm9qZWN0IG1lbnRvciwgaW5mcmFzdHJ1Y3R1cmUgbGlhc29uLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21oZnJhbnR6Ij5NYXR0IEZyYW50ejwvYT4gKDIwMTUgLSBDb21taXR0ZXIpOiBHcmVtbGluIGxhbmd1YWdlIGRlc2lnbiwgdHMtdGlua2VycG9wLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3BsdXJhZGoiPkphc29uIFBsdXJhZDwvYT4gKDIwMTUgLSBQTUMpOiBHcmVtbGluIENvbnNvbGUvU2VydmVyLCBtYWlsaW5nIGxpc3Qgc3VwcG9ydC48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9keWxhbi1taWxsaWtpbi0zMjU2NzkzNCI+RHlsYW4gTWlsbGlraW48L2E+ICgyMDE1IC0gUE1DKTogR3JlbWxpbiBTZXJ2ZXIvRHJpdmVyLCBncmVtbGluLXBocCwgR3JlbWxpbkJpbiwgbWFpbGluZyBsaXN0IHN1cHBvcnQuPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdHdpbG1lcyI+VGVkIFdpbG1lczwvYT4gKDIwMTUgLSBQTUMpOiBQcm9tb3Rpb25zLCBtYWlsaW5nIGxpc3Qgc3VwcG9ydCwgYmVuY2htYXJraW5nLCBzcWwtZ3JlbWxpbi48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9waWV0ZXJtYXJ0aW4iPlBpZXRlciBNYXJ0aW48L2E+ICgyMDE2IC0gQ29tbWl0dGVyKTogR3JlbWxpbiBsYW5ndWFnZSwgU3FsZy48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYm11c3NvIj5KZWFuLUJhcHRpc3RlIE11c3NvPC9hPiAoMjAxNiAtIENvbW1pdHRlcik6IEdyZW1saW4gU2VydmVyIHRlc3RpbmcsIEdyZW1saW4gRHJpdmVyIChOb2RlLmpzL0phdmFTY3JpcHQpLCBtYWlsaW5nIGxpc3Qgc3VwcG9ydC48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubWljaGFlbHBvbGxtZWllci5jb20vIj5NaWNoYWVsIFBvbGxtZWllcjwvYT4gKDIwMTYgLSBDb21taXR0ZXIpOiBHcmVtbGluIGxhbmd1YWdlLCBHcmVtbGluLVNjYWxhLjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhdmVic2hvdyI+RGF2aWQgQnJvd248L2E+ICgyMDE2IC0gQ29tbWl0dGVyKTogUHl0aG9uIGxpYnJhcmllcywgR3JlbWxpbiBTZXJ2ZXIgdGVzdGluZy48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yb2JlcnRkYWxlIj5Sb2JlcnQgRGFsZTwvYT4gKDIwMTYgLSBQTUMpOiBHcmVtbGluIENvbnNvbGUvU2VydmVyLCBkb2N1bWVudGF0aW9uLCBtYWlsaW5nIGxpc3Qgc3VwcG9ydC48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qb3JnZWJheSI+Sm9yZ2UgQmF5PC9hPiAoMjAxNyAtIFBNQyk6IEdyYXBoQmluYXJ5IHNlcmlhbGl6YXRpb24sIEphdmFTY3JpcHQgYW5kIC5ORVQgbGlicmFyaWVzLCBtYWlsaW5nIGxpc3Qgc3VwcG9ydC48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9GbG9yaWFuSG9ja21hbm4vIj5GbG9yaWFuIEhvY2ttYW5uPC9hPiAoMjAxNyAtIFBNQyk6IC5ORVQgbGlicmFyaWVzLCBtYWlsaW5nIGxpc3Qgc3VwcG9ydC48L2xpPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cua2VsdmlubGF3cmVuY2UubmV0LyI+S2VsdmluIExhd3JlbmNlPC9hPiAoMjAxNyAtIENvbW1pdHRlcik6IERvY3VtZW50YXRpb24gYW5kIG1haWxpbmcgbGlzdCBzdXBwb3J0LjwvbGk+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2hhcnNodGhha2thci5pbi8iPkhhcnNoIFRoYWtrYXI8L2E+ICgyMDE4IC0gQ29tbWl0dGVyKTogR3JlbWxpbi1TUEFSUUwgbW9kdWxlLjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2RpdmlqdmFpZHlhLyI+RGl2aWogVmFpZHlhPC9hPiAoMjAxOSAtIENvbW1pdHRlcik6IEdyZW1saW4gc2VydmVyLWNsaWVudCBpbnRlcmFjdGlvbi48L2xpPgogICAgICAgICAgPC91bD4KLSAgICAgICAgIDwhLS0gdG8gYmUgdW5jb21tZW50ZWQgYXMgbmVjZXNzYXJ5LCBqdXN0IGVzdGFibGlzaGluZyB0aGUgdGVtcGxhdGUgLS0tLS0tLS0tLS0KICAgICAgICAgIDxoNCBpZD0iY29udHJpYnV0b3JzLWluYWN0aXZlIj5JbmFjdGl2ZTwvaDQ+CiAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3NvbWVvbmUuY29tLyI+Sm9obiBEb2U8L2E+ICgyMDE1IC0gMjAxNik6IENvbW1pdHRlci9QTUMsIE1vZHVsZSBYLCBNb2R1bGUgWSwgbWFpbGluZyBsaXN0IHN1cHBvcnQuPC9saT4KKyAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2tldHJpbmFkcmF3c2Fsb3QudHVtYmxyLmNvbSI+S2V0cmluYSBZaW08L2E+ICgyMDA5IC0gQ29tbWl0dGVyKTogSWxsdXN0cmF0b3IsIGNyZWF0b3Igb2YgR3JlbWxpbiBhbmQgaGlzIG1lcnJ5IGJhbmQgb2Ygcm9ib3RzLjwvbGk+CisgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYW1lc3Rob3JudG9uLmNvbS8iPkphbWVzIFRob3JudG9uPC9hPiAoMjAxMyAtIFBNQyk6IFByb21vdGlvbnMsIGV2YW5nZWxpc20uPC9saT4KKyAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2h6YmFyY2VhIj5IYWRyaWFuIFpiYXJjZWE8L2E+ICgyMDE1IC0gUE1DKTogUHJvamVjdCBtZW50b3IsIHByb3ZpZGVyIGxpYXNvbi48L2xpPgorICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vSHVtYmVkb29oIj5EYW5pZWwgR3J1bm88L2E+ICgyMDE1IC0gUE1DKTogUHJvamVjdCBtZW50b3IsIGluZnJhc3RydWN0dXJlIGxpYXNvbi48L2xpPgorICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWhmcmFudHoiPk1hdHQgRnJhbnR6PC9hPiAoMjAxNSAtIENvbW1pdHRlcik6IEdyZW1saW4gbGFuZ3VhZ2UgZGVzaWduLCB0cy10aW5rZXJwb3AuPC9saT4KKyAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3BsdXJhZGoiPkphc29uIFBsdXJhZDwvYT4gKDIwMTUgLSBQTUMpOiBHcmVtbGluIENvbnNvbGUvU2VydmVyLCBtYWlsaW5nIGxpc3Qgc3VwcG9ydC48L2xpPgorICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vZHlsYW4tbWlsbGlraW4tMzI1Njc5MzQiPkR5bGFuIE1pbGxpa2luPC9hPiAoMjAxNSAtIFBNQyk6IEdyZW1saW4gU2VydmVyL0RyaXZlciwgZ3JlbWxpbi1waHAsIEdyZW1saW5CaW4sIG1haWxpbmcgbGlzdCBzdXBwb3J0LjwvbGk+CisgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2lsbWVzIj5UZWQgV2lsbWVzPC9hPiAoMjAxNSAtIFBNQyk6IFByb21vdGlvbnMsIG1haWxpbmcgbGlzdCBzdXBwb3J0LCBiZW5jaG1hcmtpbmcsIHNxbC1ncmVtbGluLjwvbGk+CisgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9waWV0ZXJtYXJ0aW4iPlBpZXRlciBNYXJ0aW48L2E+ICgyMDE2IC0gQ29tbWl0dGVyKTogR3JlbWxpbiBsYW5ndWFnZSwgU3FsZy48L2xpPgorICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamJtdXNzbyI+SmVhbi1CYXB0aXN0ZSBNdXNzbzwvYT4gKDIwMTYgLSBDb21taXR0ZXIpOiBHcmVtbGluIFNlcnZlciB0ZXN0aW5nLCBHcmVtbGluIERyaXZlciAoTm9kZS5qcy9KYXZhU2NyaXB0KSwgbWFpbGluZyBsaXN0IHN1cHBvcnQuPC9saT4KKyAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5taWNoYWVscG9sbG1laWVyLmNvbS8iPk1pY2hhZWwgUG9sbG1laWVyPC9hPiAoMjAxNiAtIENvbW1pdHRlcik6IEdyZW1saW4gbGFuZ3VhZ2UsIEdyZW1saW4tU2NhbGEuPC9saT4KKyAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhdmVic2hvdyI+RGF2aWQgQnJvd248L2E+ICgyMDE2IC0gQ29tbWl0dGVyKTogUHl0aG9uIGxpYnJhcmllcywgR3JlbWxpbiBTZXJ2ZXIgdGVzdGluZy48L2xpPgogICAgICAgICAgPC91bD4KLSAgICAgICAgIC0tPgogICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KIDwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9zaXRlL2hvbWUvcG9saWN5Lmh0bWwgYi9kb2NzL3NpdGUvaG9tZS9wb2xpY3kuaHRtbAppbmRleCBiMWQ2YmVlLi42MjQ3Yzg2IDEwMDY0NAotLS0gYS9kb2NzL3NpdGUvaG9tZS9wb2xpY3kuaHRtbAorKysgYi9kb2NzL3NpdGUvaG9tZS9wb2xpY3kuaHRtbApAQCAtMjcsOSArMjcsOSBAQAogICAgICAgPGgzPlByb3ZpZGVyIExpc3RpbmcgUG9saWN5PC9oMz4KICAgICAgIDxwPkdyYXBoIHN5c3RlbSBhbmQgbGFuZ3VhZ2UgcHJvdmlkZXJzIGNhbiBoYXZlIHRoZSBwcm9qZWN0IGxpc3RlZCBpbiB0d28gbG9jYXRpb25zIG9uIHRoZSBBcGFjaGUgVGlua2VyUG9wIGhvbWVwYWdlLgogICAgICAgICAgVGhlIGZpcnN0IGxvY2F0aW9uIGlzIG9uIHRoZSBob21lcGFnZSA8YSBocmVmPSJpbmRleC5odG1sIj5pbmRleC5odG1sPC9hPi4gVGhlIHNlY29uZCBpcyBvbiB0aGUgaG9tZXBhZ2UgPGEgaHJlZj0icHJvdmlkZXJzLmh0bWwiPnByb3ZpZGVycy5odG1sPC9hPi4gVGhlIHBvbGljaWVzCi0gICAgICAgICBmb3IgZWFjaCBhcmUgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9tYXJrcy9saW5raW5nIj5saW5raW5nIHBvbGljeTwvYT4gc3VwZXJjZWRlIHRob3NlCisgICAgICAgICBmb3IgZWFjaCBhcmUgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyA8YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vbWFya3MvbGlua2luZyI+bGlua2luZyBwb2xpY3k8L2E+IHN1cGVyY2VkZSB0aG9zZQogICAgICAgICAgc3RpcHVsYXRlZCBieSBBcGFjaGUgVGlua2VyUG9wLiBBbGwgdGhpbmdzIGNvbnNpZGVyZWQsIGlmIHlvdXIgcHJvamVjdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLCBwbGVhc2UgZW1haWwgQXBhY2hlIFRpbmtlclBvcCdzCi0gICAgICAgICA8YSBocmVmPSJodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2luY3ViYXRvci10aW5rZXJwb3AtZGV2LyI+ZGV2ZWxvcGVyIG1haWxpbmcgbGlzdDwvYT4gcmVxdWVzdGluZyB0aGF0IHlvdXIgcHJvamVjdCBiZSBhZGRlZCB0byBhIGxpc3RpbmcuCisgICAgICAgICA8YSBocmVmPSJodHRwczovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9pbmN1YmF0b3ItdGlua2VycG9wLWRldi8iPmRldmVsb3BlciBtYWlsaW5nIGxpc3Q8L2E+IHJlcXVlc3RpbmcgdGhhdCB5b3VyIHByb2plY3QgYmUgYWRkZWQgdG8gYSBsaXN0aW5nLgogICAgICAgPC9wPgogICAgICAgPGg0PkluZGV4IExpc3RpbmcgUmVxdWlyZW1lbnRzPC9oND4KICAgICAgIDx1bD4KQEAgLTU0LDggKzU0LDggQEAKICAgICAgIDxhIG5hbWU9ImdyYXBoaWMtdXNhZ2UtcG9saWN5Ij48L2E+CiAgICAgICA8aDM+R3JhcGhpYyBVc2FnZSBQb2xpY3k8L2gzPgogICAgICAgPHA+QXBhY2hlIFRpbmtlclBvcCBoYXMgYSBwbGV0aG9yYSBvZiBncmFwaGljcyB0aGF0IHRoZSBjb21tdW5pdHkgY2FuIHVzZS4gVGhlcmUgYXJlIGZvdXIgY2F0ZWdvcmllcyBvZiBncmFwaGljcy4gVGhlc2UgY2F0ZWdvcmllcyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBwb2xpY2llcyBhcmUgcHJlc2VudGVkCi0gICAgICAgICBiZWxvdy4gSWYgeW91IGFyZSB1bnN1cmUgb2YgdGhlIGNhdGVnb3J5IG9mIGEgcGFydGljdWxhciBncmFwaGljLCBwbGVhc2UgYXNrIG9uIG91ciA8YSBocmVmPSJodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2luY3ViYXRvci10aW5rZXJwb3AtZGV2LyI+ZGV2ZWxvcGVyIG1haWxpbmc8L2E+Ci0gICAgICAgICBsaXN0IGJlZm9yZSB1c2luZyBpdC4gRmluYWxseSwgbm90ZSB0aGF0IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbidzIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL21hcmtzLyI+dHJhZGVtYXJrIHBvbGljaWVzPC9hPiBzdXBlcmNlZGUgdGhvc2Ugc3RpcHVsYXRlZAorICAgICAgICAgYmVsb3cuIElmIHlvdSBhcmUgdW5zdXJlIG9mIHRoZSBjYXRlZ29yeSBvZiBhIHBhcnRpY3VsYXIgZ3JhcGhpYywgcGxlYXNlIGFzayBvbiBvdXIgPGEgaHJlZj0iaHR0cHM6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvaW5jdWJhdG9yLXRpbmtlcnBvcC1kZXYvIj5kZXZlbG9wZXIgbWFpbGluZzwvYT4KKyAgICAgICAgIGxpc3QgYmVmb3JlIHVzaW5nIGl0LiBGaW5hbGx5LCBub3RlIHRoYXQgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3MgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL21hcmtzLyI+dHJhZGVtYXJrIHBvbGljaWVzPC9hPiBzdXBlcmNlZGUgdGhvc2Ugc3RpcHVsYXRlZAogICAgICAgICAgYnkgQXBhY2hlIFRpbmtlclBvcC4KICAgICAgIDwvcD4KICAgICAgIDx1bD4KQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgIDxpbWcgc3JjPSJpbWcvcG9saWN5L2dyZW1saW4tZ3JlbW9wb2x5LnBuZyIgc3R5bGU9InBhZGRpbmc6MTBweDt3aWR0aDoxMCU7Ii8+IDxpbWcgc3JjPSJpbWcvcG9saWN5L2dyZW1saW4tZ3JlbXJlYXBlci5wbmciIHN0eWxlPSJwYWRkaW5nOjEwcHg7d2lkdGg6MTQlOyIvPiA8aW1nIHNyYz0iaW1nL3BvbGljeS9ncmVtbGluLWNoaWNrZW53aW5nLnBuZyIgc3R5bGU9InBhZGRpbmc6MTBweDt3aWR0aDoxMCU7Ii8+IDxpbWcgc3JjPSJpbWcvcG9saWN5L2dyZW1saW4tbm8tbW9yZS1tci1uaWNlLWd1eS5wbmciIHN0eWxlPSJwYWRkaW5nOjEwcHg7d2lkdGg6MTAlOyIvPiA8aW1nIHNyYz0iaW1nL3BvbGljeS9ncmVtbGluLW5ldy1zaGVyaWZmLWluLXRvd24ucG5nIiBzdHlsZT0icGFkZGluZzoxMHB4O3dpZHRoOjEyJTsiLz4gPGltZyBzcmM9ImltZy9wb2xpY3kvZ3JlbWxpbi1ncmVtc3RlZmFuaS5wbmciIHN0eWxlPSJwYWRkaW5nOjEwcHg7d2lkdGg6MTAlOyIvPgogICAgICAgICAgPGxpPjxzdHJvbmc+RXhwbGFuYXRvcnkgRGlhZ3JhbXM8L3N0cm9uZz46IEV4cGxhbmF0b3J5IGRpYWdyYW1zIGNhbiBiZSB1c2VkIDxlbT53aXRob3V0IHBlcm1pc3Npb248L2VtPiBhcyBsb25nIGFzIHRoZXkgYXJlIGJlaW5nIHVzZWQgaW4gYW4gQXBhY2hlIFRpbmtlclBvcCByZWxhdGVkIGNvbnRleHQsIGl0IGlzIGFja25vd2xlZGdlZCB0aGF0IHRoZXkgYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL0FwYWNoZSBUaW5rZXJQb3AsIGFuZCBhcmUgYmVpbmcgdXNlZCBmb3IgdGVjaG5pY2FsIGV4cGxhbmF0b3J5IHB1cnBvc2VzLjwvbGk+CiAgICAgICAgICA8aW1nIHNyYz0iaW1nL3BvbGljeS9vbGFwLXRyYXZlcnNhbC5wbmciIHN0eWxlPSJwYWRkaW5nOjEwcHg7d2lkdGg6MjIlOyIvPiA8aW1nIHNyYz0iaW1nL3BvbGljeS9jeWNsaWNwYXRoLXN0ZXAucG5nIiBzdHlsZT0icGFkZGluZzoxMHB4O3dpZHRoOjIyJTsiLz4gPGltZyBzcmM9ImltZy9wb2xpY3kvZmxhdC1tYXAtbGFtYmRhLnBuZyIgc3R5bGU9InBhZGRpbmc6MTBweDt3aWR0aDoxNSU7Ii8+IDxpbWcgc3JjPSJpbWcvcG9saWN5L2FkamFjZW5jeS1saXN0LnBuZyIgc3R5bGU9InBhZGRpbmc6MTBweDt3aWR0aDoyMiU7Ii8+Ci0gICAgICAgICA8bGk+PHN0cm9uZz5DaGFyYWN0ZXIgU2NlbmUgR3JhcGhpY3M8L3N0cm9uZz46IENoYXJhY3RlciBzY2VuZSBncmFwaGljcyA8dT48ZW0+cmVxdWlyZSBwZXJtaXNzaW9uPC9lbT48L3U+IGJlZm9yZSBiZWluZyB1c2VkLiBQbGVhc2UgYXNrIGZvciBwZXJtaXNzaW9uIG9uIHRoZSBBcGFjaGUgVGlua2VyUG9wIDxhIGhyZWY9Imh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvaW5jdWJhdG9yLXRpbmtlcnBvcC1kZXYvIj5kZXZlbG9wZXIgbWFpbGluZyBsaXN0PC9hPi48L2xpPgorICAgICAgICAgPGxpPjxzdHJvbmc+Q2hhcmFjdGVyIFNjZW5lIEdyYXBoaWNzPC9zdHJvbmc+OiBDaGFyYWN0ZXIgc2NlbmUgZ3JhcGhpY3MgPHU+PGVtPnJlcXVpcmUgcGVybWlzc2lvbjwvZW0+PC91PiBiZWZvcmUgYmVpbmcgdXNlZC4gUGxlYXNlIGFzayBmb3IgcGVybWlzc2lvbiBvbiB0aGUgQXBhY2hlIFRpbmtlclBvcCA8YSBocmVmPSJodHRwczovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9pbmN1YmF0b3ItdGlua2VycG9wLWRldi8iPmRldmVsb3BlciBtYWlsaW5nIGxpc3Q8L2E+LjwvbGk+CiAgICAgICAgICA8aW1nIHNyYz0iaW1nL3BvbGljeS90aW5rZXJwb3AtcmVhZGluZy5wbmciIHN0eWxlPSJwYWRkaW5nOjEwcHg7d2lkdGg6MjAlOyIvPiA8aW1nIHNyYz0iaW1nL3BvbGljeS9ncmVtbGludHJvbi5wbmciIHN0eWxlPSJwYWRkaW5nOjEwcHg7d2lkdGg6MjAlOyIvPiA8aW1nIHNyYz0iaW1nL3BvbGljeS9idXNpbmVzcy1ncmVtbGluLnBuZyIgc3R5bGU9InBhZGRpbmc6MTBweDt3aWR0aDoyMCU7Ii8+IDxpbWcgc3JjPSJpbWcvcG9saWN5L3RpbmtlcnBvcDMtc3BsYXNoLnBuZyIgc3R5bGU9InBhZGRpbmc6MTBweDt3aWR0aDoyMCU7Ii8+CiAgICAgICA8L3VsPgogICAgPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL3NpdGUvaG9tZS9wcm92aWRlcnMuaHRtbCBiL2RvY3Mvc2l0ZS9ob21lL3Byb3ZpZGVycy5odG1sCmluZGV4IGViYTkyY2IuLjhmMzVjZTkgMTAwNjQ0Ci0tLSBhL2RvY3Mvc2l0ZS9ob21lL3Byb3ZpZGVycy5odG1sCisrKyBiL2RvY3Mvc2l0ZS9ob21lL3Byb3ZpZGVycy5odG1sCkBAIC0yNiw3ICsyNiw3IEBACiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS0xMCBjb2wtbWQtMTAiPgotICAgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnIj5BcGFjaGUgVGlua2VyUG9wPC9hPiBncm93cyB3aGVuIDM8c3VwPnJkPC9zdXA+IHBhcnR5IGRhdGEgc3lzdGVtcyBhbmQgcXVlcnkgbGFuZ3VhZ2VzIHV0aWxpemUgaXQuIFdoaWxlIEFwYWNoZSdzIGRpc3RyaWJ1dGlvbiBvZiBUaW5rZXJQb3AKKyAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmciPkFwYWNoZSBUaW5rZXJQb3A8L2E+IGdyb3dzIHdoZW4gMzxzdXA+cmQ8L3N1cD4gcGFydHkgZGF0YSBzeXN0ZW1zIGFuZCBxdWVyeSBsYW5ndWFnZXMgdXRpbGl6ZSBpdC4gV2hpbGUgQXBhY2hlJ3MgZGlzdHJpYnV0aW9uIG9mIFRpbmtlclBvcAogICAgICAgICAgICAgICAgZG9lcyBwcm92aWRlIHByb2R1Y3Rpb24gcmVhZHkgaW1wbGVtZW50YXRpb25zIGFuZCB0b29scywgaXQgaXMgdWx0aW1hdGVseSB0aGUgbGFyZ2VyIGVjb3N5c3RlbSBvZiBwcm92aWRlcnMgdGhhdCBlbnN1cmUgVGlua2VyUG9wJ3Mgd2lkZXNwcmVhZCBhZG9wdGlvbi4KICAgICAgICAgICAgICAgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcHJvdmlkZXJzLiBUaGUgZmlyc3QgYXJlIHRob3NlIHRoYXQgZGV2ZWxvcCBhIChncmFwaCkgZGF0YWJhc2UsIChncmFwaCkgcHJvY2Vzc29yLCBvciAoZ3JhcGgpIGFuYWx5dGljcyB0b29sIGFuZCB3YW50IHRvCiAgICAgICAgICAgICAgICBvZmZlciB0aGVpciB1c2VycyBUaW5rZXJQb3Atc3BlY2lmaWMgZ3JhcGggY29tcHV0aW5nIGZlYXR1cmVzLiBUaGUgb3RoZXIgdHlwZSBvZiBwcm92aWRlciBhcmUgbGFuZ3VhZ2UgZGVzaWduZXJzIHRoYXQgaGF2ZSBhIChncmFwaCkgcXVlcnkgbGFuZ3VhZ2UgdGhleQpAQCAtNDEsNyArNDEsNyBAQAogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgIDxhIG5hbWU9ImRhdGEtc3lzdGVtLXByb3ZpZGVycyI+PC9hPgogICAgICAgPGgzPkRhdGEgU3lzdGVtIFByb3ZpZGVyczwvaDM+Ci0gICAgICA8cD5XaGVuIGEgZGF0YSBzeXN0ZW0gaXMgVGlua2VyUG9wLWVuYWJsZWQsIGl0cyB1c2VycyBhcmUgYWJsZSB0byBtb2RlbCB0aGVpciBkb21haW4gYXMgYSBncmFwaCBhbmQgYW5hbHl6ZSB0aGF0IGdyYXBoIHVzaW5nIHRoZSA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZ3JlbWxpbi5odG1sIj5HcmVtbGluIGdyYXBoIHRyYXZlcnNhbCBsYW5ndWFnZTwvYT4uIEZ1cnRoZXJtb3JlLCBhbGwKKyAgICAgIDxwPldoZW4gYSBkYXRhIHN5c3RlbSBpcyBUaW5rZXJQb3AtZW5hYmxlZCwgaXRzIHVzZXJzIGFyZSBhYmxlIHRvIG1vZGVsIHRoZWlyIGRvbWFpbiBhcyBhIGdyYXBoIGFuZCBhbmFseXplIHRoYXQgZ3JhcGggdXNpbmcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZ3JlbWxpbi5odG1sIj5HcmVtbGluIGdyYXBoIHRyYXZlcnNhbCBsYW5ndWFnZTwvYT4uIEZ1cnRoZXJtb3JlLCBhbGwKICAgICAgICAgIFRpbmtlclBvcC1lbmFibGVkIGdyYXBoIHN5c3RlbXMgaW50ZWdyYXRlIHdpdGggb25lIGFub3RoZXIgYWxsb3dpbmcgcHJvdmlkZXJzIHRvIGVhc2lseSBleHBhbmQgdGhlaXIgc3lzdGVtJ3Mgb2ZmZXJpbmdzIGFzIHdlbGwgYXMgYWxsb3dpbmcgdXNlcnMgdG8gY2hvb3NlIGFwcHJvcHJpYXRlIGdyYXBoIHRlY2hub2xvZ3kgZm9yIHRoZWlyCiAgICAgICAgICBhcHBsaWNhdGlvbi4gU29tZXRpbWVzIGFuIGFwcGxpY2F0aW9uIGlzIGJlc3Qgc2VydmVkIGJ5IGFuIGluLW1lbW9yeSwgdHJhbnNhY3Rpb25hbCBncmFwaCBkYXRhYmFzZS4gU29tZXRpbWVzIGEgbXVsdGktbWFjaGluZSBkaXN0cmlidXRlZCBncmFwaCBkYXRhYmFzZSB3aWxsIGRvIHRoZSBqb2IuIE9yIHBlcmhhcHMgdGhlCiAgICAgICAgICBhcHBsaWNhdGlvbiByZXF1aXJlcyBib3RoIGEgZGlzdHJpYnV0ZWQgZ3JhcGggZGF0YWJhc2UgZm9yIHJlYWwtdGltZSBxdWVyaWVzIGFuZCwgaW4gcGFyYWxsZWwsIGEgQmlnKEdyYXBoKURhdGEgcHJvY2Vzc29yIGZvciBiYXRjaCBhbmFseXRpY3MuICBXaGF0ZXZlciB0aGUgYXBwbGljYXRpb24ncyByZXF1aXJlbWVudHMsIHRoZXJlCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICA8YnIvPgogICAgICAgPG9sPgogICAgICAgICAgPGxpPjxzdHJvbmc+VGhlIEdyYXBoIChyZXF1aXJlZCk8L3N0cm9uZz46IFRoZXNlIGZvdW5kYXRpb25hbCBpbnRlcmZhY2VzIGRlZmluZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBvcGVyYXRpb25zIG9uIGEgZ3JhcGgsIHZlcnRleCwgZWRnZSwgYW5kIHByb3BlcnR5LiBPbmNlIGltcGxlbWVudGVkLCB0aGUgcHJvdmlkZXIncwotICAgICAgICAgICAgZGF0YSBzeXN0ZW0gY2FuIGltbWVkaWF0ZWx5IGJlIHF1ZXJpZWQgdXNpbmcgR3JlbWxpbiBPTFRQLiBIb3dldmVyLCBwcm92aWRlcnMgbWF5IHdhbnQgdG8gbGV2ZXJhZ2UgYSBjb2xsZWN0aW9uIG9mIHByb3ZpZGVyLXNwZWNpZmljIGNvbXBpbGVyIG9wdGltaXphdGlvbnMgY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyN0cmF2ZXJzYWxzdHJhdGVneSI+dHJhdmVyc2FsIHN0cmF0ZWdpZXM8L2E+CisgICAgICAgICAgICBkYXRhIHN5c3RlbSBjYW4gaW1tZWRpYXRlbHkgYmUgcXVlcmllZCB1c2luZyBHcmVtbGluIE9MVFAuIEhvd2V2ZXIsIHByb3ZpZGVycyBtYXkgd2FudCB0byBsZXZlcmFnZSBhIGNvbGxlY3Rpb24gb2YgcHJvdmlkZXItc3BlY2lmaWMgY29tcGlsZXIgb3B0aW1pemF0aW9ucyBjYWxsZWQgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyN0cmF2ZXJzYWxzdHJhdGVneSI+dHJhdmVyc2FsIHN0cmF0ZWdpZXM8L2E+CiAgICAgICAgICAgICB3aGljaCBjYW4gbGV2ZXJhZ2UgdGhlaXIgc3lzdGVtJ3MgdW5pcXVlIGZlYXR1cmVzIChlLmcuIGdsb2JhbCBpbmRpY2VzLCB2ZXJ0ZXgtY2VudHJpYyBpbmRpY2VzLCBzb3J0IG9yZGVycywgc2VxdWVudGlhbCBzY2FubmVycywgcHVzaC1kb3duIHByZWRpY2F0ZXMsIGV0Yy4pLgogICAgICAgICAgPC9saT4KICAgICAgICAgIDxici8+CkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICAgICBvZiBUaW5rZXJQb3ApLgogICAgICAgICAgPC9saT4KICAgICAgIDwvb2w+Ci0gICAgICA8cD5GaW5hbGx5LCB0aGVyZSBhcmUgb3RoZXIgdG9vbHMgYW5kIHRlY2hub2xvZ2llcyB0aGF0IHRoZSBwcm92aWRlciBjYW4gbGV2ZXJhZ2UgZnJvbSBUaW5rZXJQb3Agc3VjaCBhcyA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1zZXJ2ZXIiPkdyZW1saW4gU2VydmVyPC9hPiwgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tY29uc29sZSI+R3JlbWxpbiBDb25zb2xlPC9hPiwgYW5kIHRoZSBsaWtlLiBUaGUgcHVycG9zZSBvZiBBcGFjaGUgVGlua2VyUG9wIGlzIHRvCisgICAgICA8cD5GaW5hbGx5LCB0aGVyZSBhcmUgb3RoZXIgdG9vbHMgYW5kIHRlY2hub2xvZ2llcyB0aGF0IHRoZSBwcm92aWRlciBjYW4gbGV2ZXJhZ2UgZnJvbSBUaW5rZXJQb3Agc3VjaCBhcyA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tc2VydmVyIj5HcmVtbGluIFNlcnZlcjwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1jb25zb2xlIj5HcmVtbGluIENvbnNvbGU8L2E+LCBhbmQgdGhlIGxpa2UuIFRoZSBwdXJwb3NlIG9mIEFwYWNoZSBUaW5rZXJQb3AgaXMgdG8KICAgICAgICAgIG1ha2UgaXQgZWFzeSBmb3IgcHJvdmlkZXJzIHRvIGFkZCBncmFwaCBmdW5jdGlvbmFsaXR5IHRvIHRoZWlyIHN5c3RlbSBhbmQvb3IgdG8gYnVpbGQgYSBncmFwaCBzeXN0ZW0gZnJvbSBzY3JhdGNoIGFuZCBpbW1lZGlhdGVseSBoYXZlIGEgcXVlcnkgbGFuZ3VhZ2UsIHNlcnZlciBpbmZyYXN0cnVjdHVyZSwgbWV0cmljcy9yZXBvcnRpbmcKICAgICAgICAgIGludGVncmF0aW9uLCBjbHVzdGVyLWJhc2VkIGFuYWx5dGljcyBhbmQgbW9yZS4KICAgICAgIDwvcD4KQEAgLTg5LDMyICs4OSwzMiBAQAogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT48c3Ryb25nPkdyZW1saW4gdHJhdmVyc2FsIG1hY2hpbmU8L3N0cm9uZz46IEV2ZXJ5IEdyZW1saW4gbGFuZ3VhZ2UgdmFyaWFudCBjb21waWxlcyB0byBhIGxhbmd1YWdlIGFnbm9zdGljIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0J5dGVjb2RlIj5ieXRlY29kZTwvYT4gcmVwcmVzZW50YXRpb24uIFRoYXQgYnl0ZWNvZGUgaXMgdWx0aW1hdGVseSB0cmFuc2xhdGVkIHRvIGEgbWFjaGluZS1zcGVjaWZpYyB0cmF2ZXJzYWwuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgR3JlbWxpbiB0cmF2ZXJzYWwgbWFjaGluZSB0byBleGVjdXRlIHRoYXQgdHJhdmVyc2FsIGFzIGEKICAgICAgICAgICAgIHJlYWwtdGltZSA8YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PbmxpbmVfdHJhbnNhY3Rpb25fcHJvY2Vzc2luZyI+T0xUUDwvYT4gcXVlcnkgb3IgYXMgYW4gYW5hbHl0aWMgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT25saW5lX2FuYWx5dGljYWxfcHJvY2Vzc2luZyI+T0xBUDwvYT4gcXVlcnkgKG9yIGJvdGgpLiBOb3RlIHRoYXQgdGhlIEdyZW1saW4gdHJhdmVyc2FsIG1hY2hpbmUgaXMgbm90IGJvdW5kIHRvIHRoZSBHcmVtbGluIGxhbmd1YWdlLiBBbnkgbGFuZ3VhZ2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSB0aGUKLSAgICAgICAgICAgIEdyZW1saW4gdHJhdmVyc2FsIG1hY2hpbmUgYnkgc2ltcGx5IHRyYW5zbGF0aW5nIGl0c2VsZiB0byBHcmVtbGluIGJ5dGVjb2RlLiBJbiBmYWN0LCBjb21waWxlcnMgY3VycmVudGx5IGV4aXN0IGZvciA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdHdpbG1lcy9zcWwtZ3JlbWxpbiI+U1FMPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI3NwYXJxbC1ncmVtbGluIj5TUEFSUUw8L2E+LiBIb3dldmVyLCB1c2luZyBhbHRlcm5hdGl2ZSBsYW5ndWFnZXMgZm9yIGdyYXBoIGNvbXB1dGluZyBsZWFkcyB0byBzaWduaWZpY2FudGx5IG1vcmUgY29tcGxpY2F0ZWQgcXVlcmllcworICAgICAgICAgICAgR3JlbWxpbiB0cmF2ZXJzYWwgbWFjaGluZSBieSBzaW1wbHkgdHJhbnNsYXRpbmcgaXRzZWxmIHRvIEdyZW1saW4gYnl0ZWNvZGUuIEluIGZhY3QsIGNvbXBpbGVycyBjdXJyZW50bHkgZXhpc3QgZm9yIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2lsbWVzL3NxbC1ncmVtbGluIj5TUUw8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI3NwYXJxbC1ncmVtbGluIj5TUEFSUUw8L2E+LiBIb3dldmVyLCB1c2luZyBhbHRlcm5hdGl2ZSBsYW5ndWFnZXMgZm9yIGdyYXBoIGNvbXB1dGluZyBsZWFkcyB0byBzaWduaWZpY2FudGx5IG1vcmUgY29tcGxpY2F0ZWQgcXVlcmllcwogICAgICAgICAgICAgYW5kIHR5cGljYWxseSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwcmVzc2l2aXR5IHByb3ZpZGVkIGJ5IEdyZW1saW4uCiAgICAgICAgICA8L2xpPgotICAgICAgICAgPGxpPjxzdHJvbmc+VGlua2VyR3JhcGg8L3N0cm9uZz46IFRpbmtlclBvcCBwcm92aWRlcyBhIHNpbXBsZSwgbm9uLXRyYW5zYWN0aW9uYWwsIGluLW1lbW9yeSBncmFwaCBzeXN0ZW0gY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyN0aW5rZXJncmFwaC1ncmVtbGluIj5UaW5rZXJHcmFwaDwvYT4uIFRpbmtlckdyYXBoIGlzIHVzZWZ1bCBmb3IgZXhwbG9yaW5nIGdyYXBocyB0aGF0IGNhbiBmaXQKKyAgICAgICAgIDxsaT48c3Ryb25nPlRpbmtlckdyYXBoPC9zdHJvbmc+OiBUaW5rZXJQb3AgcHJvdmlkZXMgYSBzaW1wbGUsIG5vbi10cmFuc2FjdGlvbmFsLCBpbi1tZW1vcnkgZ3JhcGggc3lzdGVtIGNhbGxlZCA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI3RpbmtlcmdyYXBoLWdyZW1saW4iPlRpbmtlckdyYXBoPC9hPi4gVGlua2VyR3JhcGggaXMgdXNlZnVsIGZvciBleHBsb3JpbmcgZ3JhcGhzIHRoYXQgY2FuIGZpdAogICAgICAgICAgICAgaW4tbWVtb3J5LCBmb3IgZG9pbmcgdHV0b3JpYWxzIGFuZCB0cmFpbmluZyB3aXRob3V0IHRoZSBvdmVyaGVhZCBvZiBkYXRhYmFzZSBzZXR1cCwgZXRjLiBUaW5rZXJHcmFwaCBib2FzdHMgYm90aCBPTFRQIGFuZCBPTEFQIHRyYXZlcnNhbCBtYWNoaW5lIHN1cHBvcnQuCiAgICAgICAgICA8L2xpPgotICAgICAgICAgPGxpPjxzdHJvbmc+R3JlbWxpbiBDb25zb2xlPC9zdHJvbmc+OiBBIGNvbW1hbmQgbGluZSA8YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWFkJUUyJTgwJTkzZXZhbCVFMiU4MCU5M3ByaW50X2xvb3AiPlJFUEw8L2E+IGlzIHByb3ZpZGVkIGNhbGxlZCA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1jb25zb2xlIj5HcmVtbGluIENvbnNvbGU8L2E+LiBUaGlzIGNvbnNvbGUgaXMgdXNlZnVsIHdoZW4gbGVhcm5pbmcgVGlua2VyUG9wIGFzIHVzZXJzIGNhbiBsb2FkIHByb3ZpZGVkIGRhdGFzZXRzIGludG8gYQorICAgICAgICAgPGxpPjxzdHJvbmc+R3JlbWxpbiBDb25zb2xlPC9zdHJvbmc+OiBBIGNvbW1hbmQgbGluZSA8YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWFkJUUyJTgwJTkzZXZhbCVFMiU4MCU5M3ByaW50X2xvb3AiPlJFUEw8L2E+IGlzIHByb3ZpZGVkIGNhbGxlZCA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tY29uc29sZSI+R3JlbWxpbiBDb25zb2xlPC9hPi4gVGhpcyBjb25zb2xlIGlzIHVzZWZ1bCB3aGVuIGxlYXJuaW5nIFRpbmtlclBvcCBhcyB1c2VycyBjYW4gbG9hZCBwcm92aWRlZCBkYXRhc2V0cyBpbnRvIGEKICAgICAgICAgICAgIGdyYXBoIHN5c3RlbSBhbmQgZXhwbG9yZSB0aGUgR3JlbWxpbiBsYW5ndWFnZSB3aXRob3V0IHRoZSBvdmVyaGVhZCBvZiBjcmVhdGluZyBhIGZ1bGwtYmxvd24gc29mdHdhcmUgcHJvamVjdC4gRnVydGhlcm1vcmUsIHRoZSBHcmVtbGluIENvbnNvbGUgaXMgdXNlZCBleHRlbnNpdmVseSBpbiBwcm9kdWN0aW9uIHNjZW5hcmlvcwogICAgICAgICAgICAgYmVjYXVzZSBpdCBhbGxvd3Mgc3lzdGVtIGFkbWluaXN0cmF0b3JzIHRvIGludGVyYWN0IHdpdGggYSBsb2NhbCBvciByZW1vdGUgZ3JhcGggdG8gZ2F0aGVyIHN0YXRpc3RpY3MsIG1hbnVhbGx5IGV4cGxvcmUgdGhlIGRhdGEgdG8gZW5zdXJlIGRhdGEgaW50ZWdyaXR5LCBhbmQgb3RoZXIgdXNlZnVsIHRhc2tzLgogICAgICAgICAgPC9saT4KLSAgICAgICAgIDxsaT48c3Ryb25nPkdyZW1saW4gU2VydmVyPC9zdHJvbmc+OiBJdCBpcyB0eXBpY2FsIGZvciBhIGdyYXBoIGRhdGFiYXNlIHRvIGV4aXN0IG9uIGEgc2VwYXJhdGUgbWFjaGluZSBmcm9tIHRoZSB1c2VyJ3MgYXBwbGljYXRpb24gY29kZS4gPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tc2VydmVyIj5HcmVtbGluIFNlcnZlcjwvYT4gYnJpZGdlcyB0aGUgbmV0d29yay1kaXZpZGUKKyAgICAgICAgIDxsaT48c3Ryb25nPkdyZW1saW4gU2VydmVyPC9zdHJvbmc+OiBJdCBpcyB0eXBpY2FsIGZvciBhIGdyYXBoIGRhdGFiYXNlIHRvIGV4aXN0IG9uIGEgc2VwYXJhdGUgbWFjaGluZSBmcm9tIHRoZSB1c2VyJ3MgYXBwbGljYXRpb24gY29kZS4gPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLXNlcnZlciI+R3JlbWxpbiBTZXJ2ZXI8L2E+IGJyaWRnZXMgdGhlIG5ldHdvcmstZGl2aWRlCiAgICAgICAgICAgICBhbGxvd2luZyB1c2VycyB0byBzZWFtbGVzc2x5IHN1Ym1pdCB0cmF2ZXJzYWxzIGZvciByZW1vdGUgZXhlY3V0aW9uIG92ZXIgYSB3ZWItc29ja2V0cyBiYXNlZCBiaW5hcnkgcHJvdG9jb2wuIElmIHByb3ZpZGVyIGFscmVhZHkgaGFzIGEgc2VydmVyLCB0aGV5IGNhbiBsZXZlcmFnZSBUaW5rZXJQb3Atc3BlY2lmaWMKICAgICAgICAgICAgIGNvbXBvbmVudHMgYXMgbmVlZGVkIChlLmcuIGltcGxlbWVudCA8Y29kZT5SZW1vdGVDb25uZWN0aW9uPC9jb2RlPikuIEdyZW1saW4gU2VydmVyIGFsc28gcHJvdmlkZXMgYW4gSFRUUC1iYXNlZCBBUEksIHN1cHBvcnQgZm9yIDxhIGhyZWY9Imh0dHA6Ly9nYW5nbGlhLmluZm8vIj5HYW5nbGlhPC9hPi88YSBocmVmPSJodHRwOi8vZ3JhcGhpdGUud2lraWRvdC5jb20vIj5HcmFwaGl0ZTwvYT4vPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2FydGljbGVzL2phdmEvamF2YW1hbmFnZW1lbnQtMTQwNTI1Lmh0bWwiPkpNWDwvYT4vbW9yZQogICAgICAgICAgICAgbWV0cmljcywgYW5kIGEgdHJhdmVyc2FsIHJvdXRpbmcgZnJhbWV3b3JrIGZvciBpbnRlbGxpZ2VudCBkYXRhL3RyYXZlcnNhbCBjby1sb2NhdGlvbiB3aXRoaW4gYSBkaXN0cmlidXRlZCBncmFwaCBkYXRhYmFzZSdzIG1hY2hpbmUgY2x1c3Rlci4KICAgICAgICAgIDwvbGk+Ci0gICAgICAgICA8bGk+PHN0cm9uZz5TcGFya0dyYXBoQ29tcHV0ZXI8L3N0cm9uZz46IDxhIGhyZWY9Imh0dHA6Ly9zcGFyay5hcGFjaGUub3JnLyI+QXBhY2hlIFNwYXJrPC9hPiZ0cmFkZTsgaXMgYSBCaWcgRGF0YSBPTEFQIHByb2Nlc3NvciB0aGF0IHNpbXBsaWZpZXMgdGhlIGNyZWF0aW9uIGFuZCBleGVjdXRpb24gb2YgZGlzdHJpYnV0ZWQgZGF0YSBhbmFseXRpY3MuCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcmtncmFwaGNvbXB1dGVyIj48Y29kZT5TcGFya0dyYXBoQ29tcHV0ZXI8L2NvZGU+PC9hPiB0dXJucyBTcGFyaworICAgICAgICAgPGxpPjxzdHJvbmc+U3BhcmtHcmFwaENvbXB1dGVyPC9zdHJvbmc+OiA8YSBocmVmPSJodHRwczovL3NwYXJrLmFwYWNoZS5vcmcvIj5BcGFjaGUgU3Bhcms8L2E+JnRyYWRlOyBpcyBhIEJpZyBEYXRhIE9MQVAgcHJvY2Vzc29yIHRoYXQgc2ltcGxpZmllcyB0aGUgY3JlYXRpb24gYW5kIGV4ZWN1dGlvbiBvZiBkaXN0cmlidXRlZCBkYXRhIGFuYWx5dGljcy4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcmtncmFwaGNvbXB1dGVyIj48Y29kZT5TcGFya0dyYXBoQ29tcHV0ZXI8L2NvZGU+PC9hPiB0dXJucyBTcGFyawogICAgICAgICAgICAgaW50byBhIEJpZyhHcmFwaClEYXRhIHByb2Nlc3NvciB2aWEgdGhlIE9MQVAgY29tcG9uZW50IG9mIHRoZSBHcmVtbGluIHRyYXZlcnNhbCBtYWNoaW5lLiBVc2VycyBkbyBub3QgaGF2ZSB0byBsZWFybiBTcGFyaydzIGRhdGEgcHJvY2Vzc2luZyBsYW5ndWFnZSBhcyBHcmVtbGluIHRyYXZlcnNhbHMgZXhlY3V0ZQogICAgICAgICAgICAgb3ZlciBTcGFyay4gRm9yIGdyYXBoIHN5c3RlbSBwcm92aWRlcnMsIHRoZXkgY2FuIGJvYXN0IFNwYXJrIGludGVncmF0aW9uIG9uY2UgYSBjdXN0b20gPGNvZGU+SW5wdXRSREQ8L2NvZGU+IChvciA8Y29kZT5JbnB1dEZvcm1hdDwvY29kZT4pIGlzIGRldmVsb3BlZC4KICAgICAgICAgIDwvbGk+Ci0gICAgICAgICA8bGk+PHN0cm9uZz5IYWRvb3Agc3VwcG9ydDwvc3Ryb25nPjogPGEgaHJlZj0iaHR0cDovL2hhZG9vcC5hcGFjaGUub3JnLyI+QXBhY2hlIEhhZG9vcDwvYT4mcmVnOyBoYXMgYmVjb21lIGEgc3RhcGxlIHRlY2hub2xvZ3kgZm9yIEJpZyBEYXRhIGFwcGxpY2F0aW9ucy4gSW4gVGlua2VyUG9wLCA8Y29kZT5TcGFya0dyYXBoQ29tcHV0ZXI8L2NvZGU+IGNhbiBwdWxsIGRhdGEKKyAgICAgICAgIDxsaT48c3Ryb25nPkhhZG9vcCBzdXBwb3J0PC9zdHJvbmc+OiA8YSBocmVmPSJodHRwczovL2hhZG9vcC5hcGFjaGUub3JnLyI+QXBhY2hlIEhhZG9vcDwvYT4mcmVnOyBoYXMgYmVjb21lIGEgc3RhcGxlIHRlY2hub2xvZ3kgZm9yIEJpZyBEYXRhIGFwcGxpY2F0aW9ucy4gSW4gVGlua2VyUG9wLCA8Y29kZT5TcGFya0dyYXBoQ29tcHV0ZXI8L2NvZGU+IGNhbiBwdWxsIGRhdGEKICAgICAgICAgICAgIGZyb20gdGhlIEhhZG9vcCBGaWxlIFN5c3RlbSAoPGEgaHJlZj0iaHR0cHM6Ly9oYWRvb3AuYXBhY2hlLm9yZy9kb2NzL3N0YWJsZS9oYWRvb3AtcHJvamVjdC1kaXN0L2hhZG9vcC1oZGZzL0hkZnNVc2VyR3VpZGUuaHRtbCI+SERGUzwvYT4pLiBUaW5rZXJQb3AgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIElucHV0LSBhbmQgT3V0cHV0Rm9ybWF0cyBmb3IgZGlmZmVyZW50IGdyYXBoIHNlcmlhbGl6YXRpb24gc3RhbmRhcmRzIGFzIHdlbGwgYXMgdG9vbGluZyB0aGF0IG1ha2VzIGl0IGVhc3kgZm9yIHVzZXJzCi0gICAgICAgICAgICB0byA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jaW50ZXJhY3Rpbmctd2l0aC1oZGZzIj5pbnRlcmFjdCB3aXRoIEhERlM8L2E+IGZyb20gdGhlIEdyZW1saW4gQ29uc29sZSBvciB0aGVpciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIHRvIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jaW50ZXJhY3Rpbmctd2l0aC1oZGZzIj5pbnRlcmFjdCB3aXRoIEhERlM8L2E+IGZyb20gdGhlIEdyZW1saW4gQ29uc29sZSBvciB0aGVpciBhcHBsaWNhdGlvbi4KICAgICAgICAgIDwvbGk+CiAgICAgICA8L3VsPgotICAgICAgPHA+SW5mb3JtYXRpb24gb24gaG93IHRvIGJ1aWxkIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgdmFyaW91cyBpbnRlcmZhY2VzIHRoYXQgVGlua2VyUG9wIHN1cHBvcnRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9kZXYvcHJvdmlkZXIvIj5Qcm92aWRlciBEb2N1bWVudGF0aW9uPC9hPi4KKyAgICAgIDxwPkluZm9ybWF0aW9uIG9uIGhvdyB0byBidWlsZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHZhcmlvdXMgaW50ZXJmYWNlcyB0aGF0IFRpbmtlclBvcCBzdXBwb3J0cyBjYW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L2Rldi9wcm92aWRlci8iPlByb3ZpZGVyIERvY3VtZW50YXRpb248L2E+LgogICAgICAgPGJyLz4KICAgICAgIDxoND5UaW5rZXJQb3AtRW5hYmxlZCBHcmFwaCBTeXN0ZW1zPC9oND4KICAgICAgIDxici8+CkBAIC0xMzUsOCArMTM1LDggQEAKICAgICAgIDxici8+CiAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IGNvbC1tZC02Ij4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kYXRhc3RheC5jb20vcHJvZHVjdHMvZGF0YXN0YXgtZW50ZXJwcmlzZS1ncmFwaCI+PGltZyBzcmM9ImltZy9sb2dvcy9kYXRhc3RheC1sb2dvLnBuZyIgc3R5bGU9InBhZGRpbmctcmlnaHQ6MjBweDtmbG9hdDpsZWZ0O3dpZHRoOjM1JTsiPjwvYT4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kYXRhc3RheC5jb20vcHJvZHVjdHMvZGF0YXN0YXgtZW50ZXJwcmlzZS1ncmFwaCI+RGF0YVN0YXggRW50ZXJwcmlzZSBHcmFwaDwvYT4mdHJhZGU7LCBwYXJ0IG9mIERhdGFTdGF4IEVudGVycHJpc2UncyBtdWx0aS1tb2RlbCBwbGF0Zm9ybSwgaXMgYSByZWFsLXRpbWUgZ3JhcGggZGF0YWJhc2UgYnVpbHQgZm9yIGNsb3VkIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gbWFuYWdlIGNvbXBsZXggYW5kIGhpZ2hseSBjb25uZWN0ZWQgZGF0YS4gQnVpbHQgb24gdGhlIGZvdW5kYXRpb24gb2YgQXBhY2hlIENhc3NhbmRyYSBhbmQgQXBhY2hlIFRpbmtlclBvcCwgRGF0YVN0YXggRW50ZXJwcmlzZSBHcmFwaCBkZWxpdmVycyBjb250aW51b3VzIHVwdGltZSBhbG9uZyB3aXRoIHByZWRpY3RhYmxlIHBlcmZvcm1hbmNlIGFuZCBzY2FsZSwgd2hpbGUgcmVtYWluaW5nIG9wZXJhdGlvbmFsbHkgc2ltcGxlIHRvIG1hbmFnZS4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZGF0YXN0YXguY29tL3Byb2R1Y3RzL2RhdGFzdGF4LWVudGVycHJpc2UtZ3JhcGgiPjxpbWcgc3JjPSJpbWcvbG9nb3MvZGF0YXN0YXgtbG9nby5wbmciIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OjIwcHg7ZmxvYXQ6bGVmdDt3aWR0aDozNSU7Ij48L2E+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2RhdGFzdGF4LmNvbS9wcm9kdWN0cy9kYXRhc3RheC1lbnRlcnByaXNlLWdyYXBoIj5EYXRhU3RheCBFbnRlcnByaXNlIEdyYXBoPC9hPiZ0cmFkZTssIHBhcnQgb2YgRGF0YVN0YXggRW50ZXJwcmlzZSdzIG11bHRpLW1vZGVsIHBsYXRmb3JtLCBpcyBhIHJlYWwtdGltZSBncmFwaCBkYXRhYmFzZSBidWlsdCBmb3IgY2xvdWQgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBtYW5hZ2UgY29tcGxleCBhbmQgaGlnaGx5IGNvbm5lY3RlZCBkYXRhLiBCdWlsdCBvbiB0aGUgZm91bmRhdGlvbiBvZiBBcGFjaGUgQ2Fzc2FuZHJhIGFuZCBBcGFjaGUgVGlua2VyUG9wLCBEYXRhU3RheCBFbnRlcnByaXNlIEdyYXBoIGRlbGl2ZXJzIGNvbnRpbnVvdXMgdXB0aW1lIGFsb25nIHdpdGggcHJlZGljdGFibGUgcGVyZm9ybWFuY2UgYW5kIHNjYWxlLCB3aGlsZSByZW1haW5pbmcgb3BlcmF0aW9uYWxseSBzaW1wbGUgdG8gbWFuYWdlLgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wtbWQtNiI+CiAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dyYWtuLmFpLyI+PGltZyBzcmM9ImltZy9sb2dvcy9ncmFrbi1sb2dvLnBuZyIgc3R5bGU9InBhZGRpbmctcmlnaHQ6MjBweDtmbG9hdDpsZWZ0O3dpZHRoOjM1JTsiPjwvYT4KQEAgLTIyMiw3ICsyMjIsNyBAQAogICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTggY29sLW1kLTkiPgogICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgIDxzdHJvbmc+RGlzdGluY3QgcXVlcnkgbGFuZ3VhZ2U8L3N0cm9uZz46IFF1ZXJ5IGxhbmd1YWdlcyBzdWNoIGFzIFNRTCBhbmQgU1BBUlFMIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIEdyZW1saW4gaW4gdGhhdCB0aGV5IHJlcXVpcmUgYSBzcGVjaWFsIHB1cnBvc2UgY29tcGlsZXIgaW4gb3JkZXIgdG8KLSAgICAgICAgICAgIGdlbmVyYXRlIGEgdHJhdmVyc2FsLiBGb3IgdGhpcyByZWFzb24sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2lsbWVzL3NxbC1ncmVtbGluIj5TUUw8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcnFsLWdyZW1saW4iPlNQQVJRTDwvYT4gR3JlbWxpbiBjb21waWxlcnMKKyAgICAgICAgICAgIGdlbmVyYXRlIGEgdHJhdmVyc2FsLiBGb3IgdGhpcyByZWFzb24sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2lsbWVzL3NxbC1ncmVtbGluIj5TUUw8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI3NwYXJxbC1ncmVtbGluIj5TUEFSUUw8L2E+IEdyZW1saW4gY29tcGlsZXJzCiAgICAgICAgICAgICBjdXJyZW50bHkgZXhpc3QuIE5vdGUgdGhhdCwgd2l0aGluIHJlYXNvbiwgR3JlbWxpbiBjb21waWxlcnMgZG8gbm90IG5lZWQgdG8gY29uY2VybiB0aGVtc2VsdmVzIHdpdGggYW4gb3B0aW1hbCBjb21waWxhdGlvbiAob25seSBhIHNlbWFudGljYWxseSBjb3JyZWN0IGNvbXBpbGF0aW9uKSBhcyB0aGUgR3JlbWxpbgogICAgICAgICAgICAgdHJhdmVyc2FsIG1hY2hpbmUgd2lsbCBsZXZlcmFnZSB0cmF2ZXJzYWwgc3RyYXRlZ2llcyBmb3IgYm90aCBjb21waWxlLXRpbWUgYW5kIHJ1bnRpbWUgb3B0aW1pemF0aW9ucy4gTW9yZW92ZXIsIHRoZSBsYW5ndWFnZSBkZXNpZ25lciBjYW4gcmVzdCBhc3N1cmVkIHRoYXQgcXVlcmllcyBpbiB0aGVpciBsYW5ndWFnZQogICAgICAgICAgICAgd2lsbCBiZSBhYmxlIHRvIGV2YWx1YXRlIGFzIGVpdGhlciBhbiBPTFRQIG9yIE9MQVAgcXVlcnkuIFRoZSBleGFtcGxlIG9uIHRoZSByaWdodCBpcyBhIFNQQVJRTCBxdWVyeSB0aGF0IGRldGVybWluZXMgdGhlIGF2ZXJhZ2UgcmF0aW5nIGZvciBHcmVtbGluJ3MgZnJpZW5kcycgcHJvamVjdHMuIEl0IGlzIGJlY2F1c2UKQEAgLTI0Myw3ICsyNDMsNyBAQAogICAgICAgPGJyLz4KICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNyBjb2wtbWQtOCI+Ci0gICAgICAgICAgICA8c3Ryb25nPkdyZW1saW4gbGFuZ3VhZ2UgdmFyaWFudHM8L3N0cm9uZz46IFRoZXJlIGFyZSB2YXJpb3VzIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvdHV0b3JpYWxzL2dyZW1saW4tbGFuZ3VhZ2UtdmFyaWFudHMvIj5HcmVtbGluIGxhbmd1YWdlIHZhcmlhbnRzPC9hPiBzdWNoIGFzIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLXB5dGhvbiI+R3JlbWxpbi1QeXRob248L2E+LiBUaGVzZSBsYW5ndWFnZXMKKyAgICAgICAgICAgIDxzdHJvbmc+R3JlbWxpbiBsYW5ndWFnZSB2YXJpYW50czwvc3Ryb25nPjogVGhlcmUgYXJlIHZhcmlvdXMgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvdHV0b3JpYWxzL2dyZW1saW4tbGFuZ3VhZ2UtdmFyaWFudHMvIj5HcmVtbGluIGxhbmd1YWdlIHZhcmlhbnRzPC9hPiBzdWNoIGFzIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1weXRob24iPkdyZW1saW4tUHl0aG9uPC9hPi4gVGhlc2UgbGFuZ3VhZ2VzCiAgICAgICAgICAgICBnZW5lcmF0ZSBHcmVtbGluIGJ5dGVjb2RlIHV0aWxpemluZyB0aGUgc2FtZSBuYW1pbmcvc3R5bGUtY29udmVudGlvbnMgYXMgR3JlbWxpbi1KYXZhLiBIb3dldmVyLCB3aGVyZSBhcHByb3ByaWF0ZSwgdGhleSBjYW4gZGV2aWF0ZSBmcm9tIGNvbnZlbnRpb24gaW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHVuaXF1ZSBleHByZXNzaXZlIHF1YWxpdGllcyBvZiB0aGUgaG9zdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBHcmVtbGluLVB5dGhvbiBzdXBwb3J0cyBpbmRleCBzbGljZXMsIGF0dHJpYnV0ZSBhY2Nlc3MsIGV0Yy4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTUgY29sLW1kLTQiPgpAQCAtMjc1LDIzICsyNzUsMjMgQEAKICAgICAgIDxici8+CiAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTYgY29sLW1kLTYiPgotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tY29uc29sZSI+PGltZyBzcmM9ImltZy9sb2dvcy9ncmVtbGluLWdyb292eS1sb2dvLnBuZyIgc3R5bGU9InBhZGRpbmctcmlnaHQ6MjBweDtmbG9hdDpsZWZ0O3dpZHRoOjM1JTsiPjwvYT4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLWNvbnNvbGUiPkdyZW1saW4tR3Jvb3Z5PC9hPiByZXByZXNlbnRzIEdyZW1saW4gaW5zaWRlIHRoZSBHcm9vdnkgbGFuZ3VhZ2UgYW5kIGNhbiBiZSBsZXZlcmFnZWQgYnkgYW55IEpWTS1iYXNlZCBwcm9qZWN0IGVpdGhlciB0aHJvdWdoIGdtYXZlbiBvciBpdHMgSlNSLTIyMyBTY3JpcHRFbmdpbmUgaW1wbGVtZW50YXRpb24uIEl0IGFsc28gc2VydmVzIGFzIHRoZSBHcmVtbGluIENvbnNvbGUgbGFuZ3VhZ2UuCisgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tY29uc29sZSI+PGltZyBzcmM9ImltZy9sb2dvcy9ncmVtbGluLWdyb292eS1sb2dvLnBuZyIgc3R5bGU9InBhZGRpbmctcmlnaHQ6MjBweDtmbG9hdDpsZWZ0O3dpZHRoOjM1JTsiPjwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1jb25zb2xlIj5HcmVtbGluLUdyb292eTwvYT4gcmVwcmVzZW50cyBHcmVtbGluIGluc2lkZSB0aGUgR3Jvb3Z5IGxhbmd1YWdlIGFuZCBjYW4gYmUgbGV2ZXJhZ2VkIGJ5IGFueSBKVk0tYmFzZWQgcHJvamVjdCBlaXRoZXIgdGhyb3VnaCBnbWF2ZW4gb3IgaXRzIEpTUi0yMjMgU2NyaXB0RW5naW5lIGltcGxlbWVudGF0aW9uLiBJdCBhbHNvIHNlcnZlcyBhcyB0aGUgR3JlbWxpbiBDb25zb2xlIGxhbmd1YWdlLgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wtbWQtNiI+Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jX29uX2dyZW1saW5fbGFuZ3VhZ2VfdmFyaWFudHMiPjxpbWcgc3JjPSJpbWcvbG9nb3MvZ3JlbWxpbi1qYXZhLWxvZ28ucG5nIiBzdHlsZT0icGFkZGluZy1yaWdodDoyMHB4O2Zsb2F0OmxlZnQ7d2lkdGg6MzUlOyI+PC9hPgotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI19vbl9ncmVtbGluX2xhbmd1YWdlX3ZhcmlhbnRzIj5HcmVtbGluLUphdmE8L2E+IHJlcHJlc2VudHMgR3JlbWxpbiBpbnNpZGUgdGhlIEphdmE4IGxhbmd1YWdlLiBHcmVtbGluLUphdmEgaXMgY29uc2lkZXJlZCB0aGUgY2Fub25pY2FsLCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgR3JlbWxpbiBhbmQgaXMgdGhlIHByaW1hcnkgY29tcGlsZXIgZm9yIGFsbCBsYW1iZGEtZnJlZSBieXRlY29kZSBkdWUgdG8gaXRzIHNwZWVkIHJlbGF0aXZlIHRvIG90aGVyIHNjcmlwdC1iYXNlZCwgSlZNIHZhcmlhbnRzLgorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNfb25fZ3JlbWxpbl9sYW5ndWFnZV92YXJpYW50cyI+PGltZyBzcmM9ImltZy9sb2dvcy9ncmVtbGluLWphdmEtbG9nby5wbmciIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OjIwcHg7ZmxvYXQ6bGVmdDt3aWR0aDozNSU7Ij48L2E+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI19vbl9ncmVtbGluX2xhbmd1YWdlX3ZhcmlhbnRzIj5HcmVtbGluLUphdmE8L2E+IHJlcHJlc2VudHMgR3JlbWxpbiBpbnNpZGUgdGhlIEphdmEgbGFuZ3VhZ2UuIEdyZW1saW4tSmF2YSBpcyBjb25zaWRlcmVkIHRoZSBjYW5vbmljYWwsIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBHcmVtbGluIGFuZCBpcyB0aGUgcHJpbWFyeSBjb21waWxlciBmb3IgYWxsIGxhbWJkYS1mcmVlIGJ5dGVjb2RlIGR1ZSB0byBpdHMgc3BlZWQgcmVsYXRpdmUgdG8gb3RoZXIgc2NyaXB0LWJhc2VkLCBKVk0gdmFyaWFudHMuCiAgICAgICAgICA8L2Rpdj4KICAgICAgIDwvZGl2PgogICAgICAgPGJyLz4KICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wtbWQtNiI+Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1weXRob24iPjxpbWcgc3JjPSJpbWcvbG9nb3MvZ3JlbWxpbi1weXRob24tbG9nby5wbmciIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OjIwcHg7ZmxvYXQ6bGVmdDt3aWR0aDozNSU7Ij48L2E+Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1weXRob24iPkdyZW1saW4tUHl0aG9uPC9hPiByZXByZXNlbnRzIEdyZW1saW4gaW5zaWRlIHRoZSBQeXRob24gbGFuZ3VhZ2UgYW5kIGNhbiBiZSB1c2VkIGJ5IGFueSBQeXRob24gdmlydHVhbCBtYWNoaW5lIHN1Y2ggYXMgQ1B5dGhvbiBhbmQgSnl0aG9uLiBHcmVtbGluLVB5dGhvbiB0cmF2ZXJzYWxzIHRyYW5zbGF0ZSB0byBHcmVtbGluIGJ5dGVjb2RlIGZvciBSZW1vdGVDb25uZWN0aW9uIGV4ZWN1dGlvbiAoZS5nLiBHcmVtbGluIFNlcnZlcikuCisgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tcHl0aG9uIj48aW1nIHNyYz0iaW1nL2xvZ29zL2dyZW1saW4tcHl0aG9uLWxvZ28ucG5nIiBzdHlsZT0icGFkZGluZy1yaWdodDoyMHB4O2Zsb2F0OmxlZnQ7d2lkdGg6MzUlOyI+PC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLXB5dGhvbiI+R3JlbWxpbi1QeXRob248L2E+IHJlcHJlc2VudHMgR3JlbWxpbiBpbnNpZGUgdGhlIFB5dGhvbiBsYW5ndWFnZSBhbmQgY2FuIGJlIHVzZWQgYnkgYW55IFB5dGhvbiB2aXJ0dWFsIG1hY2hpbmUgc3VjaCBhcyBDUHl0aG9uLiBHcmVtbGluLVB5dGhvbiB0cmF2ZXJzYWxzIHRyYW5zbGF0ZSB0byBHcmVtbGluIGJ5dGVjb2RlIGZvciBSZW1vdGVDb25uZWN0aW9uIGV4ZWN1dGlvbiAoZS5nLiBHcmVtbGluIFNlcnZlcikuCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IGNvbC1tZC02Ij4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLURvdE5ldCI+PGltZyBzcmM9ImltZy9sb2dvcy9ncmVtbGluLWRvdG5ldC1sb2dvLnBuZyIgc3R5bGU9InBhZGRpbmctcmlnaHQ6MjBweDtmbG9hdDpsZWZ0O3dpZHRoOjM1JTsiPjwvYT4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLURvdE5ldCI+R3JlbWxpbi5OZXQ8L2E+IHJlcHJlc2VudHMgR3JlbWxpbiBpbnNpZGUgdGhlIEMjIGxhbmd1YWdlIGFuZCBjYW4gYmUgdXNlZCBieSBhbnkgLk5FVC1iYXNlZCBwcm9qZWN0LiBHcmVtbGluLk5ldCB0cmF2ZXJzYWxzIHRyYW5zbGF0ZSB0byBHcmVtbGluIGJ5dGVjb2RlIGZvciBSZW1vdGVDb25uZWN0aW9uIGV4ZWN1dGlvbiAoZS5nLiBHcmVtbGluIFNlcnZlcikuCisgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI2dyZW1saW4tRG90TmV0Ij48aW1nIHNyYz0iaW1nL2xvZ29zL2dyZW1saW4tZG90bmV0LWxvZ28ucG5nIiBzdHlsZT0icGFkZGluZy1yaWdodDoyMHB4O2Zsb2F0OmxlZnQ7d2lkdGg6MzUlOyI+PC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNncmVtbGluLURvdE5ldCI+R3JlbWxpbi5OZXQ8L2E+IHJlcHJlc2VudHMgR3JlbWxpbiBpbnNpZGUgdGhlIEMjIGxhbmd1YWdlIGFuZCBjYW4gYmUgdXNlZCBieSBhbnkgLk5FVC1iYXNlZCBwcm9qZWN0LiBHcmVtbGluLk5ldCB0cmF2ZXJzYWxzIHRyYW5zbGF0ZSB0byBHcmVtbGluIGJ5dGVjb2RlIGZvciBSZW1vdGVDb25uZWN0aW9uIGV4ZWN1dGlvbiAoZS5nLiBHcmVtbGluIFNlcnZlcikuCiAgICAgICAgICA8L2Rpdj4KICAgICAgIDwvZGl2PgogICAgICAgPGJyLz4KQEAgLTMwOCw4ICszMDgsOCBAQAogICAgICAgPGJyLz4KICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wtbWQtNiI+Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcnFsLWdyZW1saW4iPjxpbWcgc3JjPSJpbWcvbG9nb3Mvc3BhcnFsLWdyZW1saW4tbG9nby5wbmciIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OjIwcHg7ZmxvYXQ6bGVmdDt3aWR0aDozNSU7Ij48L2E+Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcnFsLWdyZW1saW4iPlNQQVJRTC1HcmVtbGluPC9hPiBpcyBhIGNvbXBpbGVyIHVzZWQgdG8gdHJhbnNmb3JtIFNQQVJRTCBxdWVyaWVzIGludG8gR3JlbWxpbiBieXRlY29kZS4gSXQgaXMgYmFzZWQgb24gdGhlIEFwYWNoZSBKZW5hIFNQQVJRTCBwcm9jZXNzb3IgQVJRLCB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBzeW50YXggdHJlZSBvZiBhIFNQQVJRTCBxdWVyeS4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jc3BhcnFsLWdyZW1saW4iPjxpbWcgc3JjPSJpbWcvbG9nb3Mvc3BhcnFsLWdyZW1saW4tbG9nby5wbmciIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OjIwcHg7ZmxvYXQ6bGVmdDt3aWR0aDozNSU7Ij48L2E+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9yZWZlcmVuY2UvI3NwYXJxbC1ncmVtbGluIj5TUEFSUUwtR3JlbWxpbjwvYT4gaXMgYSBjb21waWxlciB1c2VkIHRvIHRyYW5zZm9ybSBTUEFSUUwgcXVlcmllcyBpbnRvIEdyZW1saW4gYnl0ZWNvZGUuIEl0IGlzIGJhc2VkIG9uIHRoZSBBcGFjaGUgSmVuYSBTUEFSUUwgcHJvY2Vzc29yIEFSUSwgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIGEgc3ludGF4IHRyZWUgb2YgYSBTUEFSUUwgcXVlcnkuCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IGNvbC1tZC02Ij4KICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2lsbWVzL3NxbC1ncmVtbGluIj48aW1nIHNyYz0iaW1nL2xvZ29zL3NxbC1ncmVtbGluLWxvZ28ucG5nIiBzdHlsZT0icGFkZGluZy1yaWdodDoyMHB4O2Zsb2F0OmxlZnQ7d2lkdGg6MzUlOyI+PC9hPgpkaWZmIC0tZ2l0IGEvZG9jcy9zaXRlL2hvbWUvdGVtcGxhdGUvaGVhZGVyLWZvb3Rlci5odG1sIGIvZG9jcy9zaXRlL2hvbWUvdGVtcGxhdGUvaGVhZGVyLWZvb3Rlci5odG1sCmluZGV4IDE5NDcwNjMuLjRjMTk4ZGIgMTAwNjQ0Ci0tLSBhL2RvY3Mvc2l0ZS9ob21lL3RlbXBsYXRlL2hlYWRlci1mb290ZXIuaHRtbAorKysgYi9kb2NzL3NpdGUvaG9tZS90ZW1wbGF0ZS9oZWFkZXItZm9vdGVyLmh0bWwKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CiAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgogICAgICAgPHRpdGxlPkFwYWNoZSBUaW5rZXJQb3A8L3RpdGxlPgotICAgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgR3JhcGggQ29tcHV0aW5nIEZyYW1ld29yayI+CisgICAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQXBhY2hlIFRpbmtlclBvcDogQSBHcmFwaCBDb21wdXRpbmcgRnJhbWV3b3JrIj4KICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQXBhY2hlIFRpbmtlclBvcCI+CiAgICAgICA8IS0tIEhUTUw1IHNoaW0gYW5kIFJlc3BvbmQuanMgZm9yIElFOCBzdXBwb3J0IG9mIEhUTUw1IGVsZW1lbnRzIGFuZCBtZWRpYSBxdWVyaWVzIC0tPgogICAgICAgPCEtLSBXQVJOSU5HOiBSZXNwb25kLmpzIGRvZXNuJ3Qgd29yayBpZiB5b3UgdmlldyB0aGUgcGFnZSB2aWEgZmlsZTovLyAtLT4KQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICAgICAgICAgICA8L2J1dHRvbj4KLSAgICAgICAgICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZyI+PGZvbnQgZmFjZT0iYW1lcmljYW4gdHlwZXdyaXRlciI+PGI+QXBhY2hlIFRpbmtlclBvcDwvYj48L2ZvbnQ+PC9hPgorICAgICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZyI+PGZvbnQgZmFjZT0iYW1lcmljYW4gdHlwZXdyaXRlciI+PGI+QXBhY2hlIFRpbmtlclBvcDwvYj48L2ZvbnQ+PC9hPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJuYXZiYXItY29sbGFwc2UtMSIgY2xhc3M9ImNvbGxhcHNlIG5hdmJhci1jb2xsYXBzZSI+CiAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2Ij4KQEAgLTc1LDMyICs3NSwzMiBAQAogICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiA8YiBjbGFzcz0iY2FyZXQiPjwvYj4KICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iZHJvcGRvd24tbWVudSI+Ci0gICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRyb3Bkb3duLWhlYWRlciI+TGF0ZXN0OiAzLjQuMiAoMjgtTWF5LTIwMTkpPC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50Ij5UaW5rZXJQb3AgMy40LjI8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3VwZ3JhZGUiPlVwZ3JhZGUgSW5mb3JtYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvY3VycmVudC9jb3JlLyI+Q29yZSBKYXZhZG9jIEFQSTwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9qYXZhZG9jcy9jdXJyZW50L2Z1bGwvIj5GdWxsIEphdmFkb2MgQVBJPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRyb3Bkb3duLWhlYWRlciI+TGF0ZXN0OiAzLjQuOCAoMy1BdWctMjAyMCk8L2xpPgorICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50Ij5UaW5rZXJQb3AgMy40Ljg8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC91cGdyYWRlIj5VcGdyYWRlIEluZm9ybWF0aW9uPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9qYXZhZG9jcy9jdXJyZW50L2NvcmUvIj5Db3JlIEphdmFkb2MgQVBJPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9qYXZhZG9jcy9jdXJyZW50L2Z1bGwvIj5GdWxsIEphdmFkb2MgQVBJPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgcm9sZT0ic2VwYXJhdG9yIiBjbGFzcz0iZGl2aWRlciI+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZHJvcGRvd24taGVhZGVyIj5NYWludGVuYW5jZTogMy4zLjcgKDI4LU1heS0yMDE5KTwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvMy4zLjcvIj5UaW5rZXJQb3AgMy4zLjY8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvMy4zLjcvY29yZS8iPkNvcmUgSmF2YWRvYyBBUEk8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvMy4zLjcvZnVsbC8iPkZ1bGwgSmF2YWRvYyBBUEk8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZHJvcGRvd24taGVhZGVyIj5NYWludGVuYW5jZTogMy4zLjExICgxLUp1bi0yMDIwKTwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzLzMuMy4xMS8iPlRpbmtlclBvcCAzLjMuMTE8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2phdmFkb2NzLzMuMy4xMS9jb3JlLyI+Q29yZSBKYXZhZG9jIEFQSTwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvMy4zLjExL2Z1bGwvIj5GdWxsIEphdmFkb2MgQVBJPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgcm9sZT0ic2VwYXJhdG9yIiBjbGFzcz0iZGl2aWRlciI+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8iPkRvY3VtZW50YXRpb24gQXJjaGl2ZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvIj5KYXZhZG9jIEFyY2hpdmVzPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzLyI+RG9jdW1lbnRhdGlvbiBBcmNoaXZlczwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvamF2YWRvY3MvIj5KYXZhZG9jIEFyY2hpdmVzPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgcm9sZT0ic2VwYXJhdG9yIiBjbGFzcz0iZGl2aWRlciI+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L2luZGV4Lmh0bWwjcHVibGljYXRpb25zIj5QdWJsaWNhdGlvbnM8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9pbmRleC5odG1sI3B1YmxpY2F0aW9ucyI+UHVibGljYXRpb25zPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZHJvcGRvd24iPgogICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImRyb3Bkb3duLXRvZ2dsZSIgZGF0YS10b2dnbGU9ImRyb3Bkb3duIiBocmVmPSIjIj5UdXRvcmlhbHM8YiBjbGFzcz0iY2FyZXQiPjwvYj48L2E+CiAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImRyb3Bkb3duLW1lbnUiPgogICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImdyZW1saW4uaHRtbCI+SW50cm9kdWN0aW9uIHRvIEdyZW1saW48L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3R1dG9yaWFscy9nZXR0aW5nLXN0YXJ0ZWQvIj5HZXR0aW5nIFN0YXJ0ZWQ8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3R1dG9yaWFscy90aGUtZ3JlbWxpbi1jb25zb2xlLyI+VGhlIEdyZW1saW4gQ29uc29sZTwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVjaXBlcy8iPkdyZW1saW4gUmVjaXBlczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvdHV0b3JpYWxzL2dyZW1saW4tbGFuZ3VhZ2UtdmFyaWFudHMvIj5HcmVtbGluIExhbmd1YWdlIFZhcmlhbnRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC90dXRvcmlhbHMvZ3JlbWxpbnMtYW5hdG9teS8iPkdyZW1saW4ncyBBbmF0b215PC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvdHV0b3JpYWxzL2dldHRpbmctc3RhcnRlZC8iPkdldHRpbmcgU3RhcnRlZDwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3R1dG9yaWFscy90aGUtZ3JlbWxpbi1jb25zb2xlLyI+VGhlIEdyZW1saW4gQ29uc29sZTwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlY2lwZXMvIj5HcmVtbGluIFJlY2lwZXM8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC90dXRvcmlhbHMvZ3JlbWxpbi1sYW5ndWFnZS12YXJpYW50cy8iPkdyZW1saW4gTGFuZ3VhZ2UgVmFyaWFudHM8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC90dXRvcmlhbHMvZ3JlbWxpbnMtYW5hdG9teS8iPkdyZW1saW4ncyBBbmF0b215PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgcm9sZT0ic2VwYXJhdG9yIiBjbGFzcz0iZGl2aWRlciI+PC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8va2VsdmlubGF3cmVuY2UubmV0L2Jvb2svR3JlbWxpbi1HcmFwaC1HdWlkZS5odG1sIj5Cb29rOiBQcmFjdGljYWwgR3JlbWxpbiBieSBLZWx2aW4gTGF3cmVuY2U8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc3FsMmdyZW1saW4uY29tLyI+U1FMMkdyZW1saW48L2E+PC9saT4KQEAgLTEyOCwxMiArMTI4LDEyIEBACiAgICAgICAgICAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiA8YiBjbGFzcz0iY2FyZXQiPjwvYj4KICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iZHJvcGRvd24tbWVudSI+Ci0gICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlIEhvbWVwYWdlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyI+TGljZW5zZTwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGUgSG9tZXBhZ2U8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyI+TGljZW5zZTwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZXZlbnRzL2N1cnJlbnQtZXZlbnQiPkV2ZW50czwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9zZWN1cml0eS8iPlNlY3VyaXR5PC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIj5UaGFua3M8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL3NlY3VyaXR5LyI+U2VjdXJpdHk8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgPC91bD4KQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgISEhISFCT0RZISEhISEKICAgICAgIDxkaXYgaWQ9ImZvb3RlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgotICAgICAgICAgICAgPHAgY2xhc3M9Im11dGVkIGNyZWRpdCI+Q29weXJpZ2h0IMKpIDIwMTUtMjAxOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uPGJyLz5BcGFjaGUgVGlua2VyUG9wLCBUaW5rZXJQb3AsIEFwYWNoZSwgQXBhY2hlIGZlYXRoZXIgbG9nbywgYW5kIEFwYWNoZSBUaW5rZXJQb3AgcHJvamVjdCBsb2dvIGFyZSBlaXRoZXIgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9yIHRyYWRlbWFya3Mgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9hPiBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgb3RoZXIgY291bnRyaWVzLgorICAgICAgICAgICAgPHAgY2xhc3M9Im11dGVkIGNyZWRpdCI+Q29weXJpZ2h0IMKpIDIwMTUtMjAxOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uPGJyLz5BcGFjaGUgVGlua2VyUG9wLCBUaW5rZXJQb3AsIEFwYWNoZSwgQXBhY2hlIGZlYXRoZXIgbG9nbywgYW5kIEFwYWNoZSBUaW5rZXJQb3AgcHJvamVjdCBsb2dvIGFyZSBlaXRoZXIgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9yIHRyYWRlbWFya3Mgb2YgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy8iPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIG90aGVyIGNvdW50cmllcy4KICAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9kZXYvZGV2ZWxvcGVyL2RldmVsb3BtZW50LWVudmlyb25tZW50LmFzY2lpZG9jIGIvZG9jcy9zcmMvZGV2L2RldmVsb3Blci9kZXZlbG9wbWVudC1lbnZpcm9ubWVudC5hc2NpaWRvYwppbmRleCBjMDJkZWE4Li5iMmZlYTUyIDEwMDY0NAotLS0gYS9kb2NzL3NyYy9kZXYvZGV2ZWxvcGVyL2RldmVsb3BtZW50LWVudmlyb25tZW50LmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL2Rldi9kZXZlbG9wZXIvZGV2ZWxvcG1lbnQtZW52aXJvbm1lbnQuYXNjaWlkb2MKQEAgLTI2LDggKzI2LDEwIEBACiBbW3N5c3RlbS1jb25maWd1cmF0aW9uXV0KID09IFN5c3RlbSBDb25maWd1cmF0aW9uCiAKLUF0IGEgbWluaW11bSwgZGV2ZWxvcG1lbnQgb2YgVGlua2VyUG9wIHJlcXVpcmVzIGxpbms6aHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlL2Rvd25sb2Fkcy9qZGs4LWRvd25sb2Fkcy0yMTMzMTUxLmh0bWxbSmF2YSAxLjguMF80MCtdCi1hbmQgbGluazpodHRwczovL21hdmVuLmFwYWNoZS5vcmcvZG93bmxvYWQuY2dpW01hdmVuIDMuMi41K10uIE1hdmVuIGlzIHVzZWQgYXMgdGhlIGNvbW1vbiBidWlsZCBzeXN0ZW0sIHdoaWNoIGV2ZW4KK0F0IGEgbWluaW11bSwgZGV2ZWxvcG1lbnQgb2YgVGlua2VyUG9wIHJlcXVpcmVzIGxpbms6aHR0cHM6Ly9vcGVuamRrLmphdmEubmV0L3Byb2plY3RzL2pkazgvW0phdmEgOF0gYnV0IGl0IGlzCitwcmVmZXJhYmxlIHRvIHVzZSBsaW5rOmh0dHBzOi8vb3Blbmpkay5qYXZhLm5ldC9wcm9qZWN0cy9qZGsvMTEvW0phdmEgMTFdIGNyb3NzLWNvbXBpbGVkIHRvIEphdmEgOCAodGhlCitjcm9zcy1jb21waWxhdGlvbiBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiB0aGUgYnVpbGQpLiBNYXZlbiAocmVxdWlyaW5nIGEgbWluaW11bSBvZgorbGluazpodHRwczovL21hdmVuLmFwYWNoZS5vcmcvZG93bmxvYWQuY2dpW01hdmVuIDMuMy45K10pIGlzIHVzZWQgYXMgdGhlIGNvbW1vbiBidWlsZCBzeXN0ZW0sIHdoaWNoIGV2ZW4KIGNvbnRyb2xzIHRoZSBidWlsZHMgb2Ygbm9uLUpWTSBsaW5rOmh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3R1dG9yaWFscy9ncmVtbGluLWxhbmd1YWdlLXZhcmlhbnRzL1tHTFZzXQogc3VjaCBhcyBgZ3JlbWxpbi1weXRob25gLiBKYXZhIGFuZCBNYXZlbiBhcmUgZGVzY3JpYmVkIGFzIGEgIm1pbmltdW0iIGZvciBhIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBiZWNhdXNlIHRoZXkKIHdpbGwgb25seSBidWlsZCBKVk0gcG9ydGlvbnMgb2YgVGlua2VyUG9wIGFuZCBtYW55IGludGVncmF0aW9uIHRlc3RzIHdpbGwgbm90IGZpcmUgd2l0aCB0aGlzIHNpbXBsZSBzZXR1cC4gSXQgaXMKQEAgLTM3LDYgKzM5LDkgQEAKIFRvIGdhaW4gdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhbGwgYXNwZWN0cyBvZiB0aGUgVGlua2VyUG9wIGJ1aWxkIHN5c3RlbSwgb3RoZXIgZW52aXJvbm1lbnRhbCBjb25maWd1cmF0aW9ucyBtdXN0IGJlCiBlc3RhYmxpc2hlZC4gVGhvc2UgcHJlcmVxdWlzaXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zLgogCitJTVBPUlRBTlQ6IFVzZSBKYXZhIDExIGZvciBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gd2l0aCBgYmluL3Byb2Nlc3MtZG9jcy5zaGAgYW5kIGZvciBvdGhlciBidWlsZCBmZWF0dXJlcyBvdXRzaWRlCitvZiB0aGUgYmFzaWMgYG12biBjbGVhbiBpbnN0YWxsYCBzb3J0IG9mIGZ1bmN0aW9uLgorCiBJTVBPUlRBTlQ6IEZvciB0aG9zZSB3aG8gaW50ZW5kIHRvIG9mZmVyIGEgY29udHJpYnV0aW9uLCBidWlsZGluZyB3aXRoIGEgbWluaW1hbCBjb25maWd1cmF0aW9uIG1heSBub3QgYmUgc3VmZmljaWVudAogd2hlbiBzdWJtaXR0aW5nIGEgcHVsbCByZXF1ZXN0LiBDb25zaWRlciBzZXR0aW5nIHVwIHRoZSBmdWxsIGVudmlyb25tZW50LgogCkBAIC0xMDcsMTEgKzExMiwzMiBAQAogc2NyaXB0cyBzaG91bGQgd29yayBvbiBNYWMgYW5kIExpbnV4LgogCiBUbyBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uLCBpdCBpcyByZXF1aXJlZCB0aGF0IGxpbms6aHR0cHM6Ly9oYWRvb3AuYXBhY2hlLm9yZ1tIYWRvb3AgMi43LnhdIGlzIHJ1bm5pbmcgaW4KLWxpbms6aHR0cHM6Ly9oYWRvb3AuYXBhY2hlLm9yZy9kb2NzL3IyLjcuMi9oYWRvb3AtcHJvamVjdC1kaXN0L2hhZG9vcC1jb21tb24vU2luZ2xlQ2x1c3Rlci5odG1sI1BzZXVkby1EaXN0cmlidXRlZF9PcGVyYXRpb25bcHNldWRvLWRpc3RyaWJ1dGVkXQorbGluazpodHRwczovL2hhZG9vcC5hcGFjaGUub3JnL2RvY3MvcjIuNy43L2hhZG9vcC1wcm9qZWN0LWRpc3QvaGFkb29wLWNvbW1vbi9TaW5nbGVDbHVzdGVyLmh0bWwjUHNldWRvLURpc3RyaWJ1dGVkX09wZXJhdGlvbltwc2V1ZG8tZGlzdHJpYnV0ZWRdCiBtb2RlLiBCZSBzdXJlIHRvIHNldCB0aGUgYEhBRE9PUF9HUkVNTElOX0xJQlNgIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIGRlc2NyaWJlZCBpbiB0aGUKIGxpbms6aHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlLyNoYWRvb3AtZ3JlbWxpbltyZWZlcmVuY2UgZG9jdW1lbnRhdGlvbl0uIEl0IGlzIGFsc28gaW1wb3J0YW50CiB0byBzZXQgdGhlIGBDTEFTU1BBVEhgIHRvIHBvaW50IGF0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSGFkb29wIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGxpa2UgYG1hcHJlZC1zaXRlLnhtbGAuCiAKK1RoZSBgL2V0Yy9oYWRvb3AveWFybi1zaXRlLnhtbGAgZmlsZSBwcmVmZXJzIHRoaXMgY29uZmlndXJhdGlvbiBvdmVyIHRoZSBvbmUgcHJvdmlkZWQgaW4gdGhlIEhhZG9vcCBkb2N1bWVudGF0aW9uCityZWZlcmVuY2VkIGFib3ZlOgorCitbc291cmNlLHhtbF0KKy0tLS0KKzxjb25maWd1cmF0aW9uPgorICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgPG5hbWU+eWFybi5ub2RlbWFuYWdlci5hdXgtc2VydmljZXM8L25hbWU+CisgICAgICAgIDx2YWx1ZT5tYXByZWR1Y2Vfc2h1ZmZsZTwvdmFsdWU+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHk+CisgICAgICAgIDxuYW1lPnlhcm4ubm9kZW1hbmFnZXIudm1lbS1jaGVjay1lbmFibGVkPC9uYW1lPgorICAgICAgICA8dmFsdWU+ZmFsc2U8L3ZhbHVlPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5PgorICAgICAgICA8bmFtZT55YXJuLm5vZGVtYW5hZ2VyLnZtZW0tcG1lbS1yYXRpbzwvbmFtZT4KKyAgICAgICAgPHZhbHVlPjQ8L3ZhbHVlPgorICAgIDwvcHJvcGVydHk+Cis8L2NvbmZpZ3VyYXRpb24+CistLS0tCisKIEFsc28gbm90ZSB0aGF0IGxpbms6aHR0cDovL3d3dy5ncnltb2lyZS5jb20vVW5peC9Bd2suaHRtbFthd2tdIHZlcnNpb24gYDQuMC4xYCBpcyByZXF1aXJlZCBmb3IgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLgogCiBEb2N1bWVudGF0aW9uIGNhbiBiZSBnZW5lcmF0ZWQgbG9jYWxseSB3aXRoOgpAQCAtMTM4LDggKzE2NCwxMyBAQAogSmF2YSB0ZXN0cyB0aGF0IHJlcXVpcmUgUHl0aG9uIGNvZGUgd2lsbCBiZSBza2lwcGVkLiBEZXZlbG9wZXJzIHNob3VsZCBhbHNvIGluc3RhbGwgbGluazpodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3BpcFtwaXBdCiBhbmQgbGluazpodHRwczovL3ZpcnR1YWxlbnYucHlwYS5pby9lbi9zdGFibGUvW3ZpcnR1YWxlbnZdICh2ZXJzaW9uIDE1LjAuMiAtIG9sZGVyIHZlcnNpb25zIG1heSBjYXVzZSBidWlsZCBmYWlsdXJlcykuCiAKLVRoZSBidWlsZCBleHBlY3RzIHR3byBQeXRob24gZXhlY3V0YWJsZXMgYHB5dGhvbmAgYW5kIGBweXRob24zYCB3aGVyZSBgcHl0aG9uYCBtYXBzIHRvIDIuNy42IGFuZCBgcHl0aG9uM2AgaXMgMy40LjMgb3IKLWhpZ2hlci4gT25jZSB0aGUgUHl0aG9uIGVudmlyb25tZW50IGlzIGVzdGFibGlzaGVkLCB0aGUgZnVsbCBidWlsZGluZyBhbmQgdGVzdGluZyBvZiBgZ3JlbWxpbi1weXRob25gIG1heSBjb21tZW5jZS4gSXQKK1RoZSBidWlsZCBleHBlY3RzIFB5dGhvbiBhIGBweXRob24zYCBpbnN0YWxsYXRpb24gd2hpY2ggc2hvdWxkIGJlIDMuNS4zIG9yIGJldHRlci4gUHl0aG9uIGFsc28gdGVzdHMga2VyYmVyb3MgYW5kCit0aGVyZWZvcmUgcmVxdWlyZXM6CisKK1tzb3VyY2UsdGV4dF0KK3N1ZG8gYXB0IGluc3RhbGwgbGlia3JiNS1kZXYga3JiNS11c2VyCisKK09uY2UgdGhlIFB5dGhvbiBlbnZpcm9ubWVudCBpcyBlc3RhYmxpc2hlZCwgdGhlIGZ1bGwgYnVpbGRpbmcgYW5kIHRlc3Rpbmcgb2YgYGdyZW1saW4tcHl0aG9uYCBtYXkgY29tbWVuY2UuIEl0CiBjYW4gYmUgZG9uZSBtYW51YWxseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aDoKIAogW3NvdXJjZSx0ZXh0XQpAQCAtMTQ5LDEwICsxODAsMTAgQEAKIGBncmVtbGluLXB5dGhvbmAgbW9kdWxlIHdoaWNoIHdpbGwgc2lnbmlmeSB0byBNYXZlbiB0aGF0IHRoZSBlbnZpcm9ubWVudCBpcyBQeXRob24tcmVhZHkuIFRoZSBgLmdsdmAgZmlsZSBuZWVkIG5vdCBoYXZlCiBhbnkgY29udGVudHMgYW5kIGlzIGlnbm9yZWQgYnkgR2l0LiBBIHN0YW5kYXJkIGBtdm4gY2xlYW4gaW5zdGFsbGAgd2lsbCB0aGVuIGJ1aWxkIGBncmVtbGluLXB5dGhvbmAgaW4gZnVsbC4KIAotQXMgb2YgVGlua2VyUG9wIDMuMi41LCB0aGUgYnVpbGQgYWxzbyByZXF1aXJlcyBQeXRob24gdG8gZXhlY3V0ZSBgZ3JlbWxpbi1jb25zb2xlYCBpbnRlZ3JhdGlvbiB0ZXN0cy4gVGhlIGludGVncmF0aW9uCi10ZXN0IGlzIGNvbmZpZ3VyZWQgYnkgYSAiY29uc29sZS1pbnRlZ3JhdGlvbi10ZXN0cyIgTWF2ZW4gcHJvZmlsZS4gVGhpcyBwcm9maWxlIGNhbiBiZSBhY3RpdmF0ZWQgbWFudWFsbHkgb3IgY2FuIG1vcmUKLXNpbXBseSBwaWdneS1iYWNrIG9uIHRoZSBgLmdsdmAgZmlsZSBpbiBgZ3JlbWxpbi1weXRob25gLiBOb3RlIHRoYXQgdW5saWtlIGBncmVtbGluLXB5dGhvbmAgdGhlIHRlc3RzIGFyZSBhY3R1YWxseQotaW50ZWdyYXRpb24gdGVzdHMgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGFjdGl2ZWx5IHN3aXRjaGVkIG9uIHdpdGggYC1Ec2tpcEludGVncmF0aW9uVGVzdHM9ZmFsc2VgOgorVGhlIGJ1aWxkIGFsc28gcmVxdWlyZXMgUHl0aG9uIHRvIGV4ZWN1dGUgYGdyZW1saW4tY29uc29sZWAgaW50ZWdyYXRpb24gdGVzdHMuIFRoZSBpbnRlZ3JhdGlvbiB0ZXN0IGlzIGNvbmZpZ3VyZWQgYnkgYQorImNvbnNvbGUtaW50ZWdyYXRpb24tdGVzdHMiIE1hdmVuIHByb2ZpbGUuIFRoaXMgcHJvZmlsZSBjYW4gYmUgYWN0aXZhdGVkIG1hbnVhbGx5IG9yIGNhbiBtb3JlIHNpbXBseSBwaWdneS1iYWNrIG9uCit0aGUgYC5nbHZgIGZpbGUgaW4gYGdyZW1saW4tcHl0aG9uYC4gTm90ZSB0aGF0IHVubGlrZSBgZ3JlbWxpbi1weXRob25gIHRoZSB0ZXN0cyBhcmUgYWN0dWFsbHkgaW50ZWdyYXRpb24gdGVzdHMgYW5kCit0aGVyZWZvcmUgbXVzdCBiZSBhY3RpdmVseSBzd2l0Y2hlZCBvbiB3aXRoIGAtRHNraXBJbnRlZ3JhdGlvblRlc3RzPWZhbHNlYDoKIAogW3NvdXJjZSx0ZXh0XQogbXZuIGNsZWFuIGluc3RhbGwgLXBsIGdyZW1saW4tY29uc29sZSAtRHNraXBJbnRlZ3JhdGlvblRlc3RzPWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9kZXYvZGV2ZWxvcGVyL2Zvci1jb21taXR0ZXJzLmFzY2lpZG9jIGIvZG9jcy9zcmMvZGV2L2RldmVsb3Blci9mb3ItY29tbWl0dGVycy5hc2NpaWRvYwppbmRleCA1NTE5Nzk1Li44ZjdiNjNkIDEwMDY0NAotLS0gYS9kb2NzL3NyYy9kZXYvZGV2ZWxvcGVyL2Zvci1jb21taXR0ZXJzLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL2Rldi9kZXZlbG9wZXIvZm9yLWNvbW1pdHRlcnMuYXNjaWlkb2MKQEAgLTk5LDcgKzk5LDcgQEAKICogYDMuMC1kZXZgIC0gMy4wLnggKG5vIGxvbmdlciBtYWludGFpbmVkKQogKiBgMy4xLWRldmAgLSAzLjEueCAobm8gbG9uZ2VyIG1haW50YWluZWQpCiAqIGAzLjItZGV2YCAtIDMuMi54IChubyBsb25nZXIgbWFpbnRhaW5lZCkKLSogYDMuMy1kZXZgIC0gMy4zLnggKG1ham9yIGJ1ZyBmaXhlcyBvbmx5KQorKiBgMy4zLWRldmAgLSAzLjMueCAobm8gbG9uZ2VyIG1haW50YWluZWQpCiAqIGAzLjQtZGV2YCAtIDMuNC54IChjdXJyZW50IGRldmVsb3BtZW50KQogKiBgbWFzdGVyYCAtIDMuNS54IChmdXR1cmUgZGV2ZWxvcG1lbnQpCiAqIGA0LjAtZGV2YCAtIDQuMC54IChmdXR1cmUgZGV2ZWxvcG1lbnQpCkBAIC0yMzIsNyArMjMyLDcgQEAKICoqIGBnZXRfZ19WX2dyb3VwQ291bnRfYnlYbmFtZVgoKWAKICoqIGBnZXRfZ19WX2dyb3VwQ291bnRYYVhfYnlYbmFtZVhfY2FwWGFYKClgCiAqIFRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgdGVzdCBjYXNlIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgdHJhdmVyc2FsIGdlbmVyYXRvciBtaW51cyB0aGUgYGdldF9gIHByZWZpeC4KLSogVGhlIEdyZW1saW4tR3Jvb3Z5IHZlcnNpb24gb2YgdGhlIHRlc3Qgc2hvdWxkIHVzZSB0aGUgc3VnYXIgc3ludGF4IGluIG9yZGVyIHRvIHRlc3Qgc3VnYXIgKGFzIEdyZW1saW4tSmF2YTggdGVzdHMgdGVzdCBzdGFuZGFyZCBzeW50YXgpLgorKiBUaGUgR3JlbWxpbi1Hcm9vdnkgdmVyc2lvbiBvZiB0aGUgdGVzdCBzaG91bGQgdXNlIHRoZSBzdWdhciBzeW50YXggaW4gb3JkZXIgdG8gdGVzdCBzdWdhciAoYXMgR3JlbWxpbi1KYXZhIHRlc3RzIHRlc3Qgc3RhbmRhcmQgc3ludGF4KS4KICoqIGBnLlYuYWdlLnN1bWAKICogQXZvaWQgdXNpbmcgbGFtYmRhcyBpbiB0aGUgdGVzdCBjYXNlIHVubGVzcyB0aGF0IGlzIGV4cGxpY2l0bHkgd2hhdCBpcyBiZWluZyB0ZXN0ZWQgYXMgT0xBUCBzeXN0ZW1zIHdpbGwgdHlwaWNhbGx5IG5vdCBiZSBhYmxlIHRvIGV4ZWN1dGUgdGhvc2UgdGVzdHMuCiAqIGBBYnN0cmFjdEdyZW1saW5Qcm9jZXNzVGVzdGAgaGFzIHZhcmlvdXMgc3RhdGljIG1ldGhvZHMgdG8gbWFrZSB3cml0aW5nIGEgdGVzdCBjYXNlIGVhc3kuCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9kZXYvZGV2ZWxvcGVyL3JlbGVhc2UuYXNjaWlkb2MgYi9kb2NzL3NyYy9kZXYvZGV2ZWxvcGVyL3JlbGVhc2UuYXNjaWlkb2MKaW5kZXggNjc3ZTVmOS4uODIzZDhjNiAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvZGV2L2RldmVsb3Blci9yZWxlYXNlLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL2Rldi9kZXZlbG9wZXIvcmVsZWFzZS5hc2NpaWRvYwpAQCAtMTQ0LDEyICsxNDQsMTggQEAKIC4gYGRvY2tlci9idWlsZC5zaCAtdCAtaSAtbmAKIC4gYGJpbi9wdWJsaXNoLWRvY3Muc2ggPHVzZXJuYW1lPmAgLSBub3RlIHRoYXQgdW5kZXIgYSByZWxlYXNlIGNhbmRpZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBpcyBwdWJsaXNoZWQgYXMgU05BUFNIT1QKIC4gYG12biB2ZXJzaW9uczpzZXQgLURuZXdWZXJzaW9uPXh4Lnl5Lnp6IC1EZ2VuZXJhdGVCYWNrdXBQb21zPWZhbHNlYCB0byB1cGRhdGUgdGhlIHByb2plY3QgZmlsZXMgdG8gcmVmZXJlbmNlIGEgbm9uLVNOQVBTSE9UIHZlcnNpb24KKy4gYG12biBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzYCB0byB1cGRhdGUgR0xWIHZlcnNpb25zCisuLiBSZXZpZXcgYEdyZW1saW4uTmV0LmNzcHJvamAsIGBHcmVtbGluLk5ldC5UZW1wbGF0ZS5jc3Byb2pgIGFuZCBgR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjYCBpbiBgZ3JlbWxpbi1kb3RuZXRgCisuLiBSZXZpZXcgYHBhY2thZ2UuanNvbmAgaW4gYGdyZW1saW4tamF2YXNjcmlwdGAKIC4gYHB1c2hkIGdyZW1saW4tY29uc29sZS9iaW47IGxuIC1mcyAuLi90YXJnZXQvYXBhY2hlLXRpbmtlcnBvcC1ncmVtbGluLWNvbnNvbGUteHgueXkuenotc3RhbmRhbG9uZS9iaW4vZ3JlbWxpbi5zaCBncmVtbGluLnNoOyBwb3BkYAogLiBgZ2l0IGRpZmZgIGFuZCByZXZpZXcgdGhlIHVwZGF0ZWQgZmlsZXMKIC4gYGdpdCBjb21taXQgLWEgLW0gIlRpbmtlclBvcCB4eC55eS56eiByZWxlYXNlImAgYW5kIGBnaXQgcHVzaGAKIC4gYGdpdCB0YWcgLWEgLW0gIlRpbmtlclBvcCB4eC55eS56eiByZWxlYXNlIiB4eC55eS56emAgYW5kIGBnaXQgcHVzaCAtLXRhZ3NgCiAuIGBtdm4gY2xlYW4gaW5zdGFsbGAKIC4gYG12biB2ZXJzaW9uczpzZXQgLURuZXdWZXJzaW9uPXh4Lnl5Lnp6LVNOQVBTSE9UIC1EZ2VuZXJhdGVCYWNrdXBQb21zPWZhbHNlYCB0byBnbyBiYWNrIHRvIFNOQVBTSE9UCisuIGBtdm4gY2xlYW4gaW5zdGFsbCAtRHNraXBUZXN0c2AgdG8gdXBkYXRlIEdMViB2ZXJzaW9ucworLi4gUmV2aWV3IGBHcmVtbGluLk5ldC5jc3Byb2pgLCBgR3JlbWxpbi5OZXQuVGVtcGxhdGUuY3Nwcm9qYCBhbmQgYEdyZW1saW4uTmV0LlRlbXBsYXRlLm51c3BlY2AgaW4gYGdyZW1saW4tZG90bmV0YAorLi4gUmV2aWV3IGBwYWNrYWdlLmpzb25gIGluIGBncmVtbGluLWphdmFzY3JpcHRgCiAuIGBwdXNoZCBncmVtbGluLWNvbnNvbGUvYmluOyBsbiAtZnMgLi4vdGFyZ2V0L2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1jb25zb2xlLXh4Lnl5Lnp6LVNOQVBTSE9ULXN0YW5kYWxvbmUvYmluL2dyZW1saW4uc2ggZ3JlbWxpbi5zaDsgcG9wZGAKIC4gYGdpdCBjb21taXQgLWEgLW0gIlJldHVybmVkIHRvIHh4Lnl5Lnp6LVNOQVBTSE9UImAgYW5kIGBnaXQgcHVzaGAKIC4gQW5ub3VuY2UgdGhlIHJlbGVhc2UgY2FuZGlkYXRlIHRvIGBkZXZgIG1haWxpbmcgbGlzdCBhbmQgYXdhaXQgZmVlZGJhY2sKQEAgLTIwNSw2ICsyMTEsOSBAQAogYXMgYWNjdXJhdGUgYXMgcG9zc2libGUgYW5kIHRoZSByZWxlYXNlIHRhZ3MgYXJlIHByZXNlbnQpLgogLi4gUHJldmlldyBjaGFuZ2VzIGxvY2FsbHkgd2l0aCBgYmluL2dlbmVyYXRlLWhvbWUuc2hgIHRoZW4gY29tbWl0IGNoYW5nZXMgdG8gZ2l0LgogLiBgbXZuIHZlcnNpb25zOnNldCAtRG5ld1ZlcnNpb249eHgueXkuenogLURnZW5lcmF0ZUJhY2t1cFBvbXM9ZmFsc2VgIHRvIHVwZGF0ZSBwcm9qZWN0IGZpbGVzIHRvIHJlZmVyZW5jZSB0aGUgbm9uLVNOQVBTSE9UIHZlcnNpb24KKy4gYG12biBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzYCB0byB1cGRhdGUgR0xWIHZlcnNpb25zCisuLiBSZXZpZXcgYEdyZW1saW4uTmV0LmNzcHJvamAsIGBHcmVtbGluLk5ldC5UZW1wbGF0ZS5jc3Byb2pgIGFuZCBgR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjYCBpbiBgZ3JlbWxpbi1kb3RuZXRgCisuLiBSZXZpZXcgYHBhY2thZ2UuanNvbmAgaW4gYGdyZW1saW4tamF2YXNjcmlwdGAKIC4gYHB1c2hkIGdyZW1saW4tY29uc29sZS9iaW47IGxuIC1mcyAuLi90YXJnZXQvYXBhY2hlLXRpbmtlcnBvcC1ncmVtbGluLWNvbnNvbGUteHgueXkuenotc3RhbmRhbG9uZS9iaW4vZ3JlbWxpbi5zaCBncmVtbGluLnNoOyBwb3BkYAogLiBgZ2l0IGRpZmZgIGFuZCByZXZpZXcgdGhlIHVwZGF0ZWQgZmlsZXMKIC4gYG12biBjbGVhbiBpbnN0YWxsYCAtIG5lZWQgdG8gYnVpbGQgZmlyc3Qgc28gdGhhdCB0aGUgcmlnaHQgdmVyc2lvbiBvZiB0aGUgY29uc29sZSBpcyB1c2VkIHdpdGggYGJpbi9wdWJsaXNoLWRvY3Muc2hgCkBAIC0yODAsNiArMjg5LDkgQEAKIC4gUHJlcGFyZSBHaXQgYWRtaW5pc3RyYXRpb24gdGFza3MuIEFwcGx5IHRoZSBmb2xsb3dpbmcgc3RlcHMgYXMgbmVlZGVkIHBlciByZWxlYXNlIGJyYW5jaDoKIC4uIE1ha2UgdGhlIGFwcHJvcHJpYXRlIGJyYW5jaGluZyBjaGFuZ2VzIGFzIHJlcXVpcmVkIGJ5IHRoZSByZWxlYXNlIGFuZCBidW1wIHRoZSB2ZXJzaW9uIHRvIGBTTkFQU0hPVGAgd2l0aAogYG12biB2ZXJzaW9uczpzZXQgLURuZXdWZXJzaW9uPXh4Lnl5Lnp6LVNOQVBTSE9UIC1EZ2VuZXJhdGVCYWNrdXBQb21zPWZhbHNlYC4KKy4gYG12biBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzYCB0byB1cGRhdGUgR0xWIHZlcnNpb25zCisuLiBSZXZpZXcgYEdyZW1saW4uTmV0LmNzcHJvamAsIGBHcmVtbGluLk5ldC5UZW1wbGF0ZS5jc3Byb2pgIGFuZCBgR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjYCBpbiBgZ3JlbWxpbi1kb3RuZXRgCisuLiBSZXZpZXcgYHBhY2thZ2UuanNvbmAgaW4gYGdyZW1saW4tamF2YXNjcmlwdGAKIC4uIGBwdXNoZCBncmVtbGluLWNvbnNvbGUvYmluOyBsbiAtZnMgLi4vdGFyZ2V0L2FwYWNoZS10aW5rZXJwb3AtZ3JlbWxpbi1jb25zb2xlLXh4Lnl5Lnp6LVNOQVBTSE9ULXN0YW5kYWxvbmUvYmluL2dyZW1saW4uc2ggZ3JlbWxpbi5zaDsgcG9wZGAKIC4uIFVwZGF0ZSBDSEFOR0VMT0cgYW5kIHVwZ3JhZGUgZG9jcyB0byBoYXZlIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIGZvciB0aGUgbmV4dCB2ZXJzaW9uLgogLi4gYG12biBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzYCAtIG5lZWQgdG8gYnVpbGQgZmlyc3Qgc28gdGhhdCB0aGUgcmlnaHQgdmVyc2lvbiBvZiB0aGUgY29uc29sZSBpcyB1c2VkIHdpdGggYGJpbi9wdWJsaXNoLWRvY3Muc2hgCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9kZXYvaW8vZ3J5by5hc2NpaWRvYyBiL2RvY3Mvc3JjL2Rldi9pby9ncnlvLmFzY2lpZG9jCmluZGV4IGUwNmZjYzIuLjE1YmFmZDIgMTAwNjQ0Ci0tLSBhL2RvY3Mvc3JjL2Rldi9pby9ncnlvLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL2Rldi9pby9ncnlvLmFzY2lpZG9jCkBAIC0yNSw3ICsyNSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuKgogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyeW8uKgogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLioKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbgogaW1wb3J0IGphdmEudGltZS4qCiAKIG5ldyBGaWxlKCJpby1vdXRwdXQvZGV2LWRvY3MvIikubWtkaXJzKCkKQEAgLTE1Nyw3ICsxNTcsOCBAQAogc2lkZSwgbmV3ZXIgcmVsZWFzZSBvZiBUaW5rZXJQb3AgYXJlIGZ1bGx5IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBHcnlvIHByb2R1Y2VkIG9uIG9sZGVyIHZlcnNpb25zIG9mIFRpbmtlclBvcC4KIAogQXMgb2YgVGlua2VyUG9wIDMuMy4wLCB0aGVyZSBpcyBub3cgYSBuZXcgdmVyc2lvbiBvZiBHcnlvIGluIDMuMCB0aGF0IGlzIG9ubHkgcGFydGlhbGx5IGNvbXBhdGlibGUgd2l0aCAxLjAuIEF0dGVtcHRzCi10byB1c2UgMy4wIHNlcmlhbGl6ZXJzIHdpdGggMS4wIHNlcmlhbGl6ZXJzIHdpbGwgbGlrZWx5IGxlYWQgdG8gZmFpbHVyZS4KK3RvIHVzZSAzLjAgc2VyaWFsaXplcnMgd2l0aCAxLjAgc2VyaWFsaXplcnMgd2lsbCBsaWtlbHkgbGVhZCB0byBmYWlsdXJlLiBGb3IgYmVzdCByZXN1bHRzLCB1c2VycyBzaG91bGQgYWx3YXlzCit1dGlsaXplIHRoZSBzYW1lIHZlcnNpb24gb2YgVGlua2VyUG9wIG9uIHRoZSBjbGllbnQgYXMgb24gdGhlIHNlcnZlci4KIAogQm90aCB2ZXJzaW9ucyBvZiBHcnlvIHN1cHBvcnQgYWxsIHRoZSB0eXBlcyBkZWZpbmVkIGJ5IEdyYXBoU09OIGFzIHdlbGwgYXMgb3RoZXJzIHRoYXQgYXJlIGJvdW5kIG1vcmUgc3BlY2lmaWNhbGx5CiB0byB0aGUgSlZNLiBUaGUgbGluazpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RpbmtlcnBvcC9ibG9iL3gueS56L2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vR3J5b1ZlcnNpb24uamF2YVtHcnlvVmVyc2lvbl0KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL2Rldi9wcm92aWRlci9pbmRleC5hc2NpaWRvYyBiL2RvY3Mvc3JjL2Rldi9wcm92aWRlci9pbmRleC5hc2NpaWRvYwppbmRleCA4NjNhNzk5Li4wMjE2MmE0IDEwMDY0NAotLS0gYS9kb2NzL3NyYy9kZXYvcHJvdmlkZXIvaW5kZXguYXNjaWlkb2MKKysrIGIvZG9jcy9zcmMvZGV2L3Byb3ZpZGVyL2luZGV4LmFzY2lpZG9jCkBAIC0zOSw3ICszOSw3IEBACiBbW2dyYXBoLXN5c3RlbS1wcm92aWRlci1yZXF1aXJlbWVudHNdXQogPT0gR3JhcGggU3lzdGVtIFByb3ZpZGVyIFJlcXVpcmVtZW50cwogCi1pbWFnZTp0aW5rZXJwb3AtZW5hYmxlZC5wbmdbd2lkdGg9MTQwLGZsb2F0PWxlZnRdIEF0IHRoZSBjb3JlIG9mIFRpbmtlclBvcCAzLnggaXMgYSBKYXZhOCBBUEkuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCitpbWFnZTp0aW5rZXJwb3AtZW5hYmxlZC5wbmdbd2lkdGg9MTQwLGZsb2F0PWxlZnRdIEF0IHRoZSBjb3JlIG9mIFRpbmtlclBvcCAzLnggaXMgYSBKYXZhIEFQSS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKIGNvcmUgQVBJIGFuZCBpdHMgdmFsaWRhdGlvbiB2aWEgdGhlIGBncmVtbGluLXRlc3RgIHN1aXRlIGlzIGFsbCB0aGF0IGlzIHJlcXVpcmVkIG9mIGEgZ3JhcGggc3lzdGVtIHByb3ZpZGVyIHdpc2hpbmcgdG8KIHByb3ZpZGUgYSBUaW5rZXJQb3AtZW5hYmxlZCBncmFwaCBlbmdpbmUuIE9uY2UgYSBncmFwaCBzeXN0ZW0gaGFzIGEgdmFsaWQgaW1wbGVtZW50YXRpb24sIHRoZW4gYWxsIHRoZSBhcHBsaWNhdGlvbnMKIHByb3ZpZGVkIGJ5IFRpbmtlclBvcCAoZS5nLiBHcmVtbGluIENvbnNvbGUsIEdyZW1saW4gU2VydmVyLCBldGMuKSBhbmQgM3JkLXBhcnR5IGRldmVsb3BlcnMgKGUuZy4gR3JlbWxpbi1TY2FsYSwKQEAgLTc5LDcgKzc5LDcgQEAKIGBHcmFwaC5hZGRWZXJ0ZXgoT2JqZWN0Li4uKWAgb3IgYFZlcnRleC5hZGRFZGdlKFN0cmluZyxWZXJ0ZXgsT2JqZWN0Li4uKWAsIHRoZSByZXNwZWN0aXZlIGVsZW1lbnQgaXMgY3JlYXRlZCBhbG9uZwogd2l0aCB0aGUgcHJvdmlkZWQga2V5L3ZhbHVlIHBhaXIgcHJvcGVydGllcyBhcHBlbmRlZCB0byBpdC4KIAotQmVsb3cgaXMgYSBzZXF1ZW5jZSBvZiBiYXNpYyBncmFwaCBtdXRhdGlvbiBvcGVyYXRpb25zIHJlcHJlc2VudGVkIGluIEphdmEgOC4KK0JlbG93IGlzIGEgc2VxdWVuY2Ugb2YgYmFzaWMgZ3JhcGggbXV0YXRpb24gb3BlcmF0aW9ucyByZXByZXNlbnRlZCBpbiBKYXZhOgogCiBpbWFnZTpiYXNpYy1tdXRhdGlvbi5wbmdbd2lkdGg9MjQwLGZsb2F0PXJpZ2h0XQogW3NvdXJjZSxqYXZhXQpAQCAtMTAyMywxNCArMTAyMywxMyBAQAogIUtleSAhRGVzY3JpcHRpb24KICFgYXV0aGVudGljYXRpb25gICFBIHJlcXVlc3QgdGhhdCBjb250YWlucyB0aGUgcmVzcG9uc2UgdG8gYSBzZXJ2ZXIgY2hhbGxlbmdlIGZvciBhdXRoZW50aWNhdGlvbi4KICFgZXZhbGAgIUV2YWx1YXRlIGEgR3JlbWxpbiBzY3JpcHQgcHJvdmlkZWQgYXMgYSBgU3RyaW5nYC4KLSFgY2xvc2VgICFDbG9zZSB0aGUgc3BlY2lmaWVkIHNlc3Npb24uIFdpbGwgcmV0dXJuIGEgYE5PIENPTlRFTlRgIG1lc3NhZ2UgYXMgY29uZmlybWF0aW9uIG9mIHRoZSBjbG9zZSBiZWluZyBjb21wbGV0ZWQuCiB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLU5PVEU6IFRoZSAiY2xvc2UiIG1lc3NhZ2UgaXMgZGVwcmVjYXRlZCBhcyBvZiAzLjMuMTEgYXMgc2VydmVycyBhdCB0aGlzIHZlcnNpb24gYXJlIHJlcXVpcmVkIHRvIGF1dG9tYXRpY2FsbHkgaW50ZXJydXB0Ci1ydW5uaW5nIHByb2Nlc3NlcyBvbiB0aGUgY2xvc2Ugb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHJlbGVhc2UgcmVzb3VyY2VzIHN1Y2ggYXMgc2Vzc2lvbnMuIFNlcnZlcnMgd2lzaGluZyB0byBiZQotY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgbmVlZCBvbmx5IHNlbmQgYmFjayBhIGBOT19DT05URU5UYCBmb3IgdGhpcyBtZXNzYWdlLiBEcml2ZXJzIHdpc2hpbmcgdG8KLWJlIGNvbXBhdGlibGUgd2l0aCBzZXJ2ZXJzIHByaW9yIHRvIDMuMy4xMSBtYXkgY29udGludWUgdG8gc2VuZCB0aGUgbWVzc2FnZSBvbiBjYWxscyB0byBgY2xvc2UoKWAgb3RoZXJ3aXNlIHN1Y2ggY29kZQotY2FuIGJlIHJlbW92ZWQuCitOT1RFOiBUaGVyZSB3YXMgYSAiY2xvc2UiIG1lc3NhZ2UgcmVsYXRlZCB0byBzZXNzaW9ucyB0aGF0IHdhcyBkZXByZWNhdGVkIGFzIG9mIDMuMy4xMS4gSXQncyBmdW5jdGlvbmFsaXR5IHdhcyByZW1vdmVkCitpbiAzLjUuMC4gU2VydmVycyB3aXNoaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgZHJpdmVyIG5lZWQgb25seSBzZW5kIGJhY2sgYSBgTk9fQ09OVEVOVGAgZm9yCit0aGlzIG1lc3NhZ2UgKHdoaWNoIGlzIHdoYXQgR3JlbWxpbiBTZXJ2ZXIgZG9lcyBhcyBvZiAzLjUuMCkuIERyaXZlcnMgd2lzaGluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc2VydmVycyBwcmlvciB0bworMy4zLjExIG1heSBjb250aW51ZSB0byBzZW5kIHRoZSBtZXNzYWdlIG9uIGNhbGxzIHRvIGBjbG9zZSgpYCAoVGlua2VyUG9wIGRyaXZlcnMgbm8gbG9uZ2VyIGRvIHRoYXQgYXMgb2YgMy41LjApCitvdGhlcndpc2Ugc3VjaCBjb2RlIGNhbiBiZSByZW1vdmVkLgogCiAqKmBhdXRoZW50aWNhdGlvbmAgb3BlcmF0aW9uIGFyZ3VtZW50cyoqCiAKQEAgLTExMTIsMTQgKzExMTEsNiBAQAogdW5yb2xsIGl0IHRvIHJlcHJlc2VudCB0aGUgYWN0dWFsIG51bWJlciBvZiB0aW1lcyBpdCBleGlzdHMgd2hlbiBpdGVyYXRlZC4gVGhlIHVucm9sbGluZyBpcyB0eXBpY2FsbHkgaGFuZGxlZAogZGlyZWN0bHkgd2l0aGluIFRpbmtlclBvcCdzIHJlbW90ZSB0cmF2ZXJzYWwgaW1wbGVtZW50YXRpb25zLgogCi1PbmUgb2YgdGhlIGltcG9ydGFudCBhc3BlY3RzIG9mIHRoZSBUcmF2ZXJzYWwgT3BQcm9jZXNzb3IgaXMgdGhhdCBpdCBlbmFibGVzIHRoZSB1c2VyIHRvIG5vdCBvbmx5IGdldCB0aGUgcmVzdWx0cyBvZgotdGhlIGBUcmF2ZXJzYWxgIGJ1dCBhbHNvIHRoZSBzaWRlLWVmZmVjdHMgdGhhdCBpdCBwcm9kdWNlcy4gV2hlbiB0aGUgYFRyYXZlcnNhbGAgaXMgc3VibWl0dGVkIHdpdGggdGhlICJieXRlY29kZSIKLW9wZXJhdGlvbiwgdGhlIHJlc3VsdHMgYXJlIGl0ZXJhdGVkIGJhY2sgYXMgdXN1YWwsIGJ1dCBhbnkgc2lkZS1lZmZlY3RzIGFyZSByZXRhaW5lZCBvbiB0aGUgc2VydmVyIGluIGEgY2FjaGUga2V5ZWQgYnkKLXRoZSBpZGVudGlmaWVyIG9mIHRoZSByZXF1ZXN0IHRoYXQgb3JpZ2luYWxseSBzdWJtaXR0ZWQgdGhlIGBUcmF2ZXJzYWxgLiBUaGUgY2xpZW50IHdpbGwgd2FudCB0byByZXRhaW4gdGhhdCBpZGVudGlmaWVyCi1pZiBpdCBpbnRlbmRzIHRvIGxhdGVyIGdldCBzaWRlLWVmZmVjdHMuIFRoZSBUcmF2ZXJzYWwgT3BQcm9jZXNzb3Igc3VwcGxpZXMgdGhlICJrZXlzIiBhbmQgImdhdGhlciIgb3BlcmF0aW9ucyB0byBnZXQKLXRoZSBrZXlzIHN0b3JlZCBpbiB0aGUgc2lkZS1lZmZlY3QgYW5kIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBzaWRlLWVmZmVjdCByZXNwZWN0aXZlbHkuIEZpbmFsbHksIGEgImNsb3NlIgotb3BlcmF0aW9uIGlzIGF2YWlsYWJsZSB0byBjbGVhciB0aGUgY2FjaGUgb2YgYSBzcGVjaWZpYyBzaWRlLWVmZmVjdC4KLQogW3dpZHRoPSIxMDAlIixjb2xzPSIzLDEwYSIsb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIHxLZXkgfERlc2NyaXB0aW9uCkBAIC0xMTMwLDkgKzExMjEsNiBAQAogIUtleSAhRGVzY3JpcHRpb24KICFgYXV0aGVudGljYXRpb25gICFBIHJlcXVlc3QgdGhhdCBjb250YWlucyB0aGUgcmVzcG9uc2UgdG8gYSBzZXJ2ZXIgY2hhbGxlbmdlIGZvciBhdXRoZW50aWNhdGlvbi4KICFgYnl0ZWNvZGVgICFBIHJlcXVlc3QgdGhhdCBjb250YWlucyB0aGUgYEJ5dGVjb2RlYCByZXByZXNlbnRhdGlvbiBvZiBhIGBUcmF2ZXJzYWxgLgotIWBjbG9zZWAgIVJlbGVhc2VzIHNpZGUtZWZmZWN0cyBoZWxkIGluIGNhY2hlIGZvciBhIHBhcnRpY3VsYXIgYFRyYXZlcnNhbGAuCi0hYGdhdGhlcmAgIUdldHMgYSBwYXJ0aWN1bGFyIHNpZGUtZWZmZWN0IGFzIHByb2R1Y2VkIGJ5IGEgcHJldmlvdXNseSBleGVjdXRlZCBgVHJhdmVyc2FsYC4KLSFga2V5c2AgIUdldHMgYWxsIHRoZSBrZXlzIG9mIGFsbCBzaWRlLWVmZmVjdHMgYXMgcHJvZHVjZWQgYnkgYSBwcmV2aW91c2x5IGV4ZWN1dGVkIGBUcmF2ZXJzYWxgLgogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAqKmBhdXRoZW50aWNhdGlvbmAgb3BlcmF0aW9uIGFyZ3VtZW50cyoqCkBAIC0xMTU5LDQ1ICsxMTQ3LDYgQEAKIHNpbmdsZSBhbGlhcykuCiB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSoqYGNsb3NlYCBvcGVyYXRpb24gYXJndW1lbnRzKioKLQotW3dpZHRoPSIxMDAlIixjb2xzPSIyLDIsOSIsb3B0aW9ucz0iaGVhZGVyIl0KLXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXxLZXkgfFR5cGUgfERlc2NyaXB0aW9uCi18c2lkZUVmZmVjdCB8VVVJRCB8ICpSZXF1aXJlZCogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCB0aGF0IG9yaWdpbmFsIHN1Ym1pdHRlZCB0aGUgdHJhdmVyc2FsIChzaWRlLWVmZmVjdHMgYXJlIGtleWVkIGJ5IHRoYXQgdmFsdWUpCi18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSoqYGdhdGhlcmAgb3BlcmF0aW9uIGFyZ3VtZW50cyoqCi0KLVt3aWR0aD0iMTAwJSIsY29scz0iMiwyLDkiLG9wdGlvbnM9ImhlYWRlciJdCi18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci18S2V5IHxUeXBlIHxEZXNjcmlwdGlvbgotfHNpZGVFZmZlY3QgfFVVSUQgfCAqUmVxdWlyZWQqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QgdGhhdCBvcmlnaW5hbCBzdWJtaXR0ZWQgdGhlIHRyYXZlcnNhbCAoc2lkZS1lZmZlY3RzIGFyZSBrZXllZCBieSB0aGF0IHZhbHVlKQotfHNpZGVFZmZlY3RLZXkgfFN0cmluZyB8ICpSZXF1aXJlZCogVGhlIGtleSBmb3IgYSBzcGVjaWZpYyBzaWRlLWVmZmVjdC4KLXxhbGlhc2VzIHxNYXAgfCAqUmVxdWlyZWQqIEEgbWFwIHdpdGggYSBzaW5nbGUga2V5L3ZhbHVlIHBhaXIgdGhhdCByZWZlcnMgdG8gYSBnbG9iYWxseSBib3VuZCBgVHJhdmVyc2FsU291cmNlYCBvYmplY3QKLXRvIGJlIGFsaWFzZWQgdG8gZGlmZmVyZW50IHZhcmlhYmxlIG5hbWVzIGZvciBwdXJwb3NlcyBvZiB0aGUgY3VycmVudCByZXF1ZXN0LiAgVGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgdGhlCi1nbG9iYWwgdmFyaWFibGUgYW5kIGl0cyBrZXkgcmVwcmVzZW50cyB0aGUgbmV3IGJpbmRpbmcgbmFtZSBhcyBpdCB3aWxsIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEdyZW1saW4gcXVlcnkuICBGb3IKLWV4YW1wbGUsIGlmIHRoZSBHcmVtbGluIFNlcnZlciBkZWZpbmVzIHR3byBgVHJhdmVyc2FsU291cmNlYCBpbnN0YW5jZXMgbmFtZWQgYGcxYCwgaXQgd291bGQgYmUgcG9zc2libGUKLXRvIHNlbmQgYW4gYWxpYXMgcGFpciB3aXRoIGtleSBvZiAiZyIgYW5kIHZhbHVlIG9mICJnMSIgYW5kIHRodXMgYWxsb3cgdGhlIHNjcmlwdCB0byByZWZlciB0byAiZzEiIHNpbXBseSBhcyAiZyIuIE5vdGUKLXRoYXQgdW5saWtlIHVzZXJzIG9mIGBhbGlhc2AgaW4gb3RoZXIgY29udGV4dHMsIGluIHRoaXMgY2FzZSwgdGhlIGtleSBjYW4gKm9ubHkqIGJlIHNldCB0byAiZyIgYW5kIHRoZXJlIGNhbiBiZSBvbmx5Ci1vbmUga2V5IHZhbHVlIHBhaXIgcHJlc2VudCAoc2luY2Ugb25seSBvbmUgYFRyYXZlcnNhbGAgaXMgYmVpbmcgc3VibWl0dGVkLCB0aGVyZSBpcyBubyBzZW5zZSB0byBoYXZpbmcgbW9yZSB0aGFuIGEKLXNpbmdsZSBhbGlhcykuCi18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdoZW4gdXNpbmcgImdhdGhlciIgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhlIG1ldGFkYXRhIHRoYXQgaXMgcmV0dXJuZWQgb24gdGhlIGBSZXNwb25zZU1lc3NhZ2VgLiBJdCByZXR1cm5zIGJvdGggdGhlCi0ic2lkZUVmZmVjdEtleSIgdGhhdCB3YXMgcmVxdWVzdGVkIGFzIHdlbGwgYXMgYSB2YWx1ZSBrZXllZCBhcyAiYWdncmVnYXRlVG8iLiBUaGUgImFnZ3JlZ2F0ZVRvIiBmaWVsZCBkZXNjcmliZXMgaG93IHRoZQotc3RyZWFtZWQgc2lkZS1lZmZlY3QgZGF0YSBzaG91bGQgYmUgdHJlYXRlZCBvbiB0aGUgY2xpZW50LiBJdCBwcm92aWRlcyBhIGhpbnQgYXMgdG8gd2hldGhlciBvciBub3QgdGhlIGRhdGEgc2hvdWxkIGJlCi1yb2xsZWQgYmFjayB1cCBpbnRvIGEgc2luZ2xlIG9iamVjdCBvciBzaW1wbHkgbGVmdCBhcy1pcy4gVGhlcmUgYXJlIGZvdXIgdmFsdWVzIGZvciAiYWdncmVnYXRlVG8iOiBgYnVsa3NldGAsIGBsaXN0YCwKLWBtYXBgLCBgc2V0YCBhbmQgYG5vbmVgLgotCi0qKmBrZXlzYCBvcGVyYXRpb24gYXJndW1lbnRzKioKLQotW3dpZHRoPSIxMDAlIixjb2xzPSIyLDIsOSIsb3B0aW9ucz0iaGVhZGVyIl0KLXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXxLZXkgfFR5cGUgfERlc2NyaXB0aW9uCi18c2lkZUVmZmVjdCB8VVVJRCB8ICpSZXF1aXJlZCogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCB0aGF0IG9yaWdpbmFsIHN1Ym1pdHRlZCB0aGUgdHJhdmVyc2FsIChzaWRlLWVmZmVjdHMgYXJlIGtleWVkIGJ5IHRoYXQgdmFsdWUpCi18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KID09PSBBdXRoZW50aWNhdGlvbgogCiBHcmVtbGluIFNlcnZlciBzdXBwb3J0cyBsaW5rOmh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NpbXBsZV9BdXRoZW50aWNhdGlvbl9hbmRfU2VjdXJpdHlfTGF5ZXJbU0FTTC1iYXNlZF0KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL3JlY2lwZXMvYW50aS1wYXR0ZXJucy5hc2NpaWRvYyBiL2RvY3Mvc3JjL3JlY2lwZXMvYW50aS1wYXR0ZXJucy5hc2NpaWRvYwppbmRleCBhOWIzYWJjLi4xNmE2MjNjIDEwMDY0NAotLS0gYS9kb2NzL3NyYy9yZWNpcGVzL2FudGktcGF0dGVybnMuYXNjaWlkb2MKKysrIGIvZG9jcy9zcmMvcmVjaXBlcy9hbnRpLXBhdHRlcm5zLmFzY2lpZG9jCkBAIC01Niw3ICs1Niw3IEBACiAgICAgICAgICAgZnJvbSgicCR7cmVsYXRpb24uZnJvbX0iKS4KICAgICAgICAgICB0bygicCR7cmVsYXRpb24udG99IikKIH0gOyBbXQotdHJhdmVyc2FsQXNTdHJpbmcgPSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS5qc3IyMjMuR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZSh0LmJ5dGVjb2RlKSA7IFtdCit0cmF2ZXJzYWxBc1N0cmluZyA9IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZ3Jvb3Z5LmpzcjIyMy5Hcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKHQuYnl0ZWNvZGUpLmdldFNjcmlwdCgpIDsgW10KIFsgIlRyYXZlcnNhbCBTdHJpbmcgTGVuZ3RoIjogdHJhdmVyc2FsQXNTdHJpbmcubGVuZ3RoKCkKICwgIlRyYXZlcnNhbCBQcmV2aWV3IjogdHJhdmVyc2FsQXNTdHJpbmcucmVwbGFjZUZpcnN0KC9eKC57MTA0fSkuKiguezY0fSkkLywgJyQxIC4uLiAkMicpIF0KIC0tLS0KQEAgLTIyOCw5ICsyMjgsMTIgQEAKIFtbc3RlcHMtaW5zdGVhZC1vZi10b2tlbnNdXQogPT0gU3RlcHMgSW5zdGVhZCBvZiBUb2tlbnMKIAotV2hlbiBjaGlsZCB0cmF2ZXJzYWxzIGNvbnRhaW4gYSBzaW5nbGUgc3RlcCwgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoYXQgdGhlIHN0ZXAgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSB0b2tlbi4gVGhlc2UgdG9rZW5zIGFyZSB0cmFuc2xhdGVkCi1pbnRvIG9wdGltaXplZCB0cmF2ZXJzYWxzIHRoYXQgZXhlY3V0ZSBtdWNoIGZhc3RlciB0aGVuIHRoZWlyIHN0ZXAgdHJhdmVyc2FsIHBlbmRhbnRzLiBBIGZldyBleGFtcGxlcyBvZiBzaW5nbGUgc3RlcCBjaGlsZCB0cmF2ZXJzYWxzIGFyZQotc2hvd24gaW4gdGhlIGZvbGxvd2luZyBjb2RlIGJsb2NrLgorTk9URTogQXMgb2YgMy41LjAsIGBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5YCBpcyBwcmVzZW50IHRvIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlIHRoaXMgYW50aS1wYXR0ZXJuIHRvIHRoZWlyCittb3JlIHBlcmZvcm1hbnQgdmVyc2lvbnMgZm9yIG1vc3QgY2FzZXMgaG93ZXZlciwgaXQgaXMgc3RpbGwgYmVzdCB0byB3cml0ZSBHcmVtbGluIGFjY29yZGluZyB0byB0aGUgY29udGVudHMgdGhhdCBmb2xsb3cuCisKK1doZW4gY2hpbGQgdHJhdmVyc2FscyBjb250YWluIGEgc2luZ2xlIHN0ZXAsIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IHRoZSBzdGVwIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgdG9rZW4uIFRoZXNlCit0b2tlbnMgYXJlIHRyYW5zbGF0ZWQgaW50byBvcHRpbWl6ZWQgdHJhdmVyc2FscyB0aGF0IGV4ZWN1dGUgbXVjaCBmYXN0ZXIgdGhlbiB0aGVpciBzdGVwIHRyYXZlcnNhbCBwZW5kYW50cy4gQSBmZXcKK2V4YW1wbGVzIG9mIHNpbmdsZSBzdGVwIGNoaWxkIHRyYXZlcnNhbHMgYXJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgY29kZSBibG9jay4KIAogW2dyZW1saW4tZ3Jvb3Z5LG1vZGVybl0KIC0tLS0KQEAgLTI2MCwzMyArMjYzLDMgQEAKIAogPDE+IE5vdGUsIHRoYXQgdG9rZW5zIHVzZSBhIGBmb2xkKClgIHJlZHVjZXIgYnkgZGVmYXVsdC4KIDwyPiBgYnkoIm5hbWUiKWAgZG9lc24ndCB1c2UgYSB0b2tlbiwgYnV0IGZhbGxzIGludG8gdGhlIHNhbWUgY2F0ZWdvcnkgYXMgdGhlIFN0cmluZyBgIm5hbWUiYCBpcyB0cmFuc2xhdGVkIGludG8gYW4gb3B0aW1pemVkIHRyYXZlcnNhbC4KLQotQnV0IHRoaXMgaXMgbm90IGFsbCBhYm91dCByZWFkYWJpbGl0eTsgYXMgaW5pdGlhbGx5IG1lbnRpb25lZCwgdGhlIHVzZSBvZiB0b2tlbnMgYWxzbyBpbXByb3ZlcyB0aGUgb3ZlcmFsbCBxdWVyeSBwZXJmb3JtYW5jZSBhcyBzaG93biBpbgotdGhlIGBwcm9maWxlKClgIG91dHB1dCBiZWxvdy4KLQotW2dyZW1saW4tZ3Jvb3Z5LGV4aXN0aW5nXQotLS0tLQotZy5WKCkuZ3JvdXBDb3VudCgpLmJ5KGxhYmVsKCkpLnByb2ZpbGUoKSAgICAgICAgICAgICAgIC8vIG5vdCB1c2luZyB0b2tlbgotZy5WKCkuZ3JvdXBDb3VudCgpLmJ5KGxhYmVsKS5wcm9maWxlKCkgICAgICAgICAgICAgICAgIC8vIHVzaW5nIGEgdG9rZW4KLWcuVigpLmdyb3VwKCkuYnkobGFiZWwoKSkuYnkoaWQoKS5mb2xkKCkpLnByb2ZpbGUoKSAgICAvLyBub3QgdXNpbmcgdG9rZW5zCi1nLlYoKS5ncm91cCgpLmJ5KGxhYmVsKS5ieShpZCkucHJvZmlsZSgpICAgICAgICAgICAgICAgLy8gdXNpbmcgdG9rZW5zCi1nLlYoKS5wcm9qZWN0KCJpZCIsImxhYmVsIikuCi0gICAgYnkoaWQoKSkuCi0gICAgYnkobGFiZWwoKSkucHJvZmlsZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHVzaW5nIHRva2VucwotZy5WKCkucHJvamVjdCgiaWQiLCJsYWJlbCIpLgotICAgIGJ5KGlkKS4KLSAgICBieShsYWJlbCkucHJvZmlsZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2luZyB0b2tlbnMKLWcuVigpLmNob29zZShsYWJlbCgpKS4KLSAgICBvcHRpb24oInBlcnNvbiIsIHByb2plY3QoInBlcnNvbiIpLmJ5KHZhbHVlcygibmFtZSIpKSkuCi0gICAgb3B0aW9uKCJzb2Z0d2FyZSIsIHByb2plY3QoInByb2R1Y3QiKS5ieSh2YWx1ZXMoIm5hbWUiKSkpLgotICBwcm9maWxlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB1c2luZyB0b2tlbnMKLWcuVigpLmNob29zZShsYWJlbCkuCi0gICAgb3B0aW9uKCJwZXJzb24iLCBwcm9qZWN0KCJwZXJzb24iKS5ieSgibmFtZSIpKS4KLSAgICBvcHRpb24oInNvZnR3YXJlIiwgcHJvamVjdCgicHJvZHVjdCIpLmJ5KCJuYW1lIikpLgotICBwcm9maWxlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzaW5nIHRva2VucwotLS0tLQotCi1OT1RFOiBQYXkgYXR0ZW50aW9uIHRvIGFsbCBtZXRyaWNzLiBUaGUgdGltZSBkaWZmZXJlbmNlIGRvZXMgbm90IGFsd2F5cyBsb29rIHNpZ25pZmljYW50LCBzb21ldGltZXMgaXQgbWlnaHQgZXZlbiBiZSB3b3JzZSBpbiB0aGUKLW9wdGltaXplZCBxdWVyeSwgYnV0IHRoYXQncyB1c3VhbGx5IGJlY2F1c2UgVGlua2VyR3JhcGgga2VlcHMgZXZlcnl0aGluZyBpbiBtZW1vcnkgYW5kIHRodXMgZXZlbiBiYWQgcXVlcmllcyBjYW4gc29tZXRpbWVzIHBlcmZvcm0KLXN1cnByaXNpbmdseSB3ZWxsLiBUaGUgbW9yZSBpbXBvcnRhbnQgbWV0cmljcywgaG93ZXZlciwgYXJlIHRoZSBudW1iZXIgb2YgdHJhdmVyc2VycyB0aGF0IGFyZSB1c2VkIGFuZCB0aGUgb3ZlcmFsbCBudW1iZXIgb2YKLWdlbmVyYXRlZCBzdGVwcy4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL3JlY2lwZXMvY2VudHJhbGl0eS5hc2NpaWRvYyBiL2RvY3Mvc3JjL3JlY2lwZXMvY2VudHJhbGl0eS5hc2NpaWRvYwppbmRleCBjNWUxOWEyLi43OWQ1ZjAxIDEwMDY0NAotLS0gYS9kb2NzL3NyYy9yZWNpcGVzL2NlbnRyYWxpdHkuYXNjaWlkb2MKKysrIGIvZG9jcy9zcmMvcmVjaXBlcy9jZW50cmFsaXR5LmFzY2lpZG9jCkBAIC0xODUsNSArMTg1LDUgQEAKIFtncmVtbGluLWdyb292eSxtb2Rlcm5dCiAtLS0tCiBnID0gdHJhdmVyc2FsKCkud2l0aEVtYmVkZGVkKGdyYXBoKS53aXRoQ29tcHV0ZXIoKQotZy5WKCkucGFnZVJhbmsoKS5ieSgncGFnZVJhbmsnKS52YWx1ZXMoJ3BhZ2VSYW5rJykKK2cuVigpLnBhZ2VSYW5rKCkud2l0aChQYWdlUmFuay5wcm9wZXJ0eU5hbWUsJ3BhZ2VSYW5rJykudmFsdWVzKCdwYWdlUmFuaycpCiAtLS0tCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9yZWNpcGVzL29sYXAtc3BhcmsteWFybi5hc2NpaWRvYyBiL2RvY3Mvc3JjL3JlY2lwZXMvb2xhcC1zcGFyay15YXJuLmFzY2lpZG9jCmluZGV4IGY1ZTg1NTguLjY0Y2M2YTAgMTAwNjQ0Ci0tLSBhL2RvY3Mvc3JjL3JlY2lwZXMvb2xhcC1zcGFyay15YXJuLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3JlY2lwZXMvb2xhcC1zcGFyay15YXJuLmFzY2lpZG9jCkBAIC02Myw4ICs2Myw4IEBACiAjIS9iaW4vYmFzaAogIyBWYXJpYWJsZXMgdG8gYmUgYWRhcHRlZCB0byB0aGUgYWN0dWFsIGVudmlyb25tZW50CiBHUkVNTElOX0hPTUU9L2hvbWUveW91cmRpci9saWIvYXBhY2hlLXRpbmtlcnBvcC1ncmVtbGluLWNvbnNvbGUteC55Lnotc3RhbmRhbG9uZQotZXhwb3J0IEhBRE9PUF9IT01FPS91c3IvbG9jYWwvbGliL2hhZG9vcC0yLjcuMgotZXhwb3J0IEhBRE9PUF9DT05GX0RJUj0vdXNyL2xvY2FsL2xpYi9oYWRvb3AtMi43LjIvZXRjL2hhZG9vcAorZXhwb3J0IEhBRE9PUF9IT01FPS91c3IvbG9jYWwvbGliL2hhZG9vcC0yLjcuNworZXhwb3J0IEhBRE9PUF9DT05GX0RJUj0vdXNyL2xvY2FsL2xpYi9oYWRvb3AtMi43LjcvZXRjL2hhZG9vcAogCiAjIEhhdmUgVGlua2VyUG9wIGZpbmQgdGhlIGhhZG9vcCBjbHVzdGVyIGNvbmZpZ3MgYW5kIGhhZG9vcCBuYXRpdmUgbGlicmFyaWVzCiBleHBvcnQgQ0xBU1NQQVRIPSRIQURPT1BfQ09ORl9ESVIKQEAgLTk0LDcgKzk0LDcgQEAKIGFyY2hpdmUgPSAnc3BhcmstZ3JlbWxpbi56aXAnCiBhcmNoaXZlUGF0aCA9ICIvdG1wLyRhcmNoaXZlIgogWydiYXNoJywgJy1jJywgInJtIC1mICRhcmNoaXZlUGF0aDsgY2QgZXh0L3NwYXJrLWdyZW1saW4vbGliICYmIHppcCAkYXJjaGl2ZVBhdGggKi5qYXIiXS5leGVjdXRlKCkud2FpdEZvcigpCi1jb25mID0gbmV3IFByb3BlcnRpZXNDb25maWd1cmF0aW9uKCdjb25mL2hhZG9vcC9oYWRvb3AtZ3J5by5wcm9wZXJ0aWVzJykKK2NvbmYgPSBuZXcgQ29uZmlndXJhdGlvbnMoKS5wcm9wZXJ0aWVzKG5ldyBGaWxlKCdjb25mL2hhZG9vcC9oYWRvb3AtZ3J5by5wcm9wZXJ0aWVzJykpCiBjb25mLnNldFByb3BlcnR5KCdzcGFyay5tYXN0ZXInLCAneWFybicpCiBjb25mLnNldFByb3BlcnR5KCdzcGFyay5zdWJtaXQuZGVwbG95TW9kZScsICdjbGllbnQnKQogY29uZi5zZXRQcm9wZXJ0eSgnc3BhcmsueWFybi5hcmNoaXZlJywgIiRhcmNoaXZlUGF0aCIpCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9yZWZlcmVuY2UvZ3JlbWxpbi1hcHBsaWNhdGlvbnMuYXNjaWlkb2MgYi9kb2NzL3NyYy9yZWZlcmVuY2UvZ3JlbWxpbi1hcHBsaWNhdGlvbnMuYXNjaWlkb2MKaW5kZXggMDYxN2FhYi4uNmFhOTVmNyAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvcmVmZXJlbmNlL2dyZW1saW4tYXBwbGljYXRpb25zLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3JlZmVyZW5jZS9ncmVtbGluLWFwcGxpY2F0aW9ucy5hc2NpaWRvYwpAQCAtNDc1LDE1ICs0NzUsMTAgQEAKIFtJTkZPXSBPcExvYWRlciAtIEFkZGluZyB0aGUgc3RhbmRhcmQgT3BQcm9jZXNzb3IuCiBbSU5GT10gT3BMb2FkZXIgLSBBZGRpbmcgdGhlIHNlc3Npb24gT3BQcm9jZXNzb3IuCiBbSU5GT10gT3BMb2FkZXIgLSBBZGRpbmcgdGhlIHRyYXZlcnNhbCBPcFByb2Nlc3Nvci4KLVtJTkZPXSBUcmF2ZXJzYWxPcFByb2Nlc3NvciAtIEluaXRpYWxpemVkIGNhY2hlIGZvciBUcmF2ZXJzYWxPcFByb2Nlc3NvciB3aXRoIHNpemUgMTAwMCBhbmQgZXhwaXJhdGlvbiB0aW1lIG9mIDYwMDAwMCBtcwogW0lORk9dIEdyZW1saW5TZXJ2ZXIgLSBFeGVjdXRpbmcgc3RhcnQgdXAgTGlmZUN5Y2xlSG9vawogW0lORk9dIExvZ2dlciRpbmZvIC0gTG9hZGluZyAnbW9kZXJuJyBncmFwaCBkYXRhLgogW0lORk9dIEdyZW1saW5TZXJ2ZXIgLSBpZGxlQ29ubmVjdGlvblRpbWVvdXQgd2FzIHNldCB0byAwIHdoaWNoIHJlc29sdmVzIHRvIDAgc2Vjb25kcyB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMgdmFsdWUgLSB0aGlzIGZlYXR1cmUgd2lsbCBiZSBkaXNhYmxlZAogW0lORk9dIEdyZW1saW5TZXJ2ZXIgLSBrZWVwQWxpdmVJbnRlcnZhbCB3YXMgc2V0IHRvIDAgd2hpY2ggcmVzb2x2ZXMgdG8gMCBzZWNvbmRzIHdoZW4gY29uZmlndXJpbmcgdGhpcyB2YWx1ZSAtIHRoaXMgZmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkCi1bV0FSTl0gQWJzdHJhY3RDaGFubmVsaXplciAtIFRoZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCBzZXJpYWxpemF0aW9uIGNsYXNzIGlzIGRlcHJlY2F0ZWQuCi1bSU5GT10gQWJzdHJhY3RDaGFubmVsaXplciAtIENvbmZpZ3VyZWQgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvIHdpdGggb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAKLVtXQVJOXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gVGhlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwIHNlcmlhbGl6YXRpb24gY2xhc3MgaXMgZGVwcmVjYXRlZC4KLVtJTkZPXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gQ29uZmlndXJlZCBhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2dyeW8tc3RyaW5nZCB3aXRoIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwCiBbSU5GT10gQWJzdHJhY3RDaGFubmVsaXplciAtIENvbmZpZ3VyZWQgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtqc29uIHdpdGggb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwCiBbSU5GT10gQWJzdHJhY3RDaGFubmVsaXplciAtIENvbmZpZ3VyZWQgYXBwbGljYXRpb24vanNvbiB3aXRoIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjNkMAogW0lORk9dIEFic3RyYWN0Q2hhbm5lbGl6ZXIgLSBDb25maWd1cmVkIGFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wIHdpdGggb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMQpAQCAtOTg4LDggKzk4Myw4IEBACiB8c2NyaXB0RW5naW5lcy48bmFtZT4uc3RhdGljSW1wb3J0cyB8QSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiAic3RhdGljIiBpbXBvcnRzIHRvIG1ha2UgYXZhaWxhYmxlIHRvIHRoZSBgU2NyaXB0RW5naW5lYC4gfF9ub25lXwogfHNjcmlwdEVuZ2luZXMuPG5hbWU+LnNjcmlwdHMgfEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2NyaXB0IGZpbGVzIHRvIGV4ZWN1dGUgb24gYFNjcmlwdEVuZ2luZWAgaW5pdGlhbGl6YXRpb24uIGBHcmFwaGAgYW5kIGBUcmF2ZXJzYWxTb3VyY2VgIGluc3RhbmNlIHJlZmVyZW5jZXMgcHJvZHVjZWQgZnJvbSBzY3JpcHRzIHdpbGwgYmUgc3RvcmVkIGdsb2JhbGx5IGluIEdyZW1saW4gU2VydmVyLCB0aGVyZWZvcmUgaXQgaXMgcG9zc2libGUgdG8gdXNlIGluaXRpYWxpemF0aW9uIHNjcmlwdHMgdG8gYWRkIFRyYXZlcnNhbCBTdHJhdGVnaWVzIG9yIGNyZWF0ZSBlbnRpcmVseSBuZXcgYEdyYXBoYCBpbnN0YW5jZXMgYWxsIHRvZ2V0aGVyLiBJbnN0YW50aWF0aW5nIGEgYExpZmVDeWNsZUhvb2tgIGluIGEgc2NyaXB0IHByb3ZpZGVzIGEgd2F5IHRvIGV4ZWN1dGUgc2NyaXB0cyB3aGVuIEdyZW1saW4gU2VydmVyIHN0YXJ0cyBhbmQgc3RvcHMufF9ub25lXwogfHNjcmlwdEVuZ2luZXMuPG5hbWU+LmNvbmZpZyB8QSBgTWFwYCBvZiBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgYFNjcmlwdEVuZ2luZWAuICBUaGVzZSBzZXR0aW5ncyBhcmUgZGVwZW5kZW50IG9uIHRoZSBgU2NyaXB0RW5naW5lYCBpbXBsZW1lbnRhdGlvbiBiZWluZyB1c2VkLiB8X25vbmVfCi18ZXZhbHVhdGlvblRpbWVvdXQgfFRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGEgc2NyaXB0IGV2YWx1YXRpb24gYW5kIGl0ZXJhdGlvbiBvZiByZXN1bHQgdGltZXMgb3V0LiBUaGlzIGZlYXR1cmUgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYDBgLiB8MzAwMDAKLXxzZXJpYWxpemVycyB8QSBgTGlzdGAgb2YgYE1hcGAgc2V0dGluZ3MsIHdoZXJlIGVhY2ggYE1hcGAgcmVwcmVzZW50cyBhIGBNZXNzYWdlU2VyaWFsaXplcmAgaW1wbGVtZW50YXRpb24gdG8gdXNlIGFsb25nIHdpdGggaXRzIGNvbmZpZ3VyYXRpb24uIElmIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgdGhlbiBHcmVtbGluIFNlcnZlciB3aWxsIGNvbmZpZ3VyZSB3aXRoIEdyYXBoU09OIGFuZCBHcnlvIGJ1dCB3aWxsIG5vdCByZWdpc3RlciBhbnkgYGlvUmVnaXN0cmllc2AgZm9yIGNvbmZpZ3VyZWQgZ3JhcGhzLiB8X2VtcHR5XworfGV2YWx1YXRpb25UaW1lb3V0IHxUaGUgYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBhIHJlcXVlc3QgZXZhbHVhdGlvbiBhbmQgaXRlcmF0aW9uIG9mIHJlc3VsdCB0aW1lcyBvdXQuIFRoaXMgZmVhdHVyZSBjYW4gYmUgdHVybmVkIG9mZiBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgMGAuIHwzMDAwMAorfHNlcmlhbGl6ZXJzIHxBIGBMaXN0YCBvZiBgTWFwYCBzZXR0aW5ncywgd2hlcmUgZWFjaCBgTWFwYCByZXByZXNlbnRzIGEgYE1lc3NhZ2VTZXJpYWxpemVyYCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYWxvbmcgd2l0aCBpdHMgY29uZmlndXJhdGlvbi4gSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGVuIEdyZW1saW4gU2VydmVyIHdpbGwgY29uZmlndXJlIHdpdGggR3JhcGhTT04gYW5kIEdyYXBoQmluYXJ5IGJ1dCB3aWxsIG5vdCByZWdpc3RlciBhbnkgYGlvUmVnaXN0cmllc2AgZm9yIGNvbmZpZ3VyZWQgZ3JhcGhzLiB8X2VtcHR5XwogfHNlcmlhbGl6ZXJzW1hdLmNsYXNzTmFtZSB8VGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgYE1lc3NhZ2VTZXJpYWxpemVyYCBpbXBsZW1lbnRhdGlvbi4gfF9ub25lXwogfHNlcmlhbGl6ZXJzW1hdLmNvbmZpZyB8QSBgTWFwYCBjb250YWluaW5nIGBNZXNzYWdlU2VyaWFsaXplcmAgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuIHxfbm9uZV8KIHxzc2wuZW5hYmxlZCB8RGV0ZXJtaW5lcyBpZiBTU0wgaXMgdHVybmVkIG9uIG9yIG5vdC4gfGZhbHNlCkBAIC0xMDU2LDE2ICsxMDUxLDcgQEAKID09PT09IFRyYXZlcnNhbE9wUHJvY2Vzc29yCiAKIFRoZSBgVHJhdmVyc2FsT3BQcm9jZXNzb3JgIHByb3ZpZGVzIGEgd2F5IHRvIGFjY2VwdCB0cmF2ZXJzYWxzIGNvbmZpZ3VyZWQgdmlhIDw8Y29ubmVjdGluZy12aWEtZHJpdmVycyx3aXRoUmVtb3RlKCk+Pi4KLQotW3dpZHRoPSIxMDAlIixjb2xzPSIzLDEwLF4yIixvcHRpb25zPSJoZWFkZXIiXQotfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotfE5hbWUgfERlc2NyaXB0aW9uIHxEZWZhdWx0Ci18Y2FjaGVFeHBpcmF0aW9uVGltZSB8VGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHNpZGUtZWZmZWN0cyBmcm9tIGEgYFRyYXZlcnNhbGAgd2lsbCBiZSBldmljdGVkLiB8NjAwMDAKLXxjYWNoZU1heFNpemUgfFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzaWRlLWVmZmVjdCBjYWNoZS4gfDEwMDAKLXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSWYgdGhlcmUgaXMgbm8gaW50ZW50aW9uIHRvIGdhdGhlciBzaWRlLWVmZmVjdHMgZnJvbSB0cmF2ZXJzYWxzLCB0aGUgYGNhY2hlTWF4U2l6ZWAgY2FuIGJlIHNldCB0byB6ZXJvIHRvIGRpc2FibGUgdGhlCi1jYWNoZS4KK0l0IGhhcyBubyBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCiAKIFtbc2VjdXJpdHldXQogPT09PSBTZWN1cml0eQpAQCAtMTA5MSw3ICsxMDc3LDggQEAKIHxQbHVnZ2FibGUgU0FTTCB8My4wLjAtaW5jdWJhdGluZwogfEdTU0FQSSBTQVNMIChLZXJiZXJvcykgfDMuMy4wCiB8R3JlbWxpbi5ORVQgfFBMQUlOIFNBU0wgfDMuMy4wCi18R3JlbWxpbi1QeXRob24gfFBMQUlOIFNBU0wgfDMuMi4yCisxLjIrdnxHcmVtbGluLVB5dGhvbiB8UExBSU4gU0FTTCB8My4yLjIKK3xHU1NBUEkgU0FTTCAoS2VyYmVyb3MpIHwzLjQuNwogfEdyZW1saW4uTmV0IHxQTEFJTiBTQVNMIHwzLjIuNwogfEdyZW1saW4tSmF2YXNjcmlwdCB8UExBSU4gU0FTTCB8My4zLjAKIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEyNzEsMTQgKzEyNTgsMjEgQEAKICAgICBwcmluY2lwYWw6IGdyZW1saW5zZXJ2ZXIvaG9zdG5hbWUueW91ci5vcmdAWU9VUi5SRUFMTSwKICAgICBrZXl0YWI6IC9ldGMvc2VjdXJpdHkva2V5dGFicy9ncmVtbGluc2VydmVyLnNlcnZpY2Uua2V5dGFifX0KIAotS3JiNUF1dGhlbnRpY2F0b3IgbmVlZHMgYSBLZXJiZXJvcyBzZXJ2aWNlIHByaW5jaXBhbCBhbmQgYSBrZXl0YWIgdGhhdCBob2xkcyB0aGUgc2VjcmV0IGtleSBmb3IgdGhhdCBwcmluY2lwYWwuIFRoZSBrZXl0YWIKLWxvY2F0aW9uIGFuZCBzZXJ2aWNlIG5hbWUsIGUuZy4gZ3JlbWxpbnNlcnZlciwgYXJlIGZyZWUgdG8gYmUgY2hvc2VuLCBidXQgR3JlbWxpbiBjbGllbnRzIGhhdmUgdG8gc3BlY2lmeSB0aGlzIHNlcnZpY2UgbmFtZQotYXMgdGhlIGBwcm90b2NvbGAuIEZvciBHcmVtbGluLUNvbnNvbGUgdGhlIGBwcm90b2NvbGAgaXMgYW4gZW50cnkgaW4gdGhlIHJlbW90ZS55YW1sIGZpbGUsIGZvciBHcmVtbGluLWphdmEgdGhlIGNsaWVudCBidWlsZGVyCi1oYXMgYSBgcHJvdG9jb2woKWAgbWV0aG9kLgorYEtyYjVBdXRoZW50aWNhdG9yYCBuZWVkcyBhIEtlcmJlcm9zIHNlcnZpY2UgcHJpbmNpcGFsIGFuZCBhIGtleXRhYiB0aGF0IGhvbGRzIHRoZSBzZWNyZXQga2V5IGZvciB0aGF0IHByaW5jaXBhbC4gVGhlIGtleXRhYgorbG9jYXRpb24gYW5kIHNlcnZpY2UgbmFtZSwgZS5nLiBncmVtbGluc2VydmVyLCBhcmUgZnJlZSB0byBiZSBjaG9zZW4uIGBLcmI1QXV0aGVudGljYXRvcmAgZmluZHMgdGhlIEtEQydzIGhvc3RuYW1lIGFuZAorcG9ydCBmcm9tIHRoZSBrcmI1LmNvbmYgZmlsZSB3aXRoIEtlcmJlcm9zIGNvbmZpZ3VyYXRpb25zLiBUaGlzIGZpbGUgY2FuIHJlc2lkZSBhdCBlaXRoZXIgdGhlCitodHRwczovL3dlYi5taXQuZWR1L2tlcmJlcm9zL2tyYjUtZGV2ZWwvZG9jL21pdEs1ZGVmYXVsdHMuaHRtbFtkZWZhdWx0IGxvY2F0aW9uXSBvciBhIGxvY2F0aW9uIHRvIGJlIHNwZWNpZmllZCBhcyBhCitzeXN0ZW0gcHJvcGVydHkgaW4gdGhlIEpBVkFfT1BUSU9OUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvZiBHcmVtbGluIFNlcnZlcjoKKworW3NvdXJjZSwgYmFzaF0KK2V4cG9ydCBKQVZBX09QVElPTlM9IiR7SkFWQV9PUFRJT05TfSAtWG1zNTEybSAtWG14NDA5Nm0gLURqYXZhLnNlY3VyaXR5LmtyYjUuY29uZj0vZXRjL2tyYjUuY29uZiIKKworR3JlbWxpbiBjbGllbnRzIGhhdmUgdG8gc3BlY2lmeSB0aGUgc2VydmljZSBuYW1lIGFzIHRoZSBgcHJvdG9jb2xgIGNvbm5lY3Rpb24gcGFyYW1ldGVyLiBGb3IgR3JlbWxpbi1Db25zb2xlIHRoZQorYHByb3RvY29sYCBpcyBhbiBlbnRyeSBpbiB0aGUgcmVtb3RlLnlhbWwgZmlsZSwgZm9yIEdyZW1saW4tamF2YSB0aGUgY2xpZW50IGJ1aWxkZXIgaGFzIGEgYHByb3RvY29sKClgIG1ldGhvZC4KIAogSW4gYWRkaXRpb24gdG8gdGhlIGBwcm90b2NvbGAsIHRoZSBHcmVtbGluIGNsaWVudCBuZWVkcyB0byBzcGVjaWZ5IGEgYGphYXNFbnRyeWAsIGFuIGVudHJ5IGluIHRoZQotbGluazpodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KYXZhX0F1dGhlbnRpY2F0aW9uX2FuZF9BdXRob3JpemF0aW9uX1NlcnZpY2VbSkFBU10gY29uZmlndXJhdGlvbiBmaWxlLiBHcmVtbGluLUNvbnNvbGUKLWNvbWVzIHdpdGggYSBzYW1wbGUgZ3JlbWxpbi1qYWFzLmNvbmYgZmlsZSB3aXRoIGEgYEdyZW1saW5Db25zb2xlYCBqYWFzRW50cnk6CitsaW5rOmh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phdmFfQXV0aGVudGljYXRpb25fYW5kX0F1dGhvcml6YXRpb25fU2VydmljZVtKQUFTXSBjb25maWd1cmF0aW9uIGZpbGUuIEFzIGEKK3N0YXJ0IG9uZSBjYW4gZGVmaW5lIGEgY29uZi9ncmVtbGluLWphYXMuY29uZiBmaWxlIHdpdGggYSBgR3JlbWxpbkNvbnNvbGVgIGphYXNFbnRyeToKIAogW3NvdXJjZSwgamFhc10KIEdyZW1saW5Db25zb2xlIHsKQEAgLTEyODcsMTUgKzEyODEsMjAgQEAKICAgdXNlVGlja2V0Q2FjaGU9dHJ1ZTsKIH07CiAKLVRoaXMgY29uZmlndXJhdGlvbiB0ZWxscyBHcmVtbGluLUNvbnNvbGUgdG8gcGFzcyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cyBmcm9tIGdyZW1saW4tc2VydmVyIHRvIHRoZSBLcmI1TG9naW5Nb2R1bGUsIHdoaWNoIGlzCi1wYXJ0IG9mIHRoZSBqYXZhIHN0YW5kYXJkIGxpYnJhcnkuICBUaGUgS3JiNUxvZ2luTW9kdWxlIGRvZXMgbm90IHByb21wdCB0aGUgdXNlciBmb3IgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYnV0IHVzZXMgdGhlIHRpY2tldCBjYWNoZSB0aGF0Ci1pcyBub3JtYWxseSByZWZyZXNoZWQgd2hlbiBhIHVzZXIgbG9ncyBpbiB0byBhIGhvc3Qgd2l0aGluIHRoZSBLZXJiZXJvcyByZWFsbS4KK1RoaXMgY29uZmlndXJhdGlvbiB0ZWxscyBHcmVtbGluIENvbnNvbGUgdG8gcGFzcyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cyBmcm9tIEdyZW1saW4gU2VydmVyIHRvIHRoZSBLcmI1TG9naW5Nb2R1bGUsIHdoaWNoIGlzCitwYXJ0IG9mIHRoZSBqYXZhIHN0YW5kYXJkIGxpYnJhcnkuIFRoZSBLcmI1TG9naW5Nb2R1bGUgZG9lcyBub3QgcHJvbXB0IHRoZSB1c2VyIGZvciBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBidXQgdXNlcyB0aGUKK3RpY2tldCBjYWNoZSB0aGF0IGlzIG5vcm1hbGx5IHJlZnJlc2hlZCB3aGVuIGEgdXNlciBsb2dzIGluIHRvIGEgaG9zdCB3aXRoaW4gdGhlIEtlcmJlcm9zIHJlYWxtLgogCi1GaW5hbGx5LCB0aGUgR3JlbWxpbiBjbGllbnQgbmVlZHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBKQUFTIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSBwYXNzZWQgYXMgYSBzeXN0ZW0gcHJvcGVydHkgdG8gdGhlIEpWTS4gRm9yCi1HcmVtbGluLUNvbnNvbGUgdGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gcGFzcyBpdCB0byB0aGUgcnVuIHNjcmlwdCB2aWEgdGhlIEpBVkFfT1BUSU9OUyBlbnZpcm9ubWVudCBwcm9wZXJ0eToKK1RoZSBHcmVtbGluIGNsaWVudCBuZWVkcyB0aGUgbG9jYXRpb24gb2YgdGhlIEpBQVMgY29uZmlndXJhdGlvbiBmaWxlIHRvIGJlIHBhc3NlZCBhcyBhIHN5c3RlbSBwcm9wZXJ0eSB0byB0aGUgSlZNLiBGb3IKK0dyZW1saW4tQ29uc29sZSB0aGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBwYXNzIGl0IHRvIHRoZSBydW4gc2NyaXB0IHZpYSB0aGUgSkFWQV9PUFRJT05TIGVudmlyb25tZW50IHByb3BlcnR5LgorSWYgdGhlIGtyYjUuY29uZiBLZXJiZXJvcyBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IGF2YWlsYWJsZSBmcm9tIHRoZQoraHR0cHM6Ly93ZWIubWl0LmVkdS9rZXJiZXJvcy9rcmI1LWRldmVsL2RvYy9taXRLNWRlZmF1bHRzLmh0bWxbZGVmYXVsdCBsb2NhdGlvbl0gaXQgaGFzIHRvIGJlIHByb3ZpZGVkIGFzIGEgc3lzdGVtCitwcm9wZXJ0eSBhcyB3ZWxsOgogCiBbc291cmNlLCBiYXNoXQotZXhwb3J0IEpBVkFfT1BUSU9OUz0iJEpBVkFfT1BUSU9OUyAtRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9Y29uZi9ncmVtbGluLWphYXMuY29uZiIKK0pBQVNfT1BUSU9OPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9Y29uZi9ncmVtbGluLWphYXMuY29uZiIKK0tSQjVfT1BUSU9OPSItRGphdmEuc2VjdXJpdHkua3JiNS5jb25mPS9ldGMva3JiNS5jb25mIgorZXhwb3J0IEpBVkFfT1BUSU9OUz0iJHtKQVZBX09QVElPTlN9ICR7S1JCNV9PUFRJT059ICR7SkFBU19PUFRJT059IgogCiBbW3NjcmlwdC1leGVjdXRpb25dXQogPT09PT0gUHJvdGVjdGluZyBTY3JpcHQgRXhlY3V0aW9uCkBAIC0xNDc5LDcgKzE0NzgsOCBAQAogc29tZSBzZXJpYWxpemVycyBoYXZlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGFzIGRlZmluZWQgYnkgdGhlIGBzZXJpYWxpemVyc1tYXS5jb25maWdgIHNldHRpbmcuICBUaGUKIGBjb25maWdgIHNldHRpbmcgaXMgYSBgTWFwYCB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGdldCBwYXNzZWQgdG8gdGhlIHNlcmlhbGl6ZXIgYXQgaXRzIGluaXRpYWxpemF0aW9uLiAgVGhlCiBhdmFpbGFibGUgYW5kL29yIGV4cGVjdGVkIGtleXMgYXJlIGRlcGVuZGVudCBvbiB0aGUgc2VyaWFsaXplciBiZWluZyB1c2VkLiAgR3JlbWxpbiBTZXJ2ZXIgY29tZXMgcGFja2FnZWQgd2l0aCB0aHJlZQotZGlmZmVyZW50IHNlcmlhbGl6ZXJzOiBHcmFwaFNPTiwgR3J5bywgYW5kIEdyYXBoQmluYXJ5LgorZGlmZmVyZW50IHNlcmlhbGl6ZXJzOiBHcmFwaFNPTiwgR3J5bywgYW5kIEdyYXBoQmluYXJ5IChob3dldmVyLCBHcmFwaFNPTiBhbmQgR3JhcGhCaW5hcnkgYXJlIHRoZSBvbmx5IHR3byBjb25maWd1cmVkCitieSBkZWZhdWx0KS4KIAogPT09PT0gR3JhcGhTT04KIApAQCAtMTUxOSwxNCArMTUxOSwxNyBAQAogCiA9PT09PSBHcnlvCiAKK1dBUk5JTkc6IEdyeW8gaXMgbm8gbG9uZ2VyIHRoZSByZWNvbW1lbmRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdCBmb3IgR3JlbWxpbiBTZXJ2ZXIuIENvbnNpZGVyIHVzaW5nCis8PHNlcnZlci1ncmFwaGJpbmFyeSwgR3JhcGhCaW5hcnk+PiBpbnN0ZWFkLgorCiBUaGUgR3J5byBzZXJpYWxpemVyIHV0aWxpemVzIEtyeW8tYmFzZWQgc2VyaWFsaXphdGlvbiB3aGljaCBwcm9kdWNlcyBhIGJpbmFyeSBvdXRwdXQuICBUaGlzIGZvcm1hdCBpcyBiZXN0IGNvbnN1bWVkCiBieSBKVk0tYmFzZWQgbGFuZ3VhZ2VzLiBUaGUgZm9ybWF0IGl0c2VsZiBpcyBkZXNjcmliZWQgaW4gdGhlCiBsaW5rOmh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L2Rldi9pby8jZ3J5b1tJTyBEb2N1bWVudGF0aW9uXS4KIAogW3NvdXJjZSx5YW1sXQotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyR3JlbWxpblYxZDAgfQorICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyR3JlbWxpblYzZDAgfQogCi1JdCBoYXMgdGhlIE1JTUUgdHlwZSBvZiBgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjEuMCtncnlvYCBhbmQgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6CitJdCBoYXMgdGhlIE1JTUUgdHlwZSBvZiBgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvYCBhbmQgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6CiAKIFt3aWR0aD0iMTAwJSIsY29scz0iMywxMCxeMiIsb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE1NDYsNiArMTU0OSw3IEBACiBidXQgbm90IG9uIHRoZSBjbGllbnQpLiAgSW1wbGVtZW50YXRpb25zIHNob3VsZCB0eXBpY2FsbHkgaW5zdGFudGlhdGUgYENsYXNzUmVzb2x2ZXJgIGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZQogZXh0ZW5zaW9ucyBvZiB0aGUgYEdyeW9DbGFzc1Jlc29sdmVyYCBhcyB0aGlzIGNsYXNzIGlzIGltcG9ydGFudCB0byBtb3N0IHNlcmlhbGl6YXRpb24gdGFza3MgaW4gVGlua2VyUG9wLgogCitbW3NlcnZlci1ncmFwaGJpbmFyeV1dCiA9PT09PSBHcmFwaEJpbmFyeQogCiBHcmFwaEJpbmFyeSBpcyBhIGJpbmFyeSBzZXJpYWxpemF0aW9uIGZvcm1hdCBzdWl0YWJsZSBmb3Igb2JqZWN0IHRyZWVzLCBkZXNpZ25lZCB0byByZWR1Y2Ugc2VyaWFsaXphdGlvbiBvdmVyaGVhZCBvbgpAQCAtMTg1OCwxMCArMTg2Miw2IEBACiBjYXNlIGJ1dCBHcmFwaEJpbmFyeSB3aWxsIG5vdC4gVGhlcmVmb3JlLCBzY3JpcHQtYmFzZWQgcmVxdWVzdHMgdGhhdCB1c2UgR3J5byBvciBHcmFwaFNPTiBzaG91bGQgZGVmaW5pdGVseSBmb2xsb3cgdGhlCiBiZXN0IHByYWN0aWNlIG9mIG9ubHkgcmV0dXJuaW5nIHRoZSBkYXRhIHJlcXVpcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KIAotTk9URTogR3J5byBkb2VzIGhhdmUgdGhlIGV4Y2VwdGlvbiBmb3IgdGhlIGBHcnlvTWVzc2FnZVNlcmlhbGl6ZXJHcmVtbGluVjFkMGAgd2l0aCB0aGUgYHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nYAotb3B0aW9uIGVuYWJsZWQsIHdoaWNoIHdpbGwgc2ltcGx5IGNvbnZlcnQgYWxsIHJlc3VsdHMgdXNpbmcgdGhlIEphdmEgYHRvU3RyaW5nKClgIG1ldGhvZCBwcmlvciB0byBzZXJpYWxpemF0aW9uIGFuZAotaXMgdHlwaWNhbGx5IG9ubHkgdXNlIGJ5IHRoZSBHcmVtbGluIENvbnNvbGUgZm9yIHJlbW90ZSBzZXNzaW9ucyB3aGVyZSB0aGUgYWN0dWFsIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIgaXMgbm90IG9mIHVzZS4KLQogRm9yIGJ5dGVjb2RlLWJhc2VkIHJlcXVlc3RzLCBncmFwaCBlbGVtZW50cyBoYXZlIHJlZmVyZW5jZSBkZXRhY2htZW50IGFuZCB0aHVzIG9ubHkgcmV0dXJuIHRoZSBgaWRgIGFuZCBgbGFiZWxgIG9mCiB0aGUgZWxlbWVudHMuIFdoaWxlIHRoaXMgYXBwcm9hY2ggYWxsZXZpYXRlcyBhIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBwcm9ibGVtIHRoYXQgdGhlIHNjcmlwdCBhcHByb2FjaCBleHBvc2VzLCBpdCBpcwogc3RpbGwgaW1wb3J0YW50IHRvIGZvbGxvdyB0aGUgcHJhY3RpY2Ugb2YgYmVpbmcgc3BlY2lmaWMgYWJvdXQgdGhlIGRhdGEgdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgcmVxdWVzdGluZyBhcHBsaWNhdGlvbgpAQCAtMjM2NCw3ICsyMzY0LDcgQEAKIGxpbms6aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TeW50YWN0aWNfc3VnYXJbc3ludGFjdGljIHN1Z2Fyc10gdGhhdCB1c2VycyBjb3VsZCByZWx5IG9uIHRvIG1ha2UgdGhlaXIgdHJhdmVyc2FscwogbW9yZSBzdWNjaW5jdC4gVW5mb3J0dW5hdGVseSwgbWFueSBvZiB0aGVzZSBjb252ZW50aW9ucyBtYWRlIHVzZSBvZiBsaW5rOmh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3R1dG9yaWFsL3JlZmxlY3QvW0phdmEgcmVmbGVjdGlvbl0KIGFuZCB0aHVzLCB3ZXJlIG5vdCBwZXJmb3JtYW50LiBJbiBUaW5rZXJQb3AsIHRoZXNlIGNvbnZlbmllbmNlcyBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBzdXBwb3J0IG9mIHRoZSBzdGFuZGFyZAotR3JlbWxpbi1Hcm9vdnkgc3ludGF4IGJlaW5nIGJvdGggaW5saW5lIHdpdGggR3JlbWxpbi1KYXZhOCBzeW50YXggYXMgd2VsbCBhcyBhbHdheXMgYmVpbmcgdGhlIG1vc3QgcGVyZm9ybWFudAorR3JlbWxpbi1Hcm9vdnkgc3ludGF4IGJlaW5nIGJvdGggaW5saW5lIHdpdGggR3JlbWxpbi1KYXZhIHN5bnRheCBhcyB3ZWxsIGFzIGFsd2F5cyBiZWluZyB0aGUgbW9zdCBwZXJmb3JtYW50CiByZXByZXNlbnRhdGlvbi4gSG93ZXZlciwgZm9yIHRob3NlIHVzZXJzIHRoYXQgd291bGQgbGlrZSB0byB1c2UgdGhlIHByZXZpb3VzIHN5bnRhY3RpYyBzdWdhcnMgKGFzIHdlbGwgYXMgbmV3IG9uZXMpLAogdGhlcmUgaXMgYFN1Z2FyR3JlbWxpblBsdWdpbmAgKGEuay5hIEdyZW1saW4tR3Jvb3Z5LVN1Z2FyKS4KIApkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvcmVmZXJlbmNlL2dyZW1saW4tdmFyaWFudHMuYXNjaWlkb2MgYi9kb2NzL3NyYy9yZWZlcmVuY2UvZ3JlbWxpbi12YXJpYW50cy5hc2NpaWRvYwppbmRleCA5MzRlNGFlLi40ZjFhODg0IDEwMDY0NAotLS0gYS9kb2NzL3NyYy9yZWZlcmVuY2UvZ3JlbWxpbi12YXJpYW50cy5hc2NpaWRvYworKysgYi9kb2NzL3NyYy9yZWZlcmVuY2UvZ3JlbWxpbi12YXJpYW50cy5hc2NpaWRvYwpAQCAtMjkxLDE4ICsyOTEsMTcgQEAKIAogUmVtb3RlIHN5c3RlbXMgbGlrZSBHcmVtbGluIFNlcnZlciBhbmQgUmVtb3RlIEdyZW1saW4gUHJvdmlkZXJzIHJlc3BvbmQgdG8gcmVxdWVzdHMgbWFkZSBpbiBhIHBhcnRpY3VsYXIgc2VyaWFsaXphdGlvbgogZm9ybWF0IGFuZCByZXNwb25kIGJ5IHNlcmlhbGl6aW5nIHJlc3VsdHMgdG8gc29tZSBmb3JtYXQgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGNsaWVudC4gRm9yIEpWTS1iYXNlZCBsYW5ndWFnZXMsCi10aGVyZSBhcmUgdGhyZWUgb3B0aW9ucyBmb3Igc2VyaWFsaXphdGlvbjogR3J5bywgR3JhcGhTT04gYW5kIEdyYXBoQmluYXJ5LiBXaGVuIHVzaW5nIEdyeW8gc2VyaWFsaXphdGlvbiAodGhlIGRlZmF1bHQKLXNlcmlhbGl6ZXIgZm9yIHRoZSBKYXZhIGRyaXZlciksIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBjbGllbnQgYW5kIHNlcnZlciBoYXZlIHRoZSBzYW1lIHNlcmlhbGl6ZXJzIGNvbmZpZ3VyZWQgb3IKLWVsc2Ugb25lIG9yIHRoZSBvdGhlciB3aWxsIGV4cGVyaWVuY2Ugc2VyaWFsaXphdGlvbiBleGNlcHRpb25zIGFuZCBmYWlsIHRvIGFsd2F5cyBjb21tdW5pY2F0ZS4gRGlzY3JlcGFuY3kgaW4KLXNlcmlhbGl6ZXIgcmVnaXN0cmF0aW9uIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgY2FuIGhhcHBlbiBmYWlybHkgZWFzaWx5IGFzIGdyYXBocyB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZQotc2VyaWFsaXplcnMgb24gdGhlIHNlcnZlci1zaWRlLCB0aHVzIGxlYXZpbmcgdGhlIGNsaWVudCB0byBiZSBjb25maWd1cmVkIG1hbnVhbGx5LiBUaGlzIGNhbiBiZSBkb25lIG1hbnVhbGx5IGFzCi1mb2xsb3dzOgordGhlcmUgYXJlIHRocmVlIG9wdGlvbnMgZm9yIHNlcmlhbGl6YXRpb246IEdyeW8sIEdyYXBoU09OIGFuZCBHcmFwaEJpbmFyeS4gSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGNsaWVudCBhbmQgc2VydmVyCitoYXZlIHRoZSBzYW1lIHNlcmlhbGl6ZXJzIGNvbmZpZ3VyZWQgaW4gdGhlIHNhbWUgd2F5IG9yIGVsc2Ugb25lIG9yIHRoZSBvdGhlciB3aWxsIGV4cGVyaWVuY2Ugc2VyaWFsaXphdGlvbiBleGNlcHRpb25zCithbmQgZmFpbCB0byBhbHdheXMgY29tbXVuaWNhdGUuIERpc2NyZXBhbmN5IGluIHNlcmlhbGl6ZXIgcmVnaXN0cmF0aW9uIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgY2FuIGhhcHBlbiBmYWlybHkKK2Vhc2lseSBhcyBkaWZmZXJlbnQgZ3JhcGggc3lzdGVtcyBtYXkgYXV0b21hdGljYWxseSBpbmNsdWRlIHNlcmlhbGl6ZXJzIG9uIHRoZSBzZXJ2ZXItc2lkZSwgdGh1cyBsZWF2aW5nIHRoZSBjbGllbnQKK3RvIGJlIGNvbmZpZ3VyZWQgbWFudWFsbHkuIEFzIGFuIGV4YW1wbGU6CiAKIFtzb3VyY2UsamF2YV0KIC0tLS0KIElvUmVnaXN0cnkgcmVnaXN0cnkgPSAuLi47IC8vIGFuIElvUmVnaXN0cnkgaW5zdGFuY2UgZXhwb3NlZCBieSBhIHNwZWNpZmljIGdyYXBoIHByb3ZpZGVyCi1HcnlvTWFwcGVyIGtyeW8gPSBHcnlvTWFwcGVyLmJ1aWxkKCkuYWRkUmVnaXN0cnkocmVnaXN0cnkpLmNyZWF0ZSgpOwotTWVzc2FnZVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBHcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwKGtyeW8pOworVHlwZVNlcmlhbGl6ZXJSZWdpc3RyeSB0eXBlU2VyaWFsaXplclJlZ2lzdHJ5ID0gVHlwZVNlcmlhbGl6ZXJSZWdpc3RyeS5idWlsZCgpLmFkZFJlZ2lzdHJ5KHJlZ2lzdHJ5KS5jcmVhdGUoKTsKK01lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxKHR5cGVTZXJpYWxpemVyUmVnaXN0cnkpOwogQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCgpLgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyKHNlcmlhbGl6ZXIpLgogICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUoKTsKQEAgLTMxMiwxMCArMzExLDEyIEBACiAKIFRoZSBgSW9SZWdpc3RyeWAgdGVsbHMgdGhlIHNlcmlhbGl6ZXIgd2hhdCBjbGFzc2VzIGZyb20gdGhlIGdyYXBoIHByb3ZpZGVyIHRvIGF1dG8tcmVnaXN0ZXIgZHVyaW5nIHNlcmlhbGl6YXRpb24uCiBHcmVtbGluIFNlcnZlciByb3VnaGx5IHVzZXMgdGhpcyBzYW1lIGFwcHJvYWNoIHdoZW4gaXQgY29uZmlndXJlcyBpdHMgc2VyaWFsaXplcnMsIHNvIHVzaW5nIHRoaXMgc2FtZSBtb2RlbCB3aWxsCi1lbnN1cmUgY29tcGF0aWJpbGl0eSB3aGVuIG1ha2luZyByZXF1ZXN0cy4gT2J2aW91c2x5LCBpdCBpcyBwb3NzaWJsZSB0byBzd2l0Y2ggdG8gR3JhcGhTT04gb3IgR3JhcGhCaW5hcnkgYnkgYnVpbGRpbmcKLXRoZSBhcHByb3ByaWF0ZSBgTWVzc2FnZVNlcmlhbGl6ZXJgIChgR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYzZDBgIG9yIGBHcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjFgIHJlc3BlY3RpdmVseSkKK2Vuc3VyZSBjb21wYXRpYmlsaXR5IHdoZW4gbWFraW5nIHJlcXVlc3RzLiBPYnZpb3VzbHksIGl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCB0byBHcmFwaFNPTiBvciBHcnlvIGJ5IHVzaW5nCit0aGUgYXBwcm9wcmlhdGUgYE1lc3NhZ2VTZXJpYWxpemVyYCAoZS5nLiBgR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYzZDBgIG9yIGBHcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwYCByZXNwZWN0aXZlbHkpCiBpbiB0aGUgc2FtZSB3YXkgYW5kIGJ1aWxkaW5nIHRoYXQgaW50byB0aGUgYENsdXN0ZXJgIG9iamVjdC4KIAorTk9URTogR3J5byBpcyBubyBsb25nZXIgdGhlIHByZWZlcnJlZCBiaW5hcnkgc2VyaWFsaXphdGlvbiBmb3JtYXQgZm9yIEdyZW1saW4gU2VydmVyIC0gcGxlYXNlIHByZWZlciBHcmFwaEJpbmFyeS4KKwogW1tncmVtbGluLWphdmEtbGFtYmRhXV0KID09PSBUaGUgTGFtYmRhIFNvbHV0aW9uCiAKQEAgLTQyMSw3ICs0MjIsNyBAQAogCiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3ZlcmxvYWRzIHRvIGBDbGllbnQuc3VibWl0KClgIHRoYXQgYWNjZXB0IGEgYFJlcXVlc3RPcHRpb25zYCBvYmplY3QuIFRoZSBgUmVxdWVzdE9wdGlvbnNgCiBwcm92aWRlIGEgd2F5IHRvIGluY2x1ZGUgb3B0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgcmVxdWVzdCBtYWRlIHdpdGggdGhlIGNhbGwgdG8gYHN1Ym1pdCgpYC4gQSBnb29kIHVzZS1jYXNlIGZvcgotdGhpcyBmZWF0dXJlIGlzIHRvIHNldCBhIHBlci1yZXF1ZXN0IG92ZXJyaWRlIHRvIHRoZSBgc2NyaXB0RXZhbHVhdGlvblRpbWVvdXRgIHNvIHRoYXQgaXQgb25seSBhcHBsaWVzIHRvIHRoZSBjdXJyZW50Cit0aGlzIGZlYXR1cmUgaXMgdG8gc2V0IGEgcGVyLXJlcXVlc3Qgb3ZlcnJpZGUgdG8gdGhlIGBldmFsdWF0aW9uVGltZW91dGAgc28gdGhhdCBpdCBvbmx5IGFwcGxpZXMgdG8gdGhlIGN1cnJlbnQKIHJlcXVlc3QuCiAKIFtzb3VyY2UsamF2YV0KQEAgLTY0OCw2ICs2NDksNyBAQAogW3NvdXJjZSxiYXNoXQogLS0tLQogcGlwIGluc3RhbGwgZ3JlbWxpbnB5dGhvbgorcGlwIGluc3RhbGwgZ3JlbWxpbnB5dGhvbltrZXJiZXJvc10gICAgICMgT3B0aW9uYWwsIG5vdCBhdmFpbGFibGUgb24gTWljcm9zb2Z0IFdpbmRvd3MKIC0tLS0KIAogW1tncmVtbGluLXB5dGhvbi1jb25uZWN0aW5nXV0KQEAgLTY2Nyw5ICs2NjksMzYgQEAKIAogW3NvdXJjZSxweXRob25dCiAtLS0tCi1nID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShEcml2ZXJSZW1vdGVDb25uZWN0aW9uKCd3czovL2xvY2FsaG9zdDo4MTgyL2dyZW1saW4nLCdnJyxoZWFkZXJzPXsnSGVhZGVyJzonVmFsdWUnfSkpCitnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShEcml2ZXJSZW1vdGVDb25uZWN0aW9uKAorICAgICd3czovL2xvY2FsaG9zdDo4MTgyL2dyZW1saW4nLCAnZycsIGhlYWRlcnM9eydIZWFkZXInOidWYWx1ZSd9KSkKIC0tLS0KIAorR3JlbWxpbi1QeXRob24gc3VwcG9ydHMgcGxhaW4gdGV4dCBhbmQgS2VyYmVyb3MgU0FTTCBhdXRoZW50aWNhdGlvbiwgeW91IGNhbiBzZXQgaXQgb24gdGhlIGNvbm5lY3Rpb24gb3B0aW9ucy4KKworW3NvdXJjZSxweXRob25dCistLS0tCisjIFBsYWluIHRleHQgYXV0aGVudGljYXRpb24KK2cgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKERyaXZlclJlbW90ZUNvbm5lY3Rpb24oCisgICAgJ3dzOi8vbG9jYWxob3N0OjgxODIvZ3JlbWxpbicsICdnJywgdXNlcm5hbWU9J3N0ZXBoZW4nLCBwYXNzd29yZD0ncGFzc3dvcmQnKSkKKworIyBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbgorZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUoRHJpdmVyUmVtb3RlQ29ubmVjdGlvbigKKyAgICAnd3M6Ly9sb2NhbGhvc3Q6ODE4Mi9ncmVtbGluJywgJ2cnLCBrZXJiZXJpemVkX3NlcnZpY2U9J2dyZW1saW5AaG9zdG5hbWUueW91ci5vcmcnKSkKKy0tLS0KKworVGhlIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIGtlcmJlcml6ZWRfc2VydmljZSBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcHJpbmNpcGFsIG5hbWUgY29uZmlndXJlZCBmb3IKK3RoZSBncmVtbGluIHNlcnZpY2UsIGJ1dCB3aXRoIHRoZSBzbGFzaCByZXBsYWNlZCBieSBhbiBfYXRfIHNpZ24uIFRoZSBHcmVtbGluLVB5dGhvbiBjbGllbnQgcmVhZHMgdGhlIGtlcmJlcm9zCitjb25maWd1cmF0aW9ucyBmcm9tIHlvdXIgc3lzdGVtLiBJdCBmaW5kcyB0aGUgS0RDJ3MgaG9zdG5hbWUgYW5kIHBvcnQgZnJvbSB0aGUga3JiNS5jb25mIGZpbGUgYXQgdGhlCitodHRwczovL3dlYi5taXQuZWR1L2tlcmJlcm9zL2tyYjUtZGV2ZWwvZG9jL21pdEs1ZGVmYXVsdHMuaHRtbFtkZWZhdWx0IGxvY2F0aW9uXSBvciBhcyBpbmRpY2F0ZWQgaW4gdGhlIEtSQjVfQ09ORklHCitlbnZpcm9ubWVudCB2YXJpYWJsZS4gSXQgZmluZHMgY3JlZGVudGlhbHMgZnJvbSB0aGUgY3JlZGVudGlhbCBjYWNoZSBvciBhIGtleXRhYiBmaWxlIGF0IHRoZQoraHR0cHM6Ly93ZWIubWl0LmVkdS9rZXJiZXJvcy9rcmI1LWRldmVsL2RvYy9taXRLNWRlZmF1bHRzLmh0bWxbZGVmYXVsdCBsb2NhdGlvbnNdIG9yIGFzIGluZGljYXRlZAoraW4gdGhlIEtSQjVDQ05BTUUgb3IgS1JCNV9LVE5BTUUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitJZiB5b3UgYXV0aGVudGljYXRlIHRvIGEgcmVtb3RlIDw8Y29ubmVjdGluZy1ncmVtbGluLXNlcnZlcixHcmVtbGluIFNlcnZlcj4+IG9yCis8PGNvbm5lY3RpbmctcmdwLFJlbW90ZSBHcmVtbGluIFByb3ZpZGVyPj4sIHRoaXMgc2VydmVyIG5vcm1hbGx5IGhhcyBTU0wgYWN0aXZhdGVkIGFuZCB0aGUgd2Vic29ja2V0cyB1cmwgd2lsbCBzdGFydAord2l0aCAnd3NzOi8vJy4gSWYgR3JlbWxpbi1TZXJ2ZXIgdXNlcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGZvciBTU0wsIEdyZW1saW4tUHl0aG9uIG5lZWRzIGFjY2VzcyB0byBhIGxvY2FsIGNvcHkgb2YKK3RoZSBDQSBjZXJ0aWZpY2F0ZSBmaWxlIChpbiBvcGVuc3NsIC5wZW0gZm9ybWF0KSwgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBTU0xfQ0VSVF9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLgorCiBOT1RFOiBJZiBjb25uZWN0aW5nIGZyb20gYW4gaW5oZXJlbnRseSBzaW5nbGUtdGhyZWFkZWQgUHl0aG9uIHByb2Nlc3Mgd2hlcmUgYmxvY2tpbmcgd2hpbGUgd2FpdGluZyBmb3IgR3JlbWxpbgogdHJhdmVyc2FscyB0byBjb21wbGV0ZSBpcyBhY2NlcHRhYmxlLCBpdCBtaWdodCBiZSBoZWxwZnVsIHRvIHNldCBgcG9vbF9zaXplYCBhbmQgYG1heF93b3JrZXJzYCBwYXJhbWV0ZXJzIHRvIDEuCiBTZWUgdGhlIDw8cHl0aG9uLWNvbmZpZ3VyYXRpb24sQ29uZmlndXJhdGlvbj4+IHNlY3Rpb24ganVzdCBiZWxvdy4gIEV4YW1wbGVzIHdoZXJlIHRoaXMgY291bGQgYXBwbHkgYXJlIHNlcnZlcmxlc3MgY2xvdWQgZnVuY3Rpb25zIG9yIFdTR0kKQEAgLTcwNSw5ICs3MzQsMTAgQEAKIAogVGhlc2UgY2FuIGJlIHVzZWQgYW5hbG9nb3VzbHkgdG8gaG93IHRoZXkgYXJlIHVzZWQgaW4gR3JlbWxpbi1KYXZhLgogCi1bZ3JlbWxpbi1weXRob24sbW9kZXJuXQorW3NvdXJjZSxweXRob25dCiAtLS0tCi1nLlYoKS5oYXNMYWJlbCgncGVyc29uJykuaGFzKCdhZ2UnLFAuZ3QoMzApKS5vcmRlcigpLmJ5KCdhZ2UnLE9yZGVyLmRlc2MpLnRvTGlzdCgpCis+Pj4gZy5WKCkuaGFzTGFiZWwoJ3BlcnNvbicpLmhhcygnYWdlJyxQLmd0KDMwKSkub3JkZXIoKS5ieSgnYWdlJyxPcmRlci5kZXNjKS50b0xpc3QoKQorW3ZbNl0sIHZbNF1dCiAtLS0tCiAKIE1vcmVvdmVyLCBieSBpbXBvcnRpbmcgdGhlIGBzdGF0aWNzYCBvZiBHcmVtbGluLVB5dGhvbiwgdGhlIGNsYXNzIHByZWZpeGVzIGNhbiBiZSBvbWl0dGVkLgpAQCAtNzE5LDE3ICs3NDksMTkgQEAKIAogV2l0aCBzdGF0aWNzIGxvYWRlZCBpdHMgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBhYm92ZSB0cmF2ZXJzYWwgYXMgYmVsb3cuCiAKLVtncmVtbGluLXB5dGhvbixtb2Rlcm5dCitbc291cmNlLHB5dGhvbl0KIC0tLS0KLWcuVigpLmhhc0xhYmVsKCdwZXJzb24nKS5oYXMoJ2FnZScsZ3QoMzApKS5vcmRlcigpLmJ5KCdhZ2UnLGRlc2MpLnRvTGlzdCgpCis+Pj4gZy5WKCkuaGFzTGFiZWwoJ3BlcnNvbicpLmhhcygnYWdlJyxndCgzMCkpLm9yZGVyKCkuYnkoJ2FnZScsZGVzYykudG9MaXN0KCkKK1t2WzZdLCB2WzRdXQogLS0tLQogCiBGaW5hbGx5LCBzdGF0aWNzIGluY2x1ZGVzIGFsbCB0aGUgYCtfXytgLW1ldGhvZHMgYW5kIHRodXMsIGFub255bW91cyB0cmF2ZXJzYWxzIGxpa2UgYCtfXy5vdXQoKStgIGNhbiBiZSBleHByZXNzZWQgYXMgYmVsb3cuCiBUaGF0IGlzLCB3aXRob3V0IHRoZSBgK19fK2AtcHJlZml4LgogCi1bZ3JlbWxpbi1weXRob24sbW9kZXJuXQorW3NvdXJjZSxweXRob25dCiAtLS0tCi1nLlYoKS5yZXBlYXQob3V0KCkpLnRpbWVzKDIpLm5hbWUuZm9sZCgpLnRvTGlzdCgpCis+Pj4gZy5WKCkucmVwZWF0KG91dCgpKS50aW1lcygyKS5uYW1lLmZvbGQoKS50b0xpc3QoKQorW1sncmlwcGxlJywgJ2xvcCddXQogLS0tLQogCiBhbmNob3I6cHl0aG9uLWNvbmZpZ3VyYXRpb25bXQpAQCAtNzUwLDYgKzc4Miw3IEBACiB8cHJvdG9jb2xfZmFjdG9yeSB8QSBjYWxsYWJsZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYEFic3RyYWN0QmFzZVByb3RvY29sYC4gfGBncmVtbGluX3B5dGhvbi5kcml2ZXIucHJvdG9jb2wuR3JlbWxpblNlcnZlcldTUHJvdG9jb2xgCiB8dHJhbnNwb3J0X2ZhY3RvcnkgfEEgY2FsbGFibGUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGBBYnN0cmFjdEJhc2VUcmFuc3BvcnRgLiB8YGdyZW1saW5fcHl0aG9uLmRyaXZlci50b3JuYWRvLnRyYW5zcG9ydC5Ub3JuYWRvVHJhbnNwb3J0YAogfHVzZXJuYW1lIHxUaGUgdXNlcm5hbWUgdG8gc3VibWl0IG9uIHJlcXVlc3RzIHRoYXQgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gfCIiCit8a2VyYmVyaXplZF9zZXJ2aWNlIHx0aGUgZmlyc3QgcGFydCBvZiB0aGUgcHJpbmNpcGFsIG5hbWUgY29uZmlndXJlZCBmb3IgdGhlIGdyZW1saW4gc2VydmljZXwiIiIKIHxzZXNzaW9uIHwgQSB1bmlxdWUgc3RyaW5nLWJhc2VkIGlkZW50aWZpZXIgKHR5cGljYWxseSBhIFVVSUQpIHRvIGVuYWJsZSBhIDw8c2Vzc2lvbnMsc2Vzc2lvbi1iYXNlZCBjb25uZWN0aW9uPj4uIFRoaXMgaXMgbm90IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmb3IgYERyaXZlclJlbW90ZUNvbm5lY3Rpb25gLiB8Tm9uZQogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC03NjcsMTcgKzgwMCwyMyBAQAogSW4gb3JkZXIgdG8gYWRkIGFuZCByZW1vdmUgPDx0cmF2ZXJzYWxzdHJhdGVneSx0cmF2ZXJzYWwgc3RyYXRlZ2llcz4+IGZyb20gYSB0cmF2ZXJzYWwgc291cmNlLCBHcmVtbGluLVB5dGhvbiBoYXMgYQogYFRyYXZlcnNhbFN0cmF0ZWd5YCBjbGFzcyBhbG9uZyB3aXRoIGEgY29sbGVjdGlvbiBvZiBzdWJjbGFzc2VzIHRoYXQgbWlycm9yIHRoZSBzdGFuZGFyZCBHcmVtbGluLUphdmEgc3RyYXRlZ2llcy4KIAotW2dyZW1saW4tcHl0aG9uLG1vZGVybl0KK1tzb3VyY2UscHl0aG9uXQogLS0tLQotZyA9IGcud2l0aFN0cmF0ZWdpZXMoU3ViZ3JhcGhTdHJhdGVneSh2ZXJ0aWNlcz1oYXNMYWJlbCgncGVyc29uJyksZWRnZXM9aGFzKCd3ZWlnaHQnLGd0KDAuNSkpKSkKLWcuVigpLm5hbWUudG9MaXN0KCkKLWcuVigpLm91dEUoKS5lbGVtZW50TWFwKCkudG9MaXN0KCkKLWcgPSBnLndpdGhvdXRTdHJhdGVnaWVzKFN1YmdyYXBoU3RyYXRlZ3kpCi1nLlYoKS5uYW1lLnRvTGlzdCgpCi1nLlYoKS5vdXRFKCkuZWxlbWVudE1hcCgpLnRvTGlzdCgpCi1nID0gZy53aXRoQ29tcHV0ZXIod29ya2Vycz0yLHZlcnRpY2VzPWhhcygnbmFtZScsJ21hcmtvJykpCi1nLlYoKS5uYW1lLnRvTGlzdCgpCi1nLlYoKS5vdXRFKCkudmFsdWVNYXAoKS53aXRoXyhXaXRoT3B0aW9ucy50b2tlbnMpLnRvTGlzdCgpCis+Pj4gZyA9IGcud2l0aFN0cmF0ZWdpZXMoU3ViZ3JhcGhTdHJhdGVneSh2ZXJ0aWNlcz1oYXNMYWJlbCgncGVyc29uJyksZWRnZXM9aGFzKCd3ZWlnaHQnLGd0KDAuNSkpKSkKKz4+PiBnLlYoKS5uYW1lLnRvTGlzdCgpCitbJ21hcmtvJywgJ3ZhZGFzJywgJ2pvc2gnLCAncGV0ZXInXQorPj4+IGcuVigpLm91dEUoKS5lbGVtZW50TWFwKCkudG9MaXN0KCkKK1t7PFQuaWQ6IDE+OiA4LCA8VC5sYWJlbDogND46ICdrbm93cycsIDxEaXJlY3Rpb24uSU46IDI+OiB7PFQuaWQ6IDE+OiA0LCA8VC5sYWJlbDogND46ICdwZXJzb24nfSwgPERpcmVjdGlvbi5PVVQ6IDM+OiB7PFQuaWQ6IDE+OiAxLCA8VC5sYWJlbDogND46ICdwZXJzb24nfSwgJ3dlaWdodCc6IDEuMH1dCis+Pj4gZyA9IGcud2l0aG91dFN0cmF0ZWdpZXMoU3ViZ3JhcGhTdHJhdGVneSkKKz4+PiBnLlYoKS5uYW1lLnRvTGlzdCgpCitbJ21hcmtvJywgJ3ZhZGFzJywgJ2xvcCcsICdqb3NoJywgJ3JpcHBsZScsICdwZXRlciddCis+Pj4gZy5WKCkub3V0RSgpLmVsZW1lbnRNYXAoKS50b0xpc3QoKQorW3s8VC5pZDogMT46IDksIDxULmxhYmVsOiA0PjogJ2NyZWF0ZWQnLCA8RGlyZWN0aW9uLklOOiAyPjogezxULmlkOiAxPjogMywgPFQubGFiZWw6IDQ+OiAnc29mdHdhcmUnfSwgPERpcmVjdGlvbi5PVVQ6IDM+OiB7PFQuaWQ6IDE+OiAxLCA8VC5sYWJlbDogND46ICdwZXJzb24nfSwgJ3dlaWdodCc6IDAuNH0sIHs8VC5pZDogMT46IDcsIDxULmxhYmVsOiA0PjogJ2tub3dzJywgPERpcmVjdGlvbi5JTjogMj46IHs8VC5pZDogMT46IDIsIDxULmxhYmVsOiA0PjogJ3BlcnNvbid9LCA8RGlyZWN0aW9uLk9VVDogMz46IHs8VC5pZDogMT46IDEsIDxULmxhYmVsOiA0PjogJ3BlcnNvbid9LCAnd2VpZ2h0JzogMC41fSwgezxULmlkOiAxPjogOCwgPFQubGFiZWw6IDQ+OiAna25vd3MnLCA8RGlyZWN0aW9uLklOOiAyPjogezxULmlkOiAxPjogNCwgPFQubGFiZWw6IDQ+OiAncGVyc29uJ30sIDxEaXJlY3Rpb24uT1VUOiAzPjogezxULmlkOiAxPjogMSwgPFQubGFiZWw6IDQ+OiAncGVyc29uJ30sICd3ZWlnaHQnOiAxLjB9LCB7PFQuaWQ6IDE+OiAxMCwgPFQubGFiZWw6IDQ+OiAnY3JlYXRlZCcsIDxEaXJlY3Rpb24uSU46IDI+OiB7PFQuaWQ6IDE+OiA1LCA8VC5sYWJlbDogND46ICdzb2Z0d2FyZSd9LCA8RGlyZWN0aW9uLk9VVDogMz46IHs8VC5pZDogMT46IDQsIDxULmxhYmVsOiA0PjogJ3BlcnNvbid9LCAnd2VpZ2h0JzogMS4wfSwgezxULmlkOiAxPjogMTEsIDxULmxhYmVsOiA0PjogJ2NyZWF0ZWQnLCA8RGlyZWN0aW9uLklOOiAyPjogezxULmlkOiAxPjogMywgPFQubGFiZWw6IDQ+OiAnc29mdHdhcmUnfSwgPERpcmVjdGlvbi5PVVQ6IDM+OiB7PFQuaWQ6IDE+OiA0LCA8VC5sYWJlbDogND46ICdwZXJzb24nfSwgJ3dlaWdodCc6IDAuNH0sIHs8VC5pZDogMT46IDEyLCA8VC5sYWJlbDogND46ICdjcmVhdGVkJywgPERpcmVjdGlvbi5JTjogMj46IHs8VC5pZDogMT46IDMsIDxULmxhYmVsOiA0PjogJ3NvZnR3YXJlJ30sIDxEaXJlY3Rpb24uT1VUOiAzPjogezxULmlkOiAxPjogNiwgPFQubGFiZWw6IDQ+OiAncGVyc29uJ30sICd3ZWlnaHQnOiAwLjJ9XQorPj4+IGcgPSBnLndpdGhDb21wdXRlcih3b3JrZXJzPTIsdmVydGljZXM9aGFzKCduYW1lJywnbWFya28nKSkKKz4+PiBnLlYoKS5uYW1lLnRvTGlzdCgpCitbJ21hcmtvJ10KKz4+PiBnLlYoKS5vdXRFKCkudmFsdWVNYXAoKS53aXRoXyhXaXRoT3B0aW9ucy50b2tlbnMpLnRvTGlzdCgpCitbezxULmlkOiAxPjogOSwgPFQubGFiZWw6IDQ+OiAnY3JlYXRlZCcsICd3ZWlnaHQnOiAwLjR9LCB7PFQuaWQ6IDE+OiA3LCA8VC5sYWJlbDogND46ICdrbm93cycsICd3ZWlnaHQnOiAwLjV9LCB7PFQuaWQ6IDE+OiA4LCA8VC5sYWJlbDogND46ICdrbm93cycsICd3ZWlnaHQnOiAxLjB9XQogLS0tLQogCiBOT1RFOiBNYW55IG9mIHRoZSBgVHJhdmVyc2FsU3RyYXRlZ3lgIGNsYXNzZXMgaW4gR3JlbWxpbi1QeXRob24gYXJlIHByb3hpZXMgdG8gdGhlIHJlc3BlY3RpdmUgc3RyYXRlZ3kgb24KQEAgLTc5MSw5OCArODMwLDM0IEBACiBTdXBwb3J0aW5nIGxpbms6aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQW5vbnltb3VzX2Z1bmN0aW9uW2Fub255bW91cyBmdW5jdGlvbnNdIGFjcm9zcyBsYW5ndWFnZXMgaXMgZGlmZmljdWx0IGFzCiBtb3N0IGxhbmd1YWdlcyBkbyBub3Qgc3VwcG9ydCBsYW1iZGEgaW50cm9zcGVjdGlvbiBhbmQgdGh1cywgY29kZSBhbmFseXNpcy4gSW4gR3JlbWxpbi1QeXRob24sCiBhIGxpbms6aHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9yZWZlcmVuY2UvZXhwcmVzc2lvbnMuaHRtbCNsYW1iZGFbUHl0aG9uIGxhbWJkYV0gc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIGEgemVyby1hcmcKLWNhbGxhYmxlIHRoYXQgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxhbWJkYS4gVGhlIGRlZmF1bHQgbGFtYmRhIGxhbmd1YWdlIGlzIGBncmVtbGluLXB5dGhvbmAgYW5kIGNhbiBiZQotY2hhbmdlZCB2aWEgYGdyZW1saW5fcHl0aG9uLnN0YXRpY3MuZGVmYXVsdF9sYW1iZGFfbGFuZ3VhZ2VgLiBXaGVuIHRoZSBsYW1iZGEgaXMgcmVwcmVzZW50ZWQgaW4gYEJ5dGVjb2RlYCBpdHMgbGFuZ3VhZ2UKLWlzIGVuY29kZWQgc3VjaCB0aGF0IHRoZSByZW1vdGUgY29ubmVjdGlvbiBob3N0IGNhbiBpbmZlciB3aGljaCB0cmFuc2xhdG9yIGFuZCB1bHRpbWF0ZSBleGVjdXRpb24gZW5naW5lIHRvIHVzZS4KK2NhbGxhYmxlIHRoYXQgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxhbWJkYS4gVGhlIGxhbWJkYSBzaG91bGQgYmUgd3JpdHRlbiBhcyBhIGBHcmVtbGluLUdyb292eWBzdHJpbmcuCitXaGVuIHRoZSBsYW1iZGEgaXMgcmVwcmVzZW50ZWQgaW4gYEJ5dGVjb2RlYCBpdHMgbGFuZ3VhZ2UgaXMgZW5jb2RlZCBzdWNoIHRoYXQgdGhlIHJlbW90ZSBjb25uZWN0aW9uIGhvc3QgY2FuIGluZmVyCit3aGljaCB0cmFuc2xhdG9yIGFuZCB1bHRpbWF0ZSBleGVjdXRpb24gZW5naW5lIHRvIHVzZS4KIAotW2dyZW1saW4tcHl0aG9uLG1vZGVybl0KK1tzb3VyY2UscHl0aG9uXQogLS0tLQotZy5WKCkub3V0KCkubWFwKGxhbWJkYTogImxhbWJkYSB4OiBsZW4oeC5nZXQoKS52YWx1ZSgnbmFtZScpKSIpLnN1bSgpLnRvTGlzdCgpICAgICAgICAgICAgICAgICAgICAgPDE+Ci1zdGF0aWNzLmRlZmF1bHRfbGFtYmRhX2xhbmd1YWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Mj4KLWcuVigpLm91dCgpLm1hcChsYW1iZGE6ICgiaXQuZ2V0KCkudmFsdWUoJ25hbWUnKS5sZW5ndGgoKSIsICJncmVtbGluLWdyb292eSIpKS5zdW0oKS50b0xpc3QoKSAgICAgIDwzPgotc3RhdGljcy5kZWZhdWx0X2xhbWJkYV9sYW5ndWFnZSA9ICdncmVtbGluLWdyb292eScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDQ+Ci1nLlYoKS5vdXQoKS5tYXAobGFtYmRhOiAiaXQuZ2V0KCkudmFsdWUoJ25hbWUnKS5sZW5ndGgoKSIpLnN1bSgpLnRvTGlzdCgpICAgICAgICAgICAgICAgICAgICAgICAgICA8NT4KLWcuVigpLm91dCgpLm1hcChsYW1iZGE6ICgibGFtYmRhIHg6IGxlbih4LmdldCgpLnZhbHVlKCduYW1lJykpIiwgImdyZW1saW4tcHl0aG9uIikpLnN1bSgpLnRvTGlzdCgpIDw2Pgotc3RhdGljcy5kZWZhdWx0X2xhbWJkYV9sYW5ndWFnZSA9ICdncmVtbGluLXB5dGhvbicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDc+Ci1nLlYoKS5vdXQoKS5tYXAobGFtYmRhOiAieDogbGVuKHguZ2V0KCkudmFsdWUoJ25hbWUnKSkiKS5zdW0oKS50b0xpc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8OD4KKz4+PiBnLlYoKS5vdXQoKS5tYXAobGFtYmRhOiAiaXQuZ2V0KCkudmFsdWUoJ25hbWUnKS5sZW5ndGgoKSIpLnN1bSgpLnRvTGlzdCgpCitbMjRdCiAtLS0tCiAKLTwxPiBBIHplcm8tYXJnIGxhbWJkYSB5aWVsZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsYW1iZGEgaW4gR3JlbWxpbi1QeXRob24uCi08Mj4gVGhlIGRlZmF1bHQgbGFtYmRhIGxhbmd1YWdlIGlzIGN1cnJlbnRseSBHcmVtbGluLVB5dGhvbi4KLTwzPiBBIHplcm8tYXJnIGxhbWJkYSB5aWVsZHMgYSAyLXR1cGxlIHdoZXJlIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGxhbWJkYSAoR3JlbWxpbi1Hcm9vdnkpLgotPDQ+IFRoZSBkZWZhdWx0IGxhbWJkYSBsYW5ndWFnZSBjYW4gYmUgc3RhdGljYWxseSBjaGFuZ2VkLgotPDU+IEEgemVyby1hcmcgbGFtYmRhIHlpZWxkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGNsb3N1cmUgaW4gR3JlbWxpbi1Hcm9vdnkuCi08Nj4gQSB6ZXJvLWFyZyBsYW1iZGEgeWllbGRzIGEgMi10dXBsZSB3aGVyZSB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIGxhbmd1YWdlIG9mIHRoZSBsYW1iZGEgKEdyZW1saW4tUHl0aG9uKS4KLTw3PiBUaGUgZGVmYXVsdCBsYW1iZGEgbGFuZ3VhZ2UgaXMgY2hhbmdlZCBiYWNrIHRvIEdyZW1saW4tUHl0aG9uLgotPDg+IElmIHRoZSBgbGFtYmRhYC1wcmVmaXggaXMgbm90IHByb3ZpZGVkLCB0aGVuIGl0IGlzIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkgaW4gb3JkZXIgdG8gZ2l2ZSBhIG1vcmUgbmF0dXJhbCBsb29rIHRvIHRoZSBleHByZXNzaW9uLgotCiBUSVA6IFdoZW4gcnVubmluZyBpbnRvIHNpdHVhdGlvbnMgd2hlcmUgR3Jvb3Z5IGNhbm5vdCBwcm9wZXJseSBkaXNjZXJuIGEgbWV0aG9kIHNpZ25hdHVyZSBiYXNlZCBvbiB0aGUgYExhbWJkYWAKIGluc3RhbmNlIGNyZWF0ZWQsIGl0IHdpbGwgaGVscCB0byBmdWxseSBkZWZpbmUgdGhlIGNsb3N1cmUgaW4gdGhlIGxhbWJkYSBleHByZXNzaW9uIC0gc28gcmF0aGVyIHRoYW4KIGBsYW1iZGE6ICgiaXQuZ2V0KCkudmFsdWUoIm5hbWUnKSIsImdyZW1saW4tZ3Jvb3Z5IilgLCBwcmVmZXIgYGxhbWJkYTogKCJ4IC0+IHguZ2V0KCkudmFsdWUoIm5hbWUiKSwiZ3JlbWxpbi1ncm9vdnkiKWAuCiAKLVdBUk5JTkc6IEp5dGhvbiBzdXBwb3J0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgZm9yIDMuMy4xMCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuNS4wLiBHcmVtbGluLVB5dGhvbiB3aWxsIGF0IHRoYXQKLXBvaW50IGRlZmF1bHQgdG8gR3Jvb3Z5IGZvciBsYW1iZGEgcHJvY2Vzc2luZyBhbmQgUHl0aG9uIGxhbWJkYXMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLgotCiBGaW5hbGx5LCBHcmVtbGluIGBCeXRlY29kZWAgdGhhdCBpbmNsdWRlcyBsYW1iZGFzIHJlcXVpcmVzIHRoYXQgdGhlIHRyYXZlcnNhbCBiZSBwcm9jZXNzZWQgYnkgdGhlCiBgU2NyaXB0RW5naW5lYC4gVG8gYXZvaWQgY29udGludWVkIHJlY29tcGlsYXRpb24gY29zdHMsIGl0IHN1cHBvcnRzIHRoZSBlbmNvZGluZyBvZiBiaW5kaW5ncywgd2hpY2ggYWxsb3cgYSByZW1vdGUKIGVuZ2luZSB0byB0byBjYWNoZSB0cmF2ZXJzYWxzIHRoYXQgd2lsbCBiZSByZXVzZWQgb3ZlciBhbmQgb3ZlciBhZ2FpbiBzYXZlIHRoYXQgc29tZSBwYXJhbWV0ZXJpemF0aW9uIG1heSBjaGFuZ2UuIFRodXMsCiBpbnN0ZWFkIG9mIHRyYW5zbGF0aW5nLCBjb21waWxpbmcsIGFuZCB0aGVuIGV4ZWN1dGluZyBlYWNoIHN1Ym1pdHRlZCBieXRlY29kZSwgaXQgaXMgcG9zc2libGUgdG8gc2ltcGx5IGV4ZWN1dGUuCiAKLVtncmVtbGluLXB5dGhvbixtb2Rlcm5dCitbc291cmNlLHB5dGhvbl0KIC0tLS0KLWcuVihCaW5kaW5ncy5vZignaWQnLDEpKS5vdXQoJ2NyZWF0ZWQnKS5tYXAobGFtYmRhOiAoIml0LmdldCgpLnZhbHVlKCduYW1lJykubGVuZ3RoKCkiLCAiZ3JlbWxpbi1ncm9vdnkiKSkuc3VtKCkudG9MaXN0KCkKLWcuVihCaW5kaW5ncy5vZignaWQnLDQpKS5vdXQoJ2NyZWF0ZWQnKS5tYXAobGFtYmRhOiAoIml0LmdldCgpLnZhbHVlKCduYW1lJykubGVuZ3RoKCkiLCAiZ3JlbWxpbi1ncm9vdnkiKSkuc3VtKCkudG9MaXN0KCkKKz4+PiBnLlYoQmluZGluZ3Mub2YoJ3gnLDEpKS5vdXQoJ2NyZWF0ZWQnKS5tYXAobGFtYmRhOiAiaXQuZ2V0KCkudmFsdWUoJ25hbWUnKS5sZW5ndGgoKSIpLnN1bSgpLnRvTGlzdCgpCitbM10KKz4+PiBnLlYoQmluZGluZ3Mub2YoJ3gnLDQpKS5vdXQoJ2NyZWF0ZWQnKS5tYXAobGFtYmRhOiAiaXQuZ2V0KCkudmFsdWUoJ25hbWUnKS5sZW5ndGgoKSIpLnN1bSgpLnRvTGlzdCgpCitbOV0KIC0tLS0KIAotPT09PSBOYXRpdmUgUHl0aG9uIExhbWJkYXMKLQotVG8gcHJvY2VzcyBsYW1iZGFzIGluIFB5dGhvbiwgdGhlIGBHcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lYCBtdXN0IGJlIGVuYWJsZWQgb24gdGhlIHJlbW90ZSBlbmQuIElmIHRoYXQgcmVtb3RlIGlzCi1HcmVtbGluIFNlcnZlciwgdGhlbiB0aGVzZSBpbnN0cnVjdGlvbnMgY2FuIGhlbHAgY29uZmlndXJhdGlvbiBpdC4gQXMgYW4gZXhhbXBsZSwgdGhlCi1gY29uZi9ncmVtbGluLXNlcnZlci1tb2Rlcm4tcHkueWFtbGAgY29uZmlndXJhdGlvbiBtYWludGFpbnMgYSBgR3JlbWxpbkp5dGhvblNjcmlwdEVuZ2luZWAuCi0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLSQgYmluL2dyZW1saW4tc2VydmVyLnNoIGluc3RhbGwgb3JnLmFwYWNoZS50aW5rZXJwb3AgZ3JlbWxpbi1weXRob24geC55LnoKLSQgYmluL2dyZW1saW4tc2VydmVyLnNoIGNvbmYvZ3JlbWxpbi1zZXJ2ZXItbW9kZXJuLXB5LnlhbWwKLVtJTkZPXSBHcmVtbGluU2VydmVyIC0KLSAgICAgICBcLCwsLwotICAgICAgIChvIG8pCi0tLS1vT09vLSgzKS1vT09vLS0tCi0KLVtJTkZPXSBHcmVtbGluU2VydmVyIC0gQ29uZmlndXJpbmcgR3JlbWxpbiBTZXJ2ZXIgZnJvbSBjb25mL2dyZW1saW4tc2VydmVyLW1vZGVybi1weS55YW1sCi1bSU5GT10gTWV0cmljTWFuYWdlciAtIENvbmZpZ3VyZWQgTWV0cmljcyBTbGY0alJlcG9ydGVyIGNvbmZpZ3VyZWQgd2l0aCBpbnRlcnZhbD0xODAwMDBtcyBhbmQgbG9nZ2VyTmFtZT1vcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5TZXR0aW5ncyRTbGY0alJlcG9ydGVyTWV0cmljcwotW0lORk9dIEdyYXBoTWFuYWdlciAtIEdyYXBoIFtncmFwaF0gd2FzIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkIHZpYSBbY29uZi90aW5rZXJncmFwaC1lbXB0eS5wcm9wZXJ0aWVzXS4KLVtJTkZPXSBTZXJ2ZXJHcmVtbGluRXhlY3V0b3IgLSBJbml0aWFsaXplZCBHcmVtbGluIHRocmVhZCBwb29sLiAgVGhyZWFkcyBpbiBwb29sIG5hbWVkIHdpdGggcGF0dGVybiBncmVtbGluLSoKLVtJTkZPXSBTY3JpcHRFbmdpbmVzIC0gTG9hZGVkIGdyZW1saW4tanl0aG9uIFNjcmlwdEVuZ2luZQotW0lORk9dIFNjcmlwdEVuZ2luZXMgLSBMb2FkZWQgZ3JlbWxpbi1weXRob24gU2NyaXB0RW5naW5lCi1bSU5GT10gU2NyaXB0RW5naW5lcyAtIExvYWRlZCBncmVtbGluLWdyb292eSBTY3JpcHRFbmdpbmUKLVtJTkZPXSBHcmVtbGluRXhlY3V0b3IgLSBJbml0aWFsaXplZCBncmVtbGluLWdyb292eSBTY3JpcHRFbmdpbmUgd2l0aCBzY3JpcHRzL2dlbmVyYXRlLW1vZGVybi5ncm9vdnkKLVtJTkZPXSBTZXJ2ZXJHcmVtbGluRXhlY3V0b3IgLSBJbml0aWFsaXplZCBHcmVtbGluRXhlY3V0b3IgYW5kIGNvbmZpZ3VyZWQgU2NyaXB0RW5naW5lcy4KLVtJTkZPXSBTZXJ2ZXJHcmVtbGluRXhlY3V0b3IgLSBBIEdyYXBoVHJhdmVyc2FsU291cmNlIGlzIG5vdyBib3VuZCB0byBbZ10gd2l0aCBncmFwaHRyYXZlcnNhbHNvdXJjZVt0aW5rZXJncmFwaFt2ZXJ0aWNlczowIGVkZ2VzOjBdLCBzdGFuZGFyZF0KLVtJTkZPXSBPcExvYWRlciAtIEFkZGluZyB0aGUgc3RhbmRhcmQgT3BQcm9jZXNzb3IuCi1bSU5GT10gT3BMb2FkZXIgLSBBZGRpbmcgdGhlIHNlc3Npb24gT3BQcm9jZXNzb3IuCi1bSU5GT10gT3BMb2FkZXIgLSBBZGRpbmcgdGhlIHRyYXZlcnNhbCBPcFByb2Nlc3Nvci4KLVtJTkZPXSBUcmF2ZXJzYWxPcFByb2Nlc3NvciAtIEluaXRpYWxpemVkIGNhY2hlIGZvciBUcmF2ZXJzYWxPcFByb2Nlc3NvciB3aXRoIHNpemUgMTAwMCBhbmQgZXhwaXJhdGlvbiB0aW1lIG9mIDYwMDAwMCBtcwotW0lORk9dIEdyZW1saW5TZXJ2ZXIgLSBFeGVjdXRpbmcgc3RhcnQgdXAgTGlmZUN5Y2xlSG9vawotW0lORk9dIExvZ2dlciRpbmZvIC0gTG9hZGluZyAnbW9kZXJuJyBncmFwaCBkYXRhLgotW1dBUk5dIEFic3RyYWN0Q2hhbm5lbGl6ZXIgLSBUaGUgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAgc2VyaWFsaXphdGlvbiBjbGFzcyBpcyBkZXByZWNhdGVkLgotW0lORk9dIEFic3RyYWN0Q2hhbm5lbGl6ZXIgLSBDb25maWd1cmVkIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5byB3aXRoIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwCi1bV0FSTl0gQWJzdHJhY3RDaGFubmVsaXplciAtIFRoZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCBzZXJpYWxpemF0aW9uIGNsYXNzIGlzIGRlcHJlY2F0ZWQuCi1bSU5GT10gQWJzdHJhY3RDaGFubmVsaXplciAtIENvbmZpZ3VyZWQgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvLXN0cmluZ2Qgd2l0aCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMAotW0lORk9dIEFic3RyYWN0Q2hhbm5lbGl6ZXIgLSBDb25maWd1cmVkIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjAranNvbiB3aXRoIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjNkMAotW0lORk9dIEFic3RyYWN0Q2hhbm5lbGl6ZXIgLSBDb25maWd1cmVkIGFwcGxpY2F0aW9uL2pzb24gd2l0aCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYzZDAKLVtJTkZPXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gQ29uZmlndXJlZCBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMCB3aXRoIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEKLVtJTkZPXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gQ29uZmlndXJlZCBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMC1zdHJpbmdkIHdpdGggb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMQotW0lORk9dIEdyZW1saW5TZXJ2ZXIkMSAtIEdyZW1saW4gU2VydmVyIGNvbmZpZ3VyZWQgd2l0aCB3b3JrZXIgdGhyZWFkIHBvb2wgb2YgMSwgZ3JlbWxpbiBwb29sIG9mIDggYW5kIGJvc3MgdGhyZWFkIHBvb2wgb2YgMS4KLVtJTkZPXSBHcmVtbGluU2VydmVyJDEgLSBDaGFubmVsIHN0YXJ0ZWQgYXQgcG9ydCA4MTgyLgotLS0tLQotCi1OT1RFOiBUaGUgY29tbWFuZCB0byB1c2UgYGluc3RhbGxgIG5lZWQgb25seSBiZSBleGVjdXRlZCBvbmNlIHRvIGdhdGhlciBgZ3JlbWxpbi1weXRob25gIGRlcGVuZGVuY2llcyBpbnRvIEdyZW1saW4gU2VydmVycycKLXBhdGguIEZ1dHVyZSBzdGFydHMgb2YgR3JlbWxpbiBTZXJ2ZXIgd2lsbCBub3QgcmVxdWlyZSB0aGF0IGNvbW1hbmQuCi0KLVdBUk5JTkc6IEFzIGV4cGxhaW5lZCB0aHJvdWdob3V0IHRoZSBkb2N1bWVudGF0aW9uLCB3aGVuIHBvc3NpYmxlIDw8YS1ub3RlLW9uLWxhbWJkYXMsYXZvaWQ+PiBsYW1iZGFzLiBJZiBsYW1iZGFzCi1tdXN0IGJlIHVzZWQsIHRoZW4gY29uc2lkZXIgc3VibWl0dGluZyBHcm9vdnkgbGFtYmRhcyBhcyBvcHBvc2VkIHRvIFB5dGhvbi1iYXNlZCBvbmVzLiBUaGUgYEdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmVgCi1pcyBmYXIgbW9yZSBmZWF0dXJlZCBhbmQgcGVyZm9ybWFudCB0aGFuIGl0cyBKeXRob24gc2libGluZyBhbmQgd2lsbCBsaWtlbHkgeWllbGQgYmV0dGVyIHJlc3VsdHMuCitXQVJOSU5HOiBBcyBleHBsYWluZWQgdGhyb3VnaG91dCB0aGUgZG9jdW1lbnRhdGlvbiwgd2hlbiBwb3NzaWJsZSA8PGEtbm90ZS1vbi1sYW1iZGFzLGF2b2lkPj4gbGFtYmRhcy4KIAogW1tncmVtbGluLXB5dGhvbi1zY3JpcHRzXV0KID09PSBTdWJtaXR0aW5nIFNjcmlwdHMKQEAgLTEwMTYsMTEgKzk5MSwxNCBAQAogUHl0aG9uIHN1cHBvcnRzIG1ldGEtcHJvZ3JhbW1pbmcgYW5kIG9wZXJhdG9yIG92ZXJsb2FkaW5nLiBUaGVyZSBhcmUgdGhyZWUgdXNlcyBvZiB0aGVzZSB0ZWNobmlxdWVzIGluIEdyZW1saW4tUHl0aG9uCiB0aGF0IG1ha2VzIHRyYXZlcnNhbHMgYSBiaXQgbW9yZSBjb25jaXNlLgogCi1bZ3JlbWxpbi1weXRob24sbW9kZXJuXQorW3NvdXJjZSxweXRob25dCiAtLS0tCi1nLlYoKS5ib3RoKClbMTozXS50b0xpc3QoKQotZy5WKCkuYm90aCgpWzFdLnRvTGlzdCgpCi1nLlYoKS5ib3RoKCkubmFtZS50b0xpc3QoKQorPj4+IGcuVigpLmJvdGgoKVsxOjNdLnRvTGlzdCgpCitbdlsyXSwgdls0XV0KKz4+PiBnLlYoKS5ib3RoKClbMV0udG9MaXN0KCkKK1t2WzJdXQorPj4+IGcuVigpLmJvdGgoKS5uYW1lLnRvTGlzdCgpCitbJ2xvcCcsICdsb3AnLCAnbG9wJywgJ3ZhZGFzJywgJ2pvc2gnLCAnam9zaCcsICdqb3NoJywgJ21hcmtvJywgJ21hcmtvJywgJ21hcmtvJywgJ3BldGVyJywgJ3JpcHBsZSddCiAtLS0tCiAKIFtbZ3JlbWxpbi1weXRob24tZGlmZmVyZW5jZXNdXQpAQCAtMTA0NCw3ICsxMDIyLDkgQEAKIHJlc3VsdHMgd2l0aGluIGEgY29sbGVjdGlvbiBhY3Jvc3MgZGlmZmVyZW50IGxhbmd1YWdlcy4gSWYgYSBgU2V0YCBpcyBuZWVkZWQgdGhlbiBjb252ZXJ0IGBMaXN0YCByZXN1bHRzCiB0byBgU2V0YCBtYW51YWxseS4KICogR3JlbWxpbiBpcyBjYXBhYmxlIG9mIHJldHVybmluZyBgRGljdGlvbmFyeWAgcmVzdWx0cyB0aGF0IHVzZSBub24taGFzaGFibGUga2V5cyAoZS5nLiBEaWN0aW9uYXJ5IGFzIGEga2V5KSBhbmQgUHl0aG9uCi1kb2VzIG5vdCBzdXBwb3J0IHRoYXQgYXQgYSBsYW5ndWFnZSBsZXZlbC4gR3JlbWxpbiB0aGF0IHJldHVybnMgc3VjaCByZXN1bHRzIHdpbGwgbmVlZCB0byBiZSByZS13cml0dGVuIHRvIGF2b2lkIHRoYXQuCitkb2VzIG5vdCBzdXBwb3J0IHRoYXQgYXQgYSBsYW5ndWFnZSBsZXZlbC4gVXNpbmcgR3JhcGhTT04gMy4wIG9yIEdyYXBoQmluYXJ5IChhZnRlciAzLjUuMCkgbWFrZXMgaXQgcG9zc2libGUgdG8gcmV0dXJuCitzdWNoIHJlc3VsdHMuIEluIGFsbCBvdGhlciBjYXNlcywgR3JlbWxpbiB0aGF0IHJldHVybnMgc3VjaCByZXN1bHRzIHdpbGwgbmVlZCB0byBiZSByZS13cml0dGVuIHRvIGF2b2lkIHRoYXQgc29ydCBvZgora2V5LgogKiBUaGUgYHN1YmdyYXBoKClgLXN0ZXAgaXMgbm90IHN1cHBvcnRlZCBieSBhbnkgdmFyaWFudCB0aGF0IGlzIG5vdCBydW5uaW5nIG9uIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBhcyB0aGVyZSBpcwogbm8gYEdyYXBoYCBpbnN0YW5jZSB0byBkZXNlcmlhbGl6ZSBhIHJlc3VsdCBpbnRvIG9uIHRoZSBjbGllbnQtc2lkZS4gQSB3b3JrYXJvdW5kIGlzIHRvIHJlcGxhY2UgdGhlIHN0ZXAgd2l0aCBgc3RvcmUoKWAKIGFuZCB0aGVuIGNvbnZlcnQgdGhvc2UgcmVzdWx0cyB0byBzb21ldGhpbmcgdGhlIGNsaWVudCBjYW4gdXNlIGxvY2FsbHkuCkBAIC0xMDUzLDcgKzEwMzMsNyBAQAogPT09IEFwcGxpY2F0aW9uIEV4YW1wbGVzCiAKIFRoZSBUaW5rZXJQb3Agc291cmNlIGNvZGUgY29udGFpbnMgYSBzaW1wbGUgUHl0aG9uIHNjcmlwdCB0aGF0IHNob3dzIGEgYmFzaWMgZXhhbXBsZSBvZiBob3cgZ3JlbWxpbnB5dGhvbiB3b3Jrcy4gSXQKLWNhbiBiZSBmb3VuZCBpbiBHaXRIdWIgbGluazpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RpbmtlcnBvcC90cmVlL3h4Lnl5Lnp6L2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9leGFtcGxlLnB5W2hlcmVdCitjYW4gYmUgZm91bmQgaW4gR2l0SHViIGxpbms6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aW5rZXJwb3AvdHJlZS94eC55eS56ei9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZXhhbXBsZS5weVtoZXJlXQogYW5kIGlzIGRlc2lnbmVkIHRvIHdvcmsgYmVzdCB3aXRoIGEgcnVubmluZyA8PGdyZW1saW4tc2VydmVyLEdyZW1saW4gU2VydmVyPj4gY29uZmlndXJlZCB3aXRoIHRoZSBkZWZhdWx0CiBgY29uZi9ncmVtbGluLXNlcnZlci55YW1sYCBmaWxlIGFzIGluY2x1ZGVkIHdpdGggdGhlIHN0YW5kYXJkIHJlbGVhc2UgcGFja2FnaW5nLgogCkBAIC0xMjk2LDYgKzEyNzYsMjUgQEAKIGcuVigpLlJlcGVhdChfXy5PdXQoKSkuVGltZXMoMikuVmFsdWVzPHN0cmluZz4oIm5hbWUiKTsKIC0tLS0KIAorR3JlbWxpbiBhbGxvd3MgZm9yIGBNYXBgIGluc3RhbmNlcyB0byBpbmNsdWRlIGBudWxsYCBrZXlzLCBidXQgYG51bGxgIGtleXMgaW4gQyMgYERpY3Rpb25hcnlgIGluc3RhbmNlcyBhcmUgbm90IGFsbG93ZWQuCitJdCBpcyB0aGVyZWZvcmUgbmVjZXNzYXJ5IHRvIHJld3JpdGUgYSB0cmF2ZXJzYWwgc3VjaCBhczoKKworW3NvdXJjZSxqYXZhc2NyaXB0XQorLS0tLQorZy5WKCkuZ3JvdXBDb3VudCgpLmJ5KCdhZ2UnKQorLS0tLQorCit3aGVyZSAiYWdlIiBpcyBub3QgYSB2YWxpZCBrZXkgZm9yIGFsbCB2ZXJ0aWNlcyBpbiBhIHdheSB0aGF0IHdpbGwgcmVtb3ZlIHRoZSBuZWVkIGZvciBhIGBudWxsYCB0byBiZSByZXR1cm5lZC4KKworW3NvdXJjZSxqYXZhc2NyaXB0XQorLS0tLQorZy5WKCkuaGFzKCdhZ2UnKS5ncm91cENvdW50KCkuYnkoJ2FnZScpCitnLlYoKS5oYXNMYWJlbCgncGVyc29uJykuZ3JvdXBDb3VudCgpLmJ5KCdhZ2UnKQorLS0tLQorCitFaXRoZXIgb2YgdGhlIGFib3ZlIHR3byBvcHRpb25zIGFjY29tcGxpc2hlcyB0aGUgZGVzaXJlZCBnb2FsIGFzIGJvdGggcHJldmVudCBgZ3JvdXBDb3VudCgpYCBmcm9tIGhhdmluZyB0byBwcm9jZXNzCit0aGUgcG9zc2liaWxpdHkgb2YgYG51bGxgLgorCiBhbmNob3I6Z3JlbWxpbi1uZXQtbGltaXRhdGlvbnNbXQogW1tncmVtbGluLWRvdG5ldC1saW1pdGF0aW9uc11dCiA9PT0gTGltaXRhdGlvbnMKQEAgLTE0NTAsNiArMTQ0OSwxNyBAQAogCiBXaXRoIHRoaXMgY29uZmlndXJhdGlvbiwgdGhlIHN0YXRlIG9mIHZhcmlhYmxlcyB3aXRoaW4gc2NyaXB0cyBhcmUgcHJlc2VydmVkIGJldHdlZW4gcmVxdWVzdHMuCiAKKz09PT0gUGVyIFJlcXVlc3QgU2V0dGluZ3MKKworU29tZSBzZXR0aW5ncyBjYW4gYmUgZXN0YWJsaXNoZWQgcGVyIHJlcXVlc3QsIGxpa2UgYW4gb3ZlcnJpZGUgb2YgdGhlIGBzY3JpcHRFdmFsdWF0aW9uVGltZW91dGAgd2hpY2ggY2FuIGJlIGhlbHBmdWwKK3doZW4gaXQgaXMga25vd24gdGhhdCBwYXJ0aWN1bGFyIHJlcXVlc3QgbWlnaHQgbmVlZCB0byBleGVjdXRlIGxvbmdlciB0aGFuIHdoYXQgdGhlIHNlcnZlciBtaWdodCBhbGxvdyB3aXRoIGl0cworc2V0dGluZ3M6CisKK1tzb3VyY2UsamF2YXNjcmlwdF0KKy0tLS0KK2NvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5zdWJtaXQoJ2cuVigpLnJlcGVhdChib3RoKCkpLnRpbWVzKDEwMCknLCBudWxsLCB7InNjcmlwdEV2YWx1YXRpb25UaW1lb3V0IjogNjAwMDB9KTsKKy0tLS0KKwogW1tncmVtbGluLWphdmFzY3JpcHQtZHNsXV0KID09PSBEb21haW4gU3BlY2lmaWMgTGFuZ3VhZ2VzCiAKQEAgLTE1MTksNiArMTUyOSw0MSBAQAogCiAqU3RlcHMqIC0gPDxmcm9tLXN0ZXAsZnJvbV8oKT4+LCA8PGluLXN0ZXAsaW5fKCk+PiwgPDx3aXRoLXN0ZXAsd2l0aF8oKT4+CiAKK0dyZW1saW4gYWxsb3dzIGZvciBgTWFwYCBpbnN0YW5jZXMgdG8gaW5jbHVkZSBgbnVsbGAga2V5cywgYnV0IGBudWxsYCBrZXlzIGluIEphdmFzY3JpcHQgaGF2ZSBzb21lIGludGVyZXN0aW5nIGJlaGF2aW9yCithcyBpbjoKKworW3NvdXJjZSx0ZXh0XQorLS0tLQorPiB2YXIgYSA9IHsgbnVsbDogJ3NvbWV0aGluZycsICdiJzogJ2Vsc2UnIH07Cis+IEpTT04uc3RyaW5naWZ5KGEpCisneyJudWxsIjoic29tZXRoaW5nIiwiYiI6ImVsc2UifScKKz4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhKSkKK3sgbnVsbDogJ3NvbWV0aGluZycsIGI6ICdlbHNlJyB9Cis+IGFbbnVsbF0KKydzb21ldGhpbmcnCis+IGFbJ251bGwnXQorJ3NvbWV0aGluZycKKy0tLS0KKworVGhpcyBiZWhhdmlvciBuZWVkcyB0byBiZSBjb25zaWRlcmVkIHdoZW4gdXNpbmcgR3JlbWxpbiB0byByZXR1cm4gc3VjaCByZXN1bHRzLiBBIHR5cGljYWwgc2l0dWF0aW9uIHdoZXJlIHRoaXMgbWlnaHQKK2hhcHBlbiBpcyB3aXRoIGBncm91cCgpYCBvciBgZ3JvdXBDb3VudCgpYCBhcyBpbjoKKworW3NvdXJjZSxqYXZhc2NyaXB0XQorLS0tLQorZy5WKCkuZ3JvdXBDb3VudCgpLmJ5KCdhZ2UnKQorLS0tLQorCit3aGVyZSAiYWdlIiBpcyBub3QgYSB2YWxpZCBrZXkgZm9yIGFsbCB2ZXJ0aWNlcy4gSW4gdGhlc2UgY2FzZXMsIGl0IHdpbGwgcmV0dXJuIGBudWxsYCBmb3IgdGhhdCBrZXkgYW5kIGdyb3VwIG9uIHRoYXQuCitJdCBtYXkgYmV0IGJldHRlciBpbiBKYXZhc2NyaXB0IHRvIGZpbHRlciBhd2F5IHRob3NlIHZlcnRpY2VzIHRvIGF2b2lkIHRoZSByZXR1cm4gb2YgYG51bGxgIGluIHRoZSByZXR1cm5lZCBgTWFwYDoKKworW3NvdXJjZSxqYXZhc2NyaXB0XQorLS0tLQorZy5WKCkuaGFzKCdhZ2UnKS5ncm91cENvdW50KCkuYnkoJ2FnZScpCitnLlYoKS5oYXNMYWJlbCgncGVyc29uJykuZ3JvdXBDb3VudCgpLmJ5KCdhZ2UnKQorLS0tLQorCitFaXRoZXIgb2YgdGhlIGFib3ZlIHR3byBvcHRpb25zIGFjY29tcGxpc2hlcyB0aGUgZGVzaXJlZCBnb2FsIGFzIGJvdGggcHJldmVudCBgZ3JvdXBDb3VudCgpYCBmcm9tIGhhdmluZyB0byBwcm9jZXNzCit0aGUgcG9zc2liaWxpdHkgb2YgYG51bGxgLgogW1tncmVtbGluLWphdmFzY3JpcHQtbGltaXRhdGlvbnNdXQogPT09IExpbWl0YXRpb25zCiAKZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL3JlZmVyZW5jZS9pbXBsZW1lbnRhdGlvbnMtbmVvNGouYXNjaWlkb2MgYi9kb2NzL3NyYy9yZWZlcmVuY2UvaW1wbGVtZW50YXRpb25zLW5lbzRqLmFzY2lpZG9jCmluZGV4IDYxMmJhMzEuLjdjZjk1MTIgMTAwNjQ0Ci0tLSBhL2RvY3Mvc3JjL3JlZmVyZW5jZS9pbXBsZW1lbnRhdGlvbnMtbmVvNGouYXNjaWlkb2MKKysrIGIvZG9jcy9zcmMvcmVmZXJlbmNlL2ltcGxlbWVudGF0aW9ucy1uZW80ai5hc2NpaWRvYwpAQCAtMjgsNyArMjgsNyBAQAogPGRlcGVuZGVuY3k+CiAgIDxncm91cElkPm9yZy5uZW80ajwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+bmVvNGotdGlua2VycG9wLWFwaS1pbXBsPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4wLjctMy4yLjM8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjAuOS0zLjQuMDwvdmVyc2lvbj4KIDwvZGVwZW5kZW5jeT4KIC0tLS0KIApkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvcmVmZXJlbmNlL2ltcGxlbWVudGF0aW9ucy10aW5rZXJncmFwaC5hc2NpaWRvYyBiL2RvY3Mvc3JjL3JlZmVyZW5jZS9pbXBsZW1lbnRhdGlvbnMtdGlua2VyZ3JhcGguYXNjaWlkb2MKaW5kZXggMzM4NGY1NS4uNTViMGU2MSAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvcmVmZXJlbmNlL2ltcGxlbWVudGF0aW9ucy10aW5rZXJncmFwaC5hc2NpaWRvYworKysgYi9kb2NzL3NyYy9yZWZlcmVuY2UvaW1wbGVtZW50YXRpb25zLXRpbmtlcmdyYXBoLmFzY2lpZG9jCkBAIC0zOSw3ICszOSw3IEBACiAqIFVzZSBUaW5rZXJHcmFwaCBhcyBhIHNhbmRib3ggdG8gZGV2ZWxvcCBhbmQgZGVidWcgY29tcGxleCB0cmF2ZXJzYWxzIGJ5IHNpbXVsYXRpbmcgZGF0YSBmcm9tIGEgbGFyZ2VyIGdyYXBoIGluc2lkZQogYSBUaW5rZXJHcmFwaC4KIAotQ29uc3RydWN0aW5nIGEgc2ltcGxlIGdyYXBoIHVzaW5nIFRpbmtlckdyYXBoIGluIEphdmE4IGlzIHByZXNlbnRlZCBiZWxvdzoKK0NvbnN0cnVjdGluZyBhIHNpbXBsZSBncmFwaCB1c2luZyBUaW5rZXJHcmFwaCBpbiBKYXZhIGlzIHByZXNlbnRlZCBiZWxvdzoKIAogW3NvdXJjZSxqYXZhXQogLS0tLQpAQCAtMTIxLDYgKzEyMSw3IEBACiB8Z3JlbWxpbi50aW5rZXJncmFwaC5lZGdlSWRNYW5hZ2VyIHxUaGUgYElkTWFuYWdlcmAgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZvciBlZGdlcy4KIHxncmVtbGluLnRpbmtlcmdyYXBoLnZlcnRleFByb3BlcnR5SWRNYW5hZ2VyIHxUaGUgYElkTWFuYWdlcmAgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZvciB2ZXJ0ZXggcHJvcGVydGllcy4KIHxncmVtbGluLnRpbmtlcmdyYXBoLmRlZmF1bHRWZXJ0ZXhQcm9wZXJ0eUNhcmRpbmFsaXR5IHxUaGUgZGVmYXVsdCBgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHlgIHRvIHVzZSB3aGVuIGBWZXJ0ZXgucHJvcGVydHkoayx2KWAgaXMgY2FsbGVkLgorfGdyZW1saW4udGlua2VyZ3JhcGguYWxsb3dOdWxsUHJvcGVydHlWYWx1ZXMgfEEgYm9vbGVhbiB2YWx1ZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgYG51bGxgIHByb3BlcnR5IHZhbHVlcyBhcmUgYWxsb3dlZCBhbmQgZGVmYXVsdHMgdG8gYHRydWVgLgogfGdyZW1saW4udGlua2VyZ3JhcGguZ3JhcGhMb2NhdGlvbiB8VGhlIHBhdGggYW5kIGZpbGUgbmFtZSBmb3Igd2hlcmUgVGlua2VyR3JhcGggc2hvdWxkIHBlcnNpc3QgdGhlIGdyYXBoIGRhdGEuIElmIGEKIHZhbHVlIGlzIHNwZWNpZmllZCBoZXJlLCB0aGUgYGdyZW1saW4udGlua2VyZ3JhcGguZ3JhcGhGb3JtYXRgIHNob3VsZCBhbHNvIGJlIHNwZWNpZmllZC4gIElmIHRoaXMgdmFsdWUgaXMgbm90CiBpbmNsdWRlZCAoZGVmYXVsdCksIHRoZW4gdGhlIGdyYXBoIHdpbGwgc3RheSBpbi1tZW1vcnkgYW5kIG5vdCBiZSBsb2FkZWQvcGVyc2lzdGVkIHRvIGRpc2suCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9yZWZlcmVuY2UvaW50cm8uYXNjaWlkb2MgYi9kb2NzL3NyYy9yZWZlcmVuY2UvaW50cm8uYXNjaWlkb2MKaW5kZXggNTU1YmVhMS4uNTMwZjVhYyAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvcmVmZXJlbmNlL2ludHJvLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3JlZmVyZW5jZS9pbnRyby5hc2NpaWRvYwpAQCAtNDI0LDExICs0MjQsMTMgQEAKIAogVGhlIGZpcnN0IG9mIHRoZXNlIHBvaW50cyBpcyBzZXJpYWxpemF0aW9uLiBXaGVuIEdyZW1saW4gU2VydmVyIHJlY2VpdmVzIGEgcmVxdWVzdCwgdGhlIHJlc3VsdHMgbXVzdCBiZSBzZXJpYWxpemVkIHRvCiB0aGUgZm9ybSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCBhbmQgdGhlbiB0aGUgY2xpZW50IGRlc2VyaWFsaXplcyB0aG9zZSBpbnRvIG9iamVjdHMgbmF0aXZlIHRvIHRoZSBsYW5ndWFnZS4gVGlua2VyUG9wCi1oYXMgdHdvIHN1Y2ggZm9ybWF0cyB0aGF0IGl0IHVzZXMgd2l0aCBsaW5rOmh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy94Lnkuei9kZXYvaW8vI2dyeW9bR3J5b10gYW5kCi1saW5rOmh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy94Lnkuei9kZXYvaW8vI2dyYXBoc29uW0dyYXBoU09OXS4gR3J5byBpcyBhIEpWTS1vbmx5IGZvcm1hdCBhbmQgdGh1cyBjYXJyaWVzIHRoZQotYWR2YW50YWdlIHRoYXQgc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcgb2NjdXJzIG9uIHRoZSBjbGFzc2VzIG5hdGl2ZSB0byB0aGUgSlZNIG9uIGJvdGggdGhlIGNsaWVudCBhbmQgc2VydmVyIHNpZGUuCi1BcyB0aGUgY2xpZW50IGhhcyBmdWxsIGFjY2VzcyB0byB0aGUgc2FtZSBjbGFzc2VzIHRoYXQgdGhlIHNlcnZlciBkb2VzIGl0IGJhc2ljYWxseSBoYXMgYSBmdWxsIEdUTSBvbiBpdHMgb3duIGFuZAotdGhlcmVmb3JlIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBzb21lIHNsaWdodGx5IG1vcmUgYWR2YW5jZWQgdGhpbmdzLgoraGFzIHRocmVlIHN1Y2ggZm9ybWF0cyB0aGF0IGl0IHVzZXMgd2l0aCBsaW5rOmh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy94Lnkuei9kZXYvaW8vI2dyYXBoYmluYXJ5W0dyYXBoQmluYXJ5XSwKK2xpbms6aHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL3gueS56L2Rldi9pby8jZ3J5b1tHcnlvXSBhbmQKK2xpbms6aHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL3gueS56L2Rldi9pby8jZ3JhcGhzb25bR3JhcGhTT05dLiBBbW9uZyB0aGVzZSBzZXJpYWxpemF0aW9uIGZvcm1hdHMsIHVzZXJzCitzaG91bGQgcHJlZmVyIEdyYXBoQmluYXJ5IGFzIGl0IGNvbWJpbmVzIHRoZSBiZXN0IGZlYXR1cmVzIG9mIGJvdGggR3JhcGhTT04gYW5kIEdyeW8gYW5kIGl0IHByb3ZpZGVzIHRoZSBtb3N0IGV2ZW4KK3VzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgZGlmZmVyZW50IHByb2dyYW1taW5nIGxhbmd1YWdlcy4gVGhlcmUgYXJlIGFyZWFzIGhvd2V2ZXIgd2hlcmUgdGhpcyBpcyBub3QgcXVpdGUgdHJ1ZSwgYXMKK0dyZW1saW4gTGFuZ3VhZ2UgVmFyaWFudHMgZG9uJ3QgaGF2ZSBmdWxsIEdUTXMgcHJlc2VudCBhbmQgdGhlcmVmb3JlIGRvbid0IGhhdmUgdGhlIGNvbXBsZXRlIG1lYW5zIHRvIGFjY29tcGxpc2ggd2hhdAorYSBwdXJlIEpWTSBzb2x1dGlvbiB3b3VsZC4KIAogQSBnb29kIGV4YW1wbGUgaXMgdGhlIGBzdWJncmFwaCgpYC1zdGVwIHdoaWNoIHJldHVybnMgYSBgR3JhcGhgIGluc3RhbmNlIGFzIGl0cyByZXN1bHQuIFRoZSBzdWJncmFwaCByZXR1cm5lZCBmcm9tCiB0aGUgc2VydmVyIGNhbiBiZSBkZXNlcmlhbGl6ZWQgaW50byBhbiBhY3R1YWwgYEdyYXBoYCBpbnN0YW5jZSBvbiB0aGUgY2xpZW50LCB3aGljaCB0aGVuIG1lYW5zIGl0IGlzIHBvc3NpYmxlIHRvCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9yZWZlcmVuY2UvdGhlLWdyYXBoY29tcHV0ZXIuYXNjaWlkb2MgYi9kb2NzL3NyYy9yZWZlcmVuY2UvdGhlLWdyYXBoY29tcHV0ZXIuYXNjaWlkb2MKaW5kZXggMjVkYTM1ZS4uZmVjZTAzOSAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvcmVmZXJlbmNlL3RoZS1ncmFwaGNvbXB1dGVyLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3JlZmVyZW5jZS90aGUtZ3JhcGhjb21wdXRlci5hc2NpaWRvYwpAQCAtMzc3LDcgKzM3NywxMiBAQAogLS0tLQogZyA9IHRyYXZlcnNhbCgpLndpdGhFbWJlZGRlZChncmFwaCkud2l0aENvbXB1dGVyKCkKIGcuVigpLnBhZ2VSYW5rKCkuZWxlbWVudE1hcCgpCi1nLlYoKS5wYWdlUmFuaygpLmJ5KCdwYWdlUmFuaycpLnRpbWVzKDUpLm9yZGVyKCkuYnkoJ3BhZ2VSYW5rJykuZWxlbWVudE1hcCgpCitnLlYoKS5wYWdlUmFuaygpLgorICAgICAgICB3aXRoKFBhZ2VSYW5rLnByb3BlcnR5TmFtZSwgJ3BhZ2VSYW5rJykuCisgICAgICAgIHdpdGgoUGFnZVJhbmsudGltZXMsIDUpLgorICBvcmRlcigpLgorICAgIGJ5KCdwYWdlUmFuaycpLgorICBlbGVtZW50TWFwKCkKIC0tLS0KIAogW1twZWVycHJlc3N1cmV2ZXJ0ZXhwcm9ncmFtXV0KQEAgLTM5OSw4ICs0MDQsMTEgQEAKIFtncmVtbGluLWdyb292eSxtb2Rlcm5dCiAtLS0tCiBnID0gdHJhdmVyc2FsKCkud2l0aEVtYmVkZGVkKGdyYXBoKS53aXRoQ29tcHV0ZXIoKQotZy5WKCkucGVlclByZXNzdXJlKCkuYnkoJ2NsdXN0ZXInKS5lbGVtZW50TWFwKCkKLWcuVigpLnBlZXJQcmVzc3VyZSgpLmJ5KG91dEUoJ2tub3dzJykpLmJ5KCdjbHVzdGVyJykuZWxlbWVudE1hcCgpCitnLlYoKS5wZWVyUHJlc3N1cmUoKS53aXRoKFBlZXJQcmVzc3VyZS5wcm9wZXJ0eU5hbWUsICdjbHVzdGVyJykuZWxlbWVudE1hcCgpCitnLlYoKS5wZWVyUHJlc3N1cmUoKS4KKyAgICAgICAgd2l0aChQZWVyUHJlc3N1cmUuZWRnZXMsb3V0RSgna25vd3MnKSkuCisgICAgICAgIHdpdGgoUGVlclByZXNzdXJlLnByb3BlcnR5TmFtZSwgJ2NsdXN0ZXInKS4KKyAgZWxlbWVudE1hcCgpCiAtLS0tCiAKIFtbY29ubmVjdGVkY29tcG9uZW50dmVydGV4cHJvZ3JhbV1dCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9yZWZlcmVuY2UvdGhlLXRyYXZlcnNhbC5hc2NpaWRvYyBiL2RvY3Mvc3JjL3JlZmVyZW5jZS90aGUtdHJhdmVyc2FsLmFzY2lpZG9jCmluZGV4IDRjNTZlNDUuLjRkYmY2ZDUgMTAwNjQ0Ci0tLSBhL2RvY3Mvc3JjL3JlZmVyZW5jZS90aGUtdHJhdmVyc2FsLmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3JlZmVyZW5jZS90aGUtdHJhdmVyc2FsLmFzY2lpZG9jCkBAIC04MDksOSArODA5LDEyIEBACiBnLlYoKS52YWx1ZXMoJ2xhbmcnKQogZy5WKCkudmFsdWVzKCdsYW5nJykuZGVkdXAoKQogZy5WKDEpLnJlcGVhdChib3RoRSgnY3JlYXRlZCcpLmRlZHVwKCkub3RoZXJWKCkpLmVtaXQoKS5wYXRoKCkgPDE+CitnLlYoKS5ib3RoRSgpLnByb3BlcnRpZXMoKS5kZWR1cCgpIDwyPgogLS0tLQogCiA8MT4gVHJhdmVyc2UgYWxsIGBjcmVhdGVkYCBlZGdlcywgYnV0IGRvbid0IHRvdWNoIGFueSBlZGdlIHR3aWNlLgorPDI+IE5vdGUgdGhhdCBgUHJvcGVydHlgIGluc3RhbmNlcyB3aWxsIGNvbXBhcmUgb24ga2V5IGFuZCB2YWx1ZSwgd2hlcmVhcyBhIGBWZXJ0ZXhQcm9wZXJ0eWAgd2lsbCBhbHNvIGluY2x1ZGUgaXRzCitlbGVtZW50IGFzIGl0IGlzIGEgZmlyc3QtY2xhc3MgY2l0aXplbi4KIAogSWYgYSBieS1zdGVwIG1vZHVsYXRpb24gaXMgcHJvdmlkZWQgdG8gYGRlZHVwKClgLCB0aGVuIHRoZSBvYmplY3QgaXMgcHJvY2Vzc2VkIGFjY29yZGluZ2x5IHByaW9yIHRvIGRldGVybWluaW5nIGlmIGl0CiBoYXMgYmVlbiBzZWVuIG9yIG5vdC4KQEAgLTIxMDgsMTQgKzIxMTEsMTYgQEAKIFtbcGFnZXJhbmstc3RlcF1dCiA9PT0gUGFnZVJhbmsgU3RlcAogCi1UaGUgYHBhZ2VSYW5rKClgLXN0ZXAgKCptYXAqLypzaWRlRWZmZWN0KikgY2FsY3VsYXRlcyBsaW5rOmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFnZVJhbmtbUGFnZVJhbmtdIHVzaW5nIDw8cGFnZXJhbmt2ZXJ0ZXhwcm9ncmFtLGBQYWdlUmFua1ZlcnRleFByb2dyYW1gPj4uCitUaGUgYHBhZ2VSYW5rKClgLXN0ZXAgKCptYXAqLypzaWRlRWZmZWN0KikgY2FsY3VsYXRlcyBsaW5rOmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFnZVJhbmtbUGFnZVJhbmtdIHVzaW5nCis8PHBhZ2VyYW5rdmVydGV4cHJvZ3JhbSxgUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtYD4+LgogCi1JTVBPUlRBTlQ6IFRoZSBgcGFnZVJhbmsoKWAtc3RlcCBpcyBhIGBWZXJ0ZXhDb21wdXRpbmdgLXN0ZXAgYW5kIGFzIHN1Y2gsIGNhbiBvbmx5IGJlIHVzZWQgYWdhaW5zdCBhIGdyYXBoIHRoYXQgc3VwcG9ydHMgYEdyYXBoQ29tcHV0ZXJgIChPTEFQKS4KK0lNUE9SVEFOVDogVGhlIGBwYWdlUmFuaygpYC1zdGVwIGlzIGEgYFZlcnRleENvbXB1dGluZ2Atc3RlcCBhbmQgYXMgc3VjaCwgY2FuIG9ubHkgYmUgdXNlZCBhZ2FpbnN0IGEgZ3JhcGggdGhhdAorc3VwcG9ydHMgYEdyYXBoQ29tcHV0ZXJgIChPTEFQKS4KIAogW2dyZW1saW4tZ3Jvb3Z5LG1vZGVybl0KIC0tLS0KIGcgPSB0cmF2ZXJzYWwoKS53aXRoRW1iZWRkZWQoZ3JhcGgpLndpdGhDb21wdXRlcigpCi1nLlYoKS5wYWdlUmFuaygpLmJ5KCdwYWdlUmFuaycpLnZhbHVlcygncGFnZVJhbmsnKQorZy5WKCkucGFnZVJhbmsoKS53aXRoKFBhZ2VSYW5rLnByb3BlcnR5TmFtZSwgJ2ZyaWVuZFJhbmsnKS52YWx1ZXMoJ3BhZ2VSYW5rJykKIGcuVigpLmhhc0xhYmVsKCdwZXJzb24nKS4KICAgcGFnZVJhbmsoKS4KICAgICB3aXRoKFBhZ2VSYW5rLmVkZ2VzLCBfXy5vdXRFKCdrbm93cycpKS4KQEAgLTIxMjcsNyArMjEzMiw4IEBACiBOb3RlIHRoZSB1c2Ugb2YgdGhlIGB3aXRoKClgIG1vZHVsYXRpbmcgc3RlcCB3aGljaCBwcm92aWRlcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIGFsZ29yaXRobS4gSXQgdGFrZXMKIGNvbmZpZ3VyYXRpb24ga2V5cyBmcm9tIHRoZSBgUGFnZVJhbmtgIGFuZCBpcyBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIHRvIHRoZSBHcmVtbGluIENvbnNvbGUuCiAKLVRoZSA8PGV4cGxhaW4tc3RlcCxgZXhwbGFpbigpYD4+LXN0ZXAgY2FuIGJlIHVzZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHRyYXZlcnNhbCBpcyBjb21waWxlZCBpbnRvIG11bHRpcGxlIGBHcmFwaENvbXB1dGVyYCBqb2JzLgorVGhlIDw8ZXhwbGFpbi1zdGVwLGBleHBsYWluKClgPj4tc3RlcCBjYW4gYmUgdXNlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdHJhdmVyc2FsIGlzIGNvbXBpbGVkIGludG8gbXVsdGlwbGUKK2BHcmFwaENvbXB1dGVyYCBqb2JzLgogCiBbZ3JlbWxpbi1ncm9vdnksbW9kZXJuXQogLS0tLQpAQCAtMjI1MCw3ICsyMjU2LDcgQEAKIFtncmVtbGluLWdyb292eSxtb2Rlcm5dCiAtLS0tCiBnID0gdHJhdmVyc2FsKCkud2l0aEVtYmVkZGVkKGdyYXBoKS53aXRoQ29tcHV0ZXIoKQotZy5WKCkucGVlclByZXNzdXJlKCkuYnkoJ2NsdXN0ZXInKS52YWx1ZXMoJ2NsdXN0ZXInKQorZy5WKCkucGVlclByZXNzdXJlKCkud2l0aChQZWVyUHJlc3N1cmUucHJvcGVydHlOYW1lLCAnY2x1c3RlcicpLnZhbHVlcygnY2x1c3RlcicpCiBnLlYoKS5oYXNMYWJlbCgncGVyc29uJykuCiAgIHBlZXJQcmVzc3VyZSgpLgogICAgIHdpdGgoUGVlclByZXNzdXJlLnByb3BlcnR5TmFtZSwgJ2NsdXN0ZXInKS4KQEAgLTQwNzUsNiArNDA4MSw0NCBAQAogRGlzcGxheSBzdGFjayB0cmFjZT8gW3lOXQogLS0tLQogCis9PT0gU2VlZFN0cmF0ZWd5CisKK1RoZXJlIGFyZSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgR3JlbWxpbiBsYW5ndWFnZSB0aGF0LCBieSBkZXNpZ24sIGNhbiBwcm9kdWNlIG5vbi1kZXRlcm1pbmlzdGljIHJlc3VsdHM6CisKKyogPDxjb2luLXN0ZXAsY29pbigpPj4KKyogPDxvcmRlci1zdGVwLG9yZGVyKCk+PiB3aGVuIGBPcmRlci5zaHVmZmxlYCBpcyB1c2VkCisqIDw8c2FtcGxlLXN0ZXAsc2FtcGxlKCk+PgorCitUbyBnZXQgdGhlc2Ugc3RlcHMgdG8gcmV0dXJuIGRldGVybWluaXN0aWMgcmVzdWx0cywgYFNlZWRTdHJhdGVneWAgYWxsb3dzIGFzc2lnbm1lbnQgb2YgYSBzZWVkIHZhbHVlIHRvIHRoZSBgUmFuZG9tYAorb3BlcmF0aW9ucyBvZiB0aGUgc3RlcHMuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHJhbmRvbSBuYXR1cmUgb2YgYHNodWZmbGVgOgorCitbZ3JlbWxpbi1ncm9vdnksbW9kZXJuXQorLS0tLQorZy5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorZy5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorZy5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorZy5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorZy5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorLS0tLQorCitXaXRoIGBTZWVkU3RyYXRlZ3lgIGluIHBsYWNlLCBob3dldmVyLCB0aGUgc2FtZSBvcmRlciBpcyBhcHBsaWVkIGVhY2ggdGltZToKKworW2dyZW1saW4tZ3Jvb3Z5LG1vZGVybl0KKy0tLS0KK3NlZWRTdHJhdGVneSA9IG5ldyBTZWVkU3RyYXRlZ3koOTk5OTk4TCkKK2cud2l0aFN0cmF0ZWdpZXMoc2VlZFN0cmF0ZWd5KS5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorZy53aXRoU3RyYXRlZ2llcyhzZWVkU3RyYXRlZ3kpLlYoKS52YWx1ZXMoJ25hbWUnKS5mb2xkKCkub3JkZXIobG9jYWwpLmJ5KHNodWZmbGUpCitnLndpdGhTdHJhdGVnaWVzKHNlZWRTdHJhdGVneSkuVigpLnZhbHVlcygnbmFtZScpLmZvbGQoKS5vcmRlcihsb2NhbCkuYnkoc2h1ZmZsZSkKK2cud2l0aFN0cmF0ZWdpZXMoc2VlZFN0cmF0ZWd5KS5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorZy53aXRoU3RyYXRlZ2llcyhzZWVkU3RyYXRlZ3kpLlYoKS52YWx1ZXMoJ25hbWUnKS5mb2xkKCkub3JkZXIobG9jYWwpLmJ5KHNodWZmbGUpCistLS0tCisKK0lNUE9SVEFOVDogYFNlZWRTdHJhdGVneWAgb25seSBtYWtlcyBzcGVjaWZpYyBzdGVwcyBiZWhhdmUgaW4gYSBkZXRlcm1pbmlzdGljIGZhc2hpb24gYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1ha2UKK3RoZSBlbnRpcmUgdHJhdmVyc2FsIGRldGVybWluaXN0aWMgaXRzZWxmLiBJZiB0aGUgdW5kZXJseWluZyBncmFwaCBkYXRhYmFzZSBvciBwcm9jZXNzaW5nIGVuZ2luZSBoYXBwZW5zIHRvIG5vdAorZ3VhcmFudGVlIGl0ZXJhdGlvbiBvcmRlciwgdGhlbiBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBmaW5hbCByZXN1bHQgb2YgdGhlIHRyYXZlcnNhbCB3aWxsIGFwcGVhciB0byBiZQorbm9uLWRldGVybWluaXN0aWMuIEluIHRoZXNlIGNhc2VzLCBpdCB3b3VsZCBiZSBuZWNlc3NhcnkgdG8gZW5mb3JjZSBhIGRldGVybWluaXN0aWMgaXRlcmF0aW9uIHdpdGggYG9yZGVyKClgIHByaW9yIHRvCit0aGVzZSBzdGVwcyB0aGF0IG1ha2UgdXNlIG9mIHJhbmRvbW5lc3MgdG8gcmV0dXJuIHJlc3VsdHMuCisKID09PSBTdWJncmFwaFN0cmF0ZWd5CiAKIGBTdWJncmFwaFN0cmF0ZWd5YCBpcyBzaW1pbGFyIHRvIGBQYXJ0aXRpb25TdHJhdGVneWAgaW4gdGhhdCBpdCBjb25zdHJhaW5zIGEgYFRyYXZlcnNhbGAgdG8gY2VydGFpbiB2ZXJ0aWNlcywgZWRnZXMsCmRpZmYgLS1naXQgYS9kb2NzL3NyYy90dXRvcmlhbHMvZ3JlbWxpbi1sYW5ndWFnZS12YXJpYW50cy9pbmRleC5hc2NpaWRvYyBiL2RvY3Mvc3JjL3R1dG9yaWFscy9ncmVtbGluLWxhbmd1YWdlLXZhcmlhbnRzL2luZGV4LmFzY2lpZG9jCmluZGV4IGVmOGNkMzYuLjM5ZmEwNGYgMTAwNjQ0Ci0tLSBhL2RvY3Mvc3JjL3R1dG9yaWFscy9ncmVtbGluLWxhbmd1YWdlLXZhcmlhbnRzL2luZGV4LmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3R1dG9yaWFscy9ncmVtbGluLWxhbmd1YWdlLXZhcmlhbnRzL2luZGV4LmFzY2lpZG9jCkBAIC01NDIsMTAgKzU0Miw2IEBACiBbSU5GT10gVHJhdmVyc2FsT3BQcm9jZXNzb3IgLSBJbml0aWFsaXplZCBjYWNoZSBmb3IgVHJhdmVyc2FsT3BQcm9jZXNzb3Igd2l0aCBzaXplIDEwMDAgYW5kIGV4cGlyYXRpb24gdGltZSBvZiA2MDAwMDAgbXMKIFtJTkZPXSBHcmVtbGluU2VydmVyIC0gRXhlY3V0aW5nIHN0YXJ0IHVwIExpZmVDeWNsZUhvb2sKIFtJTkZPXSBMb2dnZXIkaW5mbyAtIEV4ZWN1dGVkIG9uY2UgYXQgc3RhcnR1cCBvZiBHcmVtbGluIFNlcnZlci4KLVtXQVJOXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gVGhlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwIHNlcmlhbGl6YXRpb24gY2xhc3MgaXMgZGVwcmVjYXRlZC4KLVtJTkZPXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gQ29uZmlndXJlZCBhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2dyeW8gd2l0aCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMAotW1dBUk5dIEFic3RyYWN0Q2hhbm5lbGl6ZXIgLSBUaGUgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAgc2VyaWFsaXphdGlvbiBjbGFzcyBpcyBkZXByZWNhdGVkLgotW0lORk9dIEFic3RyYWN0Q2hhbm5lbGl6ZXIgLSBDb25maWd1cmVkIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5by1zdHJpbmdkIHdpdGggb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAKIFtJTkZPXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gQ29uZmlndXJlZCBhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2pzb24gd2l0aCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYzZDAKIFtJTkZPXSBBYnN0cmFjdENoYW5uZWxpemVyIC0gQ29uZmlndXJlZCBhcHBsaWNhdGlvbi9qc29uIHdpdGggb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwCiBbSU5GT10gQWJzdHJhY3RDaGFubmVsaXplciAtIENvbmZpZ3VyZWQgYXBwbGljYXRpb24vdm5kLmdyYXBoYmluYXJ5LXYxLjAgd2l0aCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxCmRpZmYgLS1naXQgYS9kb2NzL3NyYy90dXRvcmlhbHMvdGhlLWdyZW1saW4tY29uc29sZS9pbmRleC5hc2NpaWRvYyBiL2RvY3Mvc3JjL3R1dG9yaWFscy90aGUtZ3JlbWxpbi1jb25zb2xlL2luZGV4LmFzY2lpZG9jCmluZGV4IGM0ZDA4ZjMuLmFkMDQ2MDcgMTAwNjQ0Ci0tLSBhL2RvY3Mvc3JjL3R1dG9yaWFscy90aGUtZ3JlbWxpbi1jb25zb2xlL2luZGV4LmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3R1dG9yaWFscy90aGUtZ3JlbWxpbi1jb25zb2xlL2luZGV4LmFzY2lpZG9jCkBAIC01NzEsOSArNTcxLDkgQEAKIGdyZW1saW4+IDppbnN0YWxsIGNvbS5kYXRhc3RheC5jYXNzYW5kcmEgY2Fzc2FuZHJhLWRyaXZlci1jb3JlIDIuMS45CiA9PT5Mb2FkZWQ6IFtjb20uZGF0YXN0YXguY2Fzc2FuZHJhLCBjYXNzYW5kcmEtZHJpdmVyLWNvcmUsIDIuMS45XQogZ3JlbWxpbj4gaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS4qCi09PT5ncm9vdnkuZ3JhcGUuR3JhcGUsIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLiosIC4uLiwgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLioKKz09Pmdyb292eS5ncmFwZS5HcmFwZSwgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLiosIC4uLiwgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLioKIGdyZW1saW4+IGltcG9ydCBzdGF0aWMgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnF1ZXJ5YnVpbGRlci5RdWVyeUJ1aWxkZXIuKgotPT0+Z3Jvb3Z5LmdyYXBlLkdyYXBlLCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi4qLCAuLi4sIHN0YXRpYyBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUucXVlcnlidWlsZGVyLlF1ZXJ5QnVpbGRlci4qCis9PT5ncm9vdnkuZ3JhcGUuR3JhcGUsIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi4qLCAuLi4sIHN0YXRpYyBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUucXVlcnlidWlsZGVyLlF1ZXJ5QnVpbGRlci4qCiBncmVtbGluPiBjbHVzdGVyID0gY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXIuYnVpbGRlcigpLmFkZENvbnRhY3RQb2ludCgibG9jYWxob3N0IikuYnVpbGQoKQogPT0+Y29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXJAM2UxNjI0YzcKIGdyZW1saW4+IHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKQpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvdXBncmFkZS9hcHBlbmRpeC5hc2NpaWRvYyBiL2RvY3Mvc3JjL3VwZ3JhZGUvYXBwZW5kaXguYXNjaWlkb2MKaW5kZXggYTlkZjBlNC4uN2NlNWIyMiAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvdXBncmFkZS9hcHBlbmRpeC5hc2NpaWRvYworKysgYi9kb2NzL3NyYy91cGdyYWRlL2FwcGVuZGl4LmFzY2lpZG9jCkBAIC0yNCw4ICsyNCw4IEBACiAKIE9uZSBvZiB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBUaW5rZXJQb3AgMi54IGFuZCBUaW5rZXJQb3AgMy54IGlzIHRoYXQgaW4gVGlua2VyUG9wIDMueCwgdGhlIEphdmEgY29udmVudGlvbiBvZgogdXNpbmcgc2V0dGVycyBhbmQgZ2V0dGVycyB3YXMgYWJhbmRvbmVkIGluIGZhdm9yIG9mIGEgc3ludGF4IHRoYXQgaXMgbW9yZSBhbGlnbmVkIHdpdGggdGhlIHN5bnRheCBvZiBHcmVtbGluLUdyb292eSBpbgotVGlua2VyUG9wMi4gR2l2ZW4gdGhhdCBHcmVtbGluLUphdmE4IGFuZCBHcmVtbGluLUdyb292eSBhcmUgbmVhcmx5IGlkZW50aWNhbCBkdWUgdG8gdGhlIGluY2x1c2lvbiBvZiBKYXZhIDggbGFtYmRhcywgYQotYmlnIGVmZm9ydCB3YXMgbWFkZSB0byBlbnN1cmUgdGhhdCBib3RoIGxhbmd1YWdlcyB3ZXJlIGFzIHNpbWlsYXIgYXMgcG9zc2libGUuCitUaW5rZXJQb3AyLiBHaXZlbiB0aGF0IEdyZW1saW4tSmF2YSBhbmQgR3JlbWxpbi1Hcm9vdnkgYXJlIG5lYXJseSBpZGVudGljYWwgZHVlIHRvIHRoZSBpbmNsdXNpb24gb2YgbGFtYmRhcyBmcm9tCitKYXZhIDgsIGEgYmlnIGVmZm9ydCB3YXMgbWFkZSB0byBlbnN1cmUgdGhhdCBib3RoIGxhbmd1YWdlcyB3ZXJlIGFzIHNpbWlsYXIgYXMgcG9zc2libGUuCiAKIEluIGFkZGl0aW9uLCBUaW5rZXJQb3AyIGFuZCBiZWxvdyBtYWRlIGEgc2hhcnAgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgdmFyaW91cyBUaW5rZXJQb3AgcHJvamVjdHM6IEJsdWVwcmludHMsIFBpcGVzLAogR3JlbWxpbiwgRnJhbWVzLCBGdXJuYWNlLCBhbmQgUmV4c3Rlci4gV2l0aCBUaW5rZXJQb3AgMy54LCBhbGwgb2YgdGhlc2UgcHJvamVjdHMgaGF2ZSBiZWVuIG1lcmdlZCBhbmQgYXJlIGdlbmVyYWxseQpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvdXBncmFkZS9pbmRleC5hc2NpaWRvYyBiL2RvY3Mvc3JjL3VwZ3JhZGUvaW5kZXguYXNjaWlkb2MKaW5kZXggYTJiZjIwZi4uOGU3OGY0ZiAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvdXBncmFkZS9pbmRleC5hc2NpaWRvYworKysgYi9kb2NzL3NyYy91cGdyYWRlL2luZGV4LmFzY2lpZG9jCkBAIC0zNCw2ICszNCw4IEBACiAq4oCCR3JhcGggTGFuZ3VhZ2UgUHJvdmlkZXIKICogR3JhcGggUGx1Z2luIFByb3ZpZGVyCiAKK2luY2x1ZGU6OnJlbGVhc2UtMy41LnguYXNjaWlkb2NbXQorCiBpbmNsdWRlOjpyZWxlYXNlLTMuNC54LmFzY2lpZG9jW10KIAogaW5jbHVkZTo6cmVsZWFzZS0zLjMueC5hc2NpaWRvY1tdCmRpZmYgLS1naXQgYS9kb2NzL3NyYy91cGdyYWRlL3JlbGVhc2UtMy40LnguYXNjaWlkb2MgYi9kb2NzL3NyYy91cGdyYWRlL3JlbGVhc2UtMy40LnguYXNjaWlkb2MKaW5kZXggOTM1OWUwNy4uNjdlODA0OCAxMDA2NDQKLS0tIGEvZG9jcy9zcmMvdXBncmFkZS9yZWxlYXNlLTMuNC54LmFzY2lpZG9jCisrKyBiL2RvY3Mvc3JjL3VwZ3JhZGUvcmVsZWFzZS0zLjQueC5hc2NpaWRvYwpAQCAtMTUsNiArMTUsMTUgQEAKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8vLwogCis9PSBUaW5rZXJQb3AgMy41LjAKKworPT09IFVwZ3JhZGluZyBmb3IgVXNlcnMKKworPT09PSBVcGdyYWRlIE5lbzRqCisKK1JlZmVyIHRvIE5lbzRqIGxpbms6aHR0cHM6Ly9uZW80ai5jb20vZ3VpZGVzL3VwZ3JhZGUtYXJjaGl2ZS9bMy40IFVwZ3JhZGUgRkFRXSBmb3IgZ3VpZGUgb24gaG93IHRvIHVwZ3JhZGUgZnJvbSB0aGUgcHJldmlvdXMgMy4yLjMgdmVyc2lvbi4KK0ZvciBleGFtcGxlLCBjb25maWd1cmF0aW9uIHNldHRpbmcgYGRibXMuYWxsb3dfZm9ybWF0X21pZ3JhdGlvbmAgaXMgbm93IGBkYm1zLmFsbG93X3VwZ3JhZGVgLgorCiA9IFRpbmtlclBvcCAzLjQuMAogCiBpbWFnZTo6aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwYWNoZS90aW5rZXJwb3AvbWFzdGVyL2RvY3Mvc3RhdGljL2ltYWdlcy9hdmFudC1ncmVtbGluLnBuZ1t3aWR0aD0yMjVdCmRpZmYgLS1naXQgYS9kb2NzL3NyYy91cGdyYWRlL3JlbGVhc2UtMy41LnguYXNjaWlkb2MgYi9kb2NzL3NyYy91cGdyYWRlL3JlbGVhc2UtMy41LnguYXNjaWlkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmMDliNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL3VwZ3JhZGUvcmVsZWFzZS0zLjUueC5hc2NpaWRvYwpAQCAtMCwwICsxLDc0OSBAQAorLy8vLworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLy8vCisKKz0gVGlua2VyUG9wIDMuNS4wCisKK2ltYWdlOjpodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RpbmtlcnBvcC9tYXN0ZXIvZG9jcy9zdGF0aWMvaW1hZ2VzL2dyZW1saW4tc2xlZXBpbmctYmVhdXR5LnBuZ1t3aWR0aD0yMjVdCisKKypUaGUgU2xlZXBpbmcgR3JlbWxpbjogTm8uIDE4IEVudHInYWN0ZSBzeW1waG9uaXF1ZSoKKworPT0gVGlua2VyUG9wIDMuNS4wCisKKypSZWxlYXNlIERhdGU6IE5PVCBPRkZJQ0lBTExZIFJFTEVBU0VEIFlFVCoKKworUGxlYXNlIHNlZSB0aGUgbGluazpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RpbmtlcnBvcC9ibG9iLzMuNS4wL0NIQU5HRUxPRy5hc2NpaWRvYyNyZWxlYXNlLTMtNS0wW2NoYW5nZWxvZ10gZm9yIGEgY29tcGxldGUgbGlzdCBvZiBhbGwgdGhlIG1vZGlmaWNhdGlvbnMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHJlbGVhc2UuCisKKz09PSBVcGdyYWRpbmcgZm9yIFVzZXJzCisKKz09PT0gSmF2YSAxMQorCitUaW5rZXJQb3Agbm93IGJ1aWxkcyBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIEphdmEgMTEuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMDc2W1RJTktFUlBPUC0yMDc2XQorCis9PT09IEFub255bW91cyBDaGlsZCBUcmF2ZXJzYWxzCisKK1RpbmtlclBvcCBjb252ZW50aW9ucyBmb3IgY2hpbGQgdHJhdmVyc2FscyBpcyB0byBzcGF3biB0aGVtIGFub255bW91c2x5IGZyb20gYF9fYCwgdGhlcmVmb3JlOgorCitbc291cmNlLGdyb292eV0KK2cuYWRkVigncGVyc29uJykuYWRkRSgnc2VsZicpLnRvKF9fLlYoMSkpCisKK29yIG1vcmUgc3VjY2luY3RseSB2aWEgc3RhdGljIGltcG9ydCBhczoKKworW3NvdXJjZSxncm9vdnldCitnLmFkZFYoJ3BlcnNvbicpLmFkZEUoJ3NlbGYnKS50byhWKDEpKQorCitTb21lIHVzZXJzIGhhdmUgY2hvc2VuIHRvIGluc3RlYWQgd3JpdGUgdGhlIGFib3ZlIGFzOgorCitbc291cmNlLGdyb292eV0KK2cuYWRkVigncGVyc29uJykuYWRkRSgnc2VsZicpLnRvKGcuVigxKSkKKword2hpY2ggc3Bhd25zIGEgY2hpbGQgdHJhdmVyc2FsIGZyb20gYSBgR3JhcGhUcmF2ZXJzYWxTb3VyY2VgLiBXaGVuIHNwYXduZWQgdGhpcyB3YXksIGEgdHJhdmVyc2FsIGlzIGJvdW5kIHRvIGEgInNvdXJjZSIKK2FuZCB0aGVyZWZvcmUgaXMgbm90IGFub255bW91cy4gV2hpbGUgdGhlIGFib3ZlIGNvZGUgd29ya2VkLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVyZSBiZSBsZXNzIHdheXMgdG8gZG8gdGhpbmdzCit3aXRoIEdyZW1saW4gc28gYXMgdG8gYXZvaWQgY29uZnVzaW9uIGluIGV4YW1wbGVzLCBkb2N1bWVudGF0aW9ucyBhbmQgbWFpbGluZyBsaXN0IGFuc3dlcnMuCisKK0FzIG9mIDMuNS4wLCBhdHRlbXB0aW5nIHRvIHVzZSBhIHRyYXZlcnNhbCBzcGF3bmVkIGZyb20gYSAic291cmNlIiB3aWxsIHJlc3VsdCBpbiBhbiBleGNlcHRpb24uIFVzZXJzIHdpbGwgbmVlZCB0bworbW9kaWZ5IHRoZWlyIGNvZGUgaWYgdGhleSB1c2UgdGhlIHVuY29udmVudGlvbmFsIHN5bnRheC4KKworbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMzYxW1RJTktFUlBPUC0yMzYxXQorCis9PT09IEdyeW8gVXNhZ2UKKworU2luY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgVGlua2VyUG9wIDMueCwgR3J5byBoYXMgYmVlbiB0aGUgZGVmYXVsdCBzZXJpYWxpemF0aW9uIGZvcm1hdCBmb3IgR3JlbWxpbiBTZXJ2ZXIgYW5kCitKYXZhIERyaXZlci4gSXQgd2FzIGFsc28gdXNlZCBhcyB0aGUgZGVmYXVsdCBzZXJpYWxpemF0aW9uIGZvcm1hdCBmb3IgR3JlbWxpbiBDb25zb2xlIHJlbW90ZSBjb25uZWN0aXZpdHkgdG8gR3JlbWxpbgorU2VydmVyLiBBcyBvZiB0aGlzIHJlbGVhc2UsIEdyeW8gaGFzIGJlZW4gcmVwbGFjZWQgYXMgdGhlIGRlZmF1bHQgYnkgR3JhcGhCaW5hcnkuIEFsbCBwYWNrYWdlZCBjb25maWd1cmF0aW9uIGZpbGVzCithbmQgcHJvZ3JhbW1hdGljIGRlZmF1bHRzIGhhdmUgYmVlbiBtb2RpZmllZCBhcyBzdWNoLgorCitJdCBpcyBzdGlsbCBwb3NzaWJsZSB0byB1dGlsaXplIEdyeW8gYXMgYSBtZXNzYWdlIHNlcmlhbGl6YXRpb24gZm9ybWF0IGJ5IG1vZGlmeWluZyBHcmVtbGluIFNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzCit0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBHcnlvIGNvbmZpZ3VyYXRpb25zLiBJZiB1c2luZyBHcnlvLCBkbyBub3QgdXNlciBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgYW5kIHNlcnZlcgord2l0aCAzLjUuMC4gVXNlIGEgMy41LjAgY2xpZW50IHRvIGNvbm5lY3QgdG8gYSAzLjUuMCBzZXJ2ZXIuIEdlbmVyYWxseSBzcGVha2luZywgbWl4ZWQgdmVyc2lvbiBjb21iaW5hdGlvbnMgd2lsbAorYXBwZWFyIHRvIHdvcmsgcHJvcGVybHksIGJ1dCBwcm9ibGVtcyB3aWxsIGxpa2VseSBvY2N1ciBkdXJpbmcgZ2VuZXJhbCBjb3Vyc2Ugb2YgdXNhZ2UgYW5kIGl0IGlzIHRoZXJlZm9yZSBub3QKK2FkdmlzYWJsZSB0byB0YWtlIHRoaXMgYXBwcm9hY2guCisKK0ZvciBiZXN0IGNvbXBhdGliaWxpdHkgYmV0d2VlbiAzLjQueCBhbmQgMy41LngsIHBsZWFzZSB1c2UgR3JhcGhCaW5hcnkuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMjU5W1RJTktFUlBPUC0yMjU5XQorCis9PT09IENvbmZpZ3VyYXRpb24gVXBncmFkZQorCitUaGVyZSBpcyBhIG1ham9yIGJyZWFraW5nIGNoYW5nZSBpbiB0aGUgdXNlIG9mIGBDb25maWd1cmF0aW9uYCBvYmplY3RzLiBQcmlvciB0byAzLjUuMCwgYENvbmZpZ3VyYXRpb25gIG9iamVjdHMgd2VyZQorZnJvbSB0aGUgQXBhY2hlIENvbW1vbnMgYGNvbW1vbnMtY29uZmlndXJhdGlvbmAgbGlicmFyeSwgYnV0IGluIHRoaXMgdmVyc2lvbiwgdGhleSBhcmUgb2YgYGNvbW1vbnMtY29uZmlndXJhdGlvbjJgLgorV2hpbGUgdGhpcyBpcyBhIGJyZWFraW5nIGNoYW5nZSwgdGhlIGZpeCBmb3IgbW9zdCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBiZSBxdWl0ZSBzaW1wbGUsIFNpbXBseSwgY2hhbmdlIHRoZSBpbXBvcnQKK3N0YXRlbWVudHMgZnJvbToKKworW3NvdXJjZSx0ZXh0XQorLS0tLQorb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uKgorLS0tLQorCit0bworCitbc291cmNlLHRleHRdCistLS0tCitvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuKgorLS0tLQorCitJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IGRlZmF1bHQgbGlzdCBoYW5kbGluZyBpbiBjb25maWd1cmF0aW9ucyBpcyB0cmVhdGVkIGRpZmZlcmVudGx5LiBUaW5rZXJQb3AgbGFyZ2VseQorZGlzYWJsZWQgdGhlIGRlZmF1bHQgbGlzdCBoYW5kbGluZyBhcHByb2FjaCBpbiBgQ29uZmlndXJhdGlvbmAgMS54LCBidXQgaWYgdGhhdCBmdW5jdGlvbmFsaXR5IGlzIHN0aWxsIG5lZWRlZCwgaXQgY2FuCitiZSByZWNsYWltZWQgYnkgc2V0dGluZyB0aGUgYExlZ2FjeUxpc3REZWxpbWl0ZXJIYW5kbGVyYCAtIGRldGFpbHMgZm9yIGRvaW5nIHRha2luZyB0aGlzIHN0ZXAgYW5kIG90aGVyIHJlbGV2YW50Cit1cGdyYWRlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgbGluazpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1jb25maWd1cmF0aW9uL3VzZXJndWlkZS91cGdyYWRldG8yXzAuaHRtbFsyLnggVXBncmFkZSBEb2N1bWVudGF0aW9uXS4KKworU2VlOiBsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIxODVbVElOS0VSUE9QLTIxODVdCisKKz09PT0gVXNlIG9mIG51bGwKKworR3JlbWxpbiBoYXMgdHJhZGl0aW9uYWxseSBkaXNhbGxvd2VkIGBudWxsYCBhcyBhIHZhbHVlIGluIHRyYXZlcnNhbHMgYW5kIG5vdCBhbHdheXMgaW4gY29uc2lzdGVudCB3YXlzOgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLmluamVjdCgxLCBudWxsLCBudWxsLCAyLCBudWxsKQoramF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCitUeXBlICc6aGVscCcgb3IgJzpoJyBmb3IgaGVscC4KK0Rpc3BsYXkgc3RhY2sgdHJhY2U/IFt5Tl1uCitncmVtbGluPiBnLlYoKS5oYXMoJ3BlcnNvbicsJ25hbWUnLCdtYXJrbycpLnByb3BlcnR5KCdhZ2UnLCBudWxsKQorVGhlIEFkZFByb3BlcnR5U3RlcCBkb2VzIG5vdCBoYXZlIGEgcHJvdmlkZWQgdmFsdWU6IEFkZFByb3BlcnR5U3RlcCh7a2V5PVthZ2VdfSkKK1R5cGUgJzpoZWxwJyBvciAnOmgnIGZvciBoZWxwLgorRGlzcGxheSBzdGFjayB0cmFjZT8gW3lOXQorZ3JlbWxpbj4gZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgibmFtZSIsICdzdGVwaGVuJykucHJvcGVydHkoImFnZSIsIG51bGwpCis9PT52WzEzXQorZ3JlbWxpbj4gZy5WKCkuaGFzKCdwZXJzb24nLCduYW1lJywnc3RlcGhlbicpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjEzLGxhYmVsOnBlcnNvbixuYW1lOnN0ZXBoZW5dCitncmVtbGluPiBnLlYoKS5jb25zdGFudChudWxsKQorZ3JlbWxpbj4KKy0tLS0KKworTm90ZSBob3cgYG51bGxgIGNhbiBwcm9kdWNlIGV4Y2VwdGlvbiBiZWhhdmlvciBvciBhY3QgYXMgYSBmaWx0ZXIuIEZvciAzLjUuMCwgVGlua2VyUG9wIGhhcyBub3Qgb25seSBtYWRlIGBudWxsYCB1c2FnZQorY29uc2lzdGVudCwgYnV0IGhhcyBhbHNvIG1hZGUgaXQgYW4gYWxsb3dhYmxlIHZhbHVlIHdpdGhpbiBhIGBUcmF2ZXJzYWxgOgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLmluamVjdCgxLCBudWxsLCBudWxsLCAyLCBudWxsKQorPT0+MQorPT0+bnVsbAorPT0+bnVsbAorPT0+bnVsbAorPT0+MgorZ3JlbWxpbj4gZy5WKCkuY29uc3RhbnQobnVsbCkKKz09Pm51bGwKKz09Pm51bGwKKz09Pm51bGwKKz09Pm51bGwKKz09Pm51bGwKKz09Pm51bGwKKy0tLS0KKworVGlua2VyR3JhcGggY2FuIGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBgbnVsbGAgYXMgYSBwcm9wZXJ0eSB2YWx1ZSBhbmQgYWxsIGdyYXBocyBtYXkgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIChmb3IKK2V4YW1wbGUsIE5lbzRqIGRvZXMgbm90KS4gUGxlYXNlIGJlIHN1cmUgdG8gY2hlY2sgdGhlIG5ldyBgc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKWAgZmVhdHVyZSAob3IgdGhlIGRvY3VtZW50YXRpb24KK29mIHRoZSBncmFwaCBwcm92aWRlcikgdG8gZGV0ZXJtaW5lIGlmIHRoZSBgR3JhcGhgIGltcGxlbWVudGF0aW9uIGFsbG93cyBgbnVsbGAgYXMgYSBwcm9wZXJ0eSB2YWx1ZS4KKworV2l0aCByZXNwZWN0IHRvIGBudWxsYCBpbiByZWxhdGlvbiB0byBwcm9wZXJ0aWVzLCB0aGVyZSB3YXMgYSBiaXQgb2YgaW5jb25zaXN0ZW5jeSBpbiB0aGUgaGFuZGxpbmcgb2YgYG51bGxgIGluIGNhbGxzCit0byBgcHJvcGVydHkoKWAgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG11dGF0aW9uIGJlaW5nIGV4ZWN1dGVkIGRlbW9uc3RyYXRlZCBhcyBmb2xsb3dzIGluIGVhcmxpZXIgdmVyc2lvbnM6CisKK1tzb3VyY2UsdGV4dF0KKy0tLS0KK2dyZW1saW4+IGcuVigxKS5wcm9wZXJ0eSgieCIsIDEpLnByb3BlcnR5KCJ5IiwgbnVsbCkucHJvcGVydHkoInoiLCAyKQorVGhlIEFkZFByb3BlcnR5U3RlcCBkb2VzIG5vdCBoYXZlIGEgcHJvdmlkZWQgdmFsdWU6IEFkZFByb3BlcnR5U3RlcCh7a2V5PVt5XX0pCitUeXBlICc6aGVscCcgb3IgJzpoJyBmb3IgaGVscC4KK0Rpc3BsYXkgc3RhY2sgdHJhY2U/IFt5Tl1OCitncmVtbGluPiBnLmFkZFYoInRlc3QiKS5wcm9wZXJ0eSgieCIsIDEpLnByb3BlcnR5KCJ5IiwgbnVsbCkucHJvcGVydHkoInoiLCAyKQorPT0+dlsxM10KK2dyZW1saW4+IGcuVigxMykucHJvcGVydGllcygpCis9PT52cFt4LT4xXQorPT0+dnBbei0+Ml0KKy0tLS0KKworVGhpcyBiZWhhdmlvciBoYXMgYmVlbiBhbHRlcmVkIHRvIGJlY29tZSBjb25zaXN0ZW50LiBGaXJzdCwgYXNzdW1pbmcgYG51bGxgIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBwcm9wZXJ0eSB2YWx1ZSwgdGhlCitzZXR0aW5nIG9mIGEgcHJvcGVydHkgdG8gYG51bGxgIHNob3VsZCBoYXZlIHRoZSBiZWhhdmlvciBvZiByZW1vdmluZyB0aGUgcHJvcGVydHkgaW4gdGhlIHNhbWUgd2F5IGluIHdoaWNoIHlvdSBtaWdodAorZG8gYGcuVigpLnByb3BlcnRpZXMoKS5kcm9wKClgOgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLlYoMSkucHJvcGVydHkoIngiLCAxKS5wcm9wZXJ0eSgieSIsIG51bGwpLnByb3BlcnR5KCJ6IiwgMikKKz09PnZbMV0KK2dyZW1saW4+IGcuVigxKS5lbGVtZW50TWFwKCkKKz09PltpZDoxLGxhYmVsOnBlcnNvbixuYW1lOm1hcmtvLHg6MSx6OjIsYWdlOjI5XQorZ3JlbWxpbj4gZy5WKCkuaGFzTGFiZWwoJ3BlcnNvbicpLnByb3BlcnR5KCdhZ2UnLG51bGwpLml0ZXJhdGUoKQorZ3JlbWxpbj4gZy5WKCkuaGFzTGFiZWwoJ3BlcnNvbicpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjEsbGFiZWw6cGVyc29uLG5hbWU6bWFya29dCis9PT5baWQ6MixsYWJlbDpwZXJzb24sbmFtZTp2YWRhc10KKz09PltpZDo0LGxhYmVsOnBlcnNvbixuYW1lOmpvc2hdCis9PT5baWQ6NixsYWJlbDpwZXJzb24sbmFtZTpwZXRlcl0KKy0tLS0KKworVGhlbiwgYXNzdW1pbmcgYG51bGxgIGlzIHN1cHBvcnRlZCBhcyBhIHByb3BlcnR5IHZhbHVlOgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLmFkZFYoInBlcnNvbiIpLnByb3BlcnR5KCJuYW1lIiwgJ3N0ZXBoZW4nKS5wcm9wZXJ0eSgiYWdlIiwgbnVsbCkKKz09PnZbMTNdCitncmVtbGluPiBnLlYoKS5oYXMoJ3BlcnNvbicsJ25hbWUnLCdzdGVwaGVuJykuZWxlbWVudE1hcCgpCis9PT5baWQ6MTMsbGFiZWw6cGVyc29uLG5hbWU6c3RlcGhlbixhZ2U6bnVsbF0KK2dyZW1saW4+IGcuVigpLmhhcygncGVyc29uJywnYWdlJyxudWxsKQorPT0+dlsxM10KKy0tLS0KKworVGhlIGFib3ZlIGRlc2NyaWJlZCBjaGFuZ2VzIGFsc28gaGFzIGFuIGVmZmVjdCBvbiBzdGVwcyBsaWtlIGBncm91cCgpYCBhbmQgYGdyb3VwQ291bnQoKWAgd2hpY2ggZm9ybWVybHkgcHJvZHVjZWQKK2V4Y2VwdGlvbnMgd2hlbiBrZXlzIGNvdWxkIG5vdCBiZSBmb3VuZDoKKworW3NvdXJjZSx0ZXh0XQorLS0tLQorZ3JlbWxpbj4gZy5WKCkuZ3JvdXAoKS5ieSgnYWdlJykKK1RoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCBhcyB0aGUga2V5IGhhcyBubyBhc3NvY2lhdGVkIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgZWxlbWVudDogdlszXTphZ2UKK1R5cGUgJzpoZWxwJyBvciAnOmgnIGZvciBoZWxwLgorRGlzcGxheSBzdGFjayB0cmFjZT8gW3lOXW4KKy0tLS0KKworVGhlIHNvbHV0aW9uIHdhcyB0byBmaWx0ZXIgYXdheSB2ZXJ0aWNlcyB0aGF0IGRpZCBub3QgaGF2ZSB0aGUgYXZhaWxhYmxlIGtleSBzbyB0aGF0IHN1Y2ggc3RlcHMgd291bGQgd29yayBwcm9wZXJseQorb3IgdG8gd3JpdGUgYSBtb3JlIGNvbXBsZXggYGJ5KClgIG1vZHVsYXRvciB0byBiZXR0ZXIgaGFuZGxlIHRoZSBwb3NzaWJpbGl0eSBvZiBhIG1pc3Npbmcga2V5LiBXaXRoIHRoZSBsYXRlc3QgY2hhbmdlcworaG93ZXZlciBub25lIG9mIHRoYXQgaXMgbmVjZXNzYXJ5IHVubGVzcyBkZXNpcmVkOgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLlYoKS5ncm91cENvdW50KCkuYnkoJ2FnZScpCis9PT5bbnVsbDoyLDMyOjEsMzU6MSwyNzoxLDI5OjFdCistLS0tCisKK0luIGNvbmNsdXNpb24sIHRoaXMgY2hhbmdlIGluIGdyZWF0ZXIgc3VwcG9ydCBvZiBgbnVsbGAgbWF5IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YgZXhpc3RpbmcgdHJhdmVyc2FscyB3cml0dGVuIGluIHBhc3QKK3ZlcnNpb25zIG9mIFRpbmtlclBvcCBhcyBpdCBpcyBubyBsb25nZXIgcG9zc2libGUgdG8gcmVseSBvbiBgbnVsbGAgdG8gZXhwZWN0IGEgZmlsdGVyaW5nIGFjdGlvbiBmb3IgdHJhdmVyc2Vycy4KK1BsZWFzZSByZXZpZXcgZXhpc3RpbmcgR3JlbWxpbiBjYXJlZnVsbHkgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIHVuaW50ZW5kZWQgY29uc2VxdWVuY2VzIG9mIHRoaXMgY2hhbmdlIGFuZCB0aGF0Cit0aGVyZSBhcmUgbm8gb3Bwb3J0dW5pdGllcyB0byBpbXByb3ZlIGV4aXN0aW5nIGxvZ2ljIHRvIHRha2UgZ3JlYXRlciBhZHZhbnRhZ2Ugb2YgdGhpcyBleHBhbnNpb24gb2YgYG51bGxgIHNlbWFudGljcy4KKworU2VlOiBsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIyMzVbVElOS0VSUE9QLTIyMzVdLAorbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMDk5W1RJTktFUlBPUC0yMDk5XQorCis9PT09IFJlbW90ZSBTaWRlRWZmZWN0cworCitSZW1vdGUgdHJhdmVyc2FscyBubyBsb25nZXIgc3VwcG9ydCB0aGUgcmV0cmlldmFsIG9mIHJlbW90ZSBzaWRlLWVmZmVjdHMuIFVzZXJzIG11c3QgdGhlcmVmb3JlIGRpcmVjdGx5IHJldHVybgorc2lkZS1lZmZlY3RzIGFzIHBhcnQgb2YgdGhlaXIgcXVlcnkgaWYgdGhleSBuZWVkIHRoYXQgZGF0YS4gTm90ZSB0aGF0IHNlcnZlciBzZXR0aW5ncyBmb3IgYFRyYXZlcnNhbE9wUHJvY2Vzc29yYCwgd2hpY2gKK2Zvcm1lcmx5IGhlbGQgdGhlIGNhY2hlIGZvciB0aGVzZSBzaWRlLWVmZmVjdHMsIG5vIGxvbmdlciBoYXZlIGFueSBlZmZlY3QgYW5kIGNhbiBiZSByZW1vdmVkLgorCitTZWU6IGxpbms6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjI2OVtUSU5LRVJQT1AtMjI2OV0KKworPT09PSBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5CisKK1RoZSBuZXcgYEJ5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3lgIGF0dGVtcHRzIHRvIHJlLXdyaXRlIGBieSgpYCBtb2R1bGF0b3IgdHJhdmVyc2FscyB0byB1c2UgdGhlaXIgbW9yZSBvcHRpbWl6ZWQKK2Zvcm1zIHdoaWNoIGNhbiBwcm92aWRlIGEgbWFqb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuIEFzIGEgc2ltcGxlIGFuIGV4YW1wbGUsIGEgdHJhdmVyc2FsIGxpa2UgYGJ5KGlkKCkpYCB3b3VsZAorYmUgcmVwbGFjZWQgYnkgYGJ5KGlkKWAsIHRodXMgcmVwbGFjaW5nIGEgc3RlcC1iYXNlZCB0cmF2ZXJzYWwgd2l0aCBhIHRva2VuLWJhc2VkIHRyYXZlcnNhbC4KKworU2VlOiBsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTE2ODJbVElOS0VSUE9QLTE2ODJdCisKKz09PT0gU2VlZFN0cmF0ZWd5CisKK1RoZSBuZXcgYFNlZWRTdHJhdGVneWAgYWxsb3dzIHRoZSB1c2VyIHRvIHNldCBhIHNlZWQgdmFsdWUgZm9yIHN0ZXBzIHRoYXQgbWFrZSB1c2Ugb2YgYFJhbmRvbWAgc28gdGhhdCB0aGUgdHJhdmVyc2FsCitoYXMgdGhlIGFiaWxpdHkgdG8gcmV0dXJuIGRldGVybWluaXN0aWMgcmVzdWx0cy4gV2hpbGUgdGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nIHB1cnBvc2VzLAordGhlcmUgYXJlIGFsc28gc29tZSBwcmFjdGljYWwgYXBwbGljYXRpb25zIGFzIHdlbGwuCisKK1tzb3VyY2UsdGV4dF0KKy0tLS0KK2dyZW1saW4+IGcuVigpLnZhbHVlcygnbmFtZScpLmZvbGQoKS5vcmRlcihsb2NhbCkuYnkoc2h1ZmZsZSkKKz09Pltqb3NoLG1hcmtvLHZhZGFzLHBldGVyLHJpcHBsZSxsb3BdCitncmVtbGluPiBnLlYoKS52YWx1ZXMoJ25hbWUnKS5mb2xkKCkub3JkZXIobG9jYWwpLmJ5KHNodWZmbGUpCis9PT5bdmFkYXMsbG9wLG1hcmtvLHBldGVyLGpvc2gscmlwcGxlXQorZ3JlbWxpbj4gZy5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorPT0+W3BldGVyLHJpcHBsZSxqb3NoLGxvcCxtYXJrbyx2YWRhc10KK2dyZW1saW4+IGcud2l0aFN0cmF0ZWdpZXMobmV3IFNlZWRTdHJhdGVneSgyMjMyMykpLlYoKS52YWx1ZXMoJ25hbWUnKS5mb2xkKCkub3JkZXIobG9jYWwpLmJ5KHNodWZmbGUpCis9PT5bbG9wLHBldGVyLGpvc2gsbWFya28sdmFkYXMscmlwcGxlXQorZ3JlbWxpbj4gZy53aXRoU3RyYXRlZ2llcyhuZXcgU2VlZFN0cmF0ZWd5KDIyMzIzKSkuVigpLnZhbHVlcygnbmFtZScpLmZvbGQoKS5vcmRlcihsb2NhbCkuYnkoc2h1ZmZsZSkKKz09Pltsb3AscGV0ZXIsam9zaCxtYXJrbyx2YWRhcyxyaXBwbGVdCitncmVtbGluPiBnLndpdGhTdHJhdGVnaWVzKG5ldyBTZWVkU3RyYXRlZ3koMjIzMjMpKS5WKCkudmFsdWVzKCduYW1lJykuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKQorPT0+W2xvcCxwZXRlcixqb3NoLG1hcmtvLHZhZGFzLHJpcHBsZV0KKy0tLS0KKworPT09PSBieShUKSBmb3IgUHJvcGVydHkKKworVGhlIGBQcm9wZXJ0eWAgaW50ZXJmYWNlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgaGllcmFyY2h5IG9mIGBFbGVtZW50YC4gVGhpcyBtZWFucyB0aGF0IGFuIGVkZ2UgcHJvcGVydHkgb3IgYQorbWV0YS1wcm9wZXJ0eSBhcmUgbm90IGNvbnNpZGVyZWQgZWxlbWVudHMgdGhlIHdheSB0aGF0IGEgYFZlcnRleFByb3BlcnR5YCBpcy4gQXMgYSByZXN1bHQsIHNvbWUgdXNhZ2VzIG9mIGBUYCBpbgorcmVsYXRpb24gdG8gcHJvcGVydGllcyBkbyBub3Qgd29yayBjb25zaXN0ZW50bHkuIE9uZSBzdWNoIGV4YW1wbGUgaXMgYGJ5KFQpYCwgYSB0b2tlbi1iYXNlZCB0cmF2ZXJzYWwsIHdoZXJlIHRoZQorZm9sbG93aW5nIHdvcmtzIGZvciBhIGBWZXJ0ZXhQcm9wZXJ0eWAgYnV0IHdpbGwgbm90IGZvciBlZGdlIHByb3BlcnRpZXMgb3IgbWV0YS1wcm9wZXJ0aWVzOgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLlYoMSkucHJvcGVydGllcygpLmFzKCdhJykuc2VsZWN0KCdhJykuYnkoa2V5KQorPT0+bmFtZQorPT0+YWdlCistLS0tCisKK0ZvciBhIGBQcm9wZXJ0eWAgeW91IHdvdWxkIG5lZWQgdG8gdXNlIGBrZXkoKWAtc3RlcDoKKworW3NvdXJjZSx0ZXh0XQorLS0tLQorZ3JlbWxpbj4gZy5FKDExKS5wcm9wZXJ0aWVzKCkuYXMoJ2EnKS5zZWxlY3QobGFzdCwnYScpLmJ5KGtleSgpKQorPT0+d2VpZ2h0CistLS0tCisKK0FzaWRlIGZyb20gdGhlIGluY29uc2lzdGVuY3ksIHRoaXMgaXNzdWUgYWxzbyBwcmVzZW50cyBhIHNpdHVhdGlvbiB3aGVyZSBwZXJmb3JtYW5jZSBpcyBpbXBhY3RlZCBhcyB0b2tlbi1iYXNlZAordHJhdmVyc2FscyBhcmUgaW5oZXJlbnRseSBmYXN0ZXIgdGhhbiBzdGVwLWJhc2VkIG9uZXMuIEluIDMuNS4wLCB0aGlzIGlzc3VlIGhhcyBiZWVuIHJlc29sdmVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCitpbnRyb2R1Y3Rpb24gb2YgYEJ5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3lgIHdoaWNoIHdpbGwgb3B0aW1pemUgYGJ5KGtleSgpKWAgYW5kIGBieSh2YWx1ZSgpKWAgdG8gdGhlaXIKK2FwcHJvcHJpYXRlIHRva2VuIHZlcnNpb25zIGF1dG9tYXRpY2FsbHkuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0xNjgyW1RJTktFUlBPUC0xNjgyXQorCis9PT09IENvbXBsZXggZGljdCBEZXNlcmlhbGl6YXRpb24KKworSW4gR3JlbWxpbiBpdCBpcyBjb21tb24gdG8gcmV0dXJuIGEgYGRpY3RgIGFzIGEga2V5IHZhbHVlIGluIGFub3RoZXIgYGRpY3RgLiBUaGUgcHJvYmxlbSBmb3IgUHl0aG9uIGlzIHRoYXQgYSBgZGljdGAKK2lzIG5vdCBoYXNoYWJsZSBhbmQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuIEJ5IGludHJvZHVjaW5nIGEgYEhhc2hhYmxlRGljdGAgZm9yIHRob3NlIGtleXMsIGl0IGlzIG5vdyBwb3NzaWJsZSB0bworcmV0dXJuIHRoZXNlIHR5cGVzIG9mIHJlc3VsdHMgYW5kIG5vdCBoYXZlIHRvIHdvcmsgYXJvdW5kIHRoZW06CisKK1tzb3VyY2UsdGV4dF0KKy0tLS0KKz4+PiBnLlYoKS5oYXMoJ3BlcnNvbicsICduYW1lJywgJ21hcmtvJykuZWxlbWVudE1hcCgibmFtZSIpLmdyb3VwQ291bnQoKS5uZXh0KCkKK3t7PFQuaWQ6IDE+OiAxLCA8VC5sYWJlbDogND46ICdwZXJzb24nLCAnbmFtZSc6ICdtYXJrbyd9OiAxfQorLS0tLQorCitTZWU6IGxpbms6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjM5NVtUSU5LRVJQT1AtMjM5NV0KKworPT09PSBQeXRob24gMi54IFN1cHBvcnQKKworVGhlIGdyZW1saW5weXRob24gbW9kdWxlIG5vIGxvbmdlciBzdXBwb3J0cyBQeXRob24gMi54LiBVc2VycyBtdXN0IHVzZSBQeXRob24gMyBnb2luZyBmb3J3YXJkLiBGb3IgdGhlIG1vc3QgcGFydCwgZnJvbQorYSB1c2VyJ3MgcGVyc3BlY3RpdmUsIHRoZXJlIGFyZSBubyBzcGVjaWZpYyBBUEkgY2hhbmdlcyB0byBjb25zaWRlciBhcyBhIHJlc3VsdCBvZiB0aGlzIGNoYW5nZS4gSXQgaXMgYWxzbyB3b3J0aAorbm90aW5nIHRoYXQgSnl0aG9uIHN1cHBvcnQgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgdGhhdCBgZ3JlbWxpbi1weXRob25gIG5vIGxvbmdlciBwcm9kdWNlcyBhIEpWTS1iYXNlZCBhcnRpZmFjdC4gVGhpcworY2hhbmdlIG1lYW5zIHRoYXQgdGhlIGBHcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lYCBubyBsb25nZXIgZXhpc3RzIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gd3JpdGUgbmF0aXZlIFB5dGhvbiBsYW1iZGFzLgorQWxsIGxhbWJkYXMgc2hvdWxkIGJlIHdyaXR0ZW4gdXNpbmcgYGdyZW1saW4tZ3Jvb3Z5YCBpZiB0aGV5IGFyZSBuZWVkZWQuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMzE3W1RJTktFUlBPUC0yMzE3XQorCis9PT09IFB5dGhvbiBLZXJiZXJvcyBTdXBwb3J0CisKK1RoZSBQeXRob24gRHJpdmVyIG5vdyBzdXBwb3J0cyBLZXJiZXJvcyBiYXNlZCBhdXRoZW50aWNhdGlvbjoKKworW3NvdXJjZSxweXRob25dCistLS0tCitnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShEcml2ZXJSZW1vdGVDb25uZWN0aW9uKAorICAgICd3czovL2xvY2FsaG9zdDo4MTgyL2dyZW1saW4nLCAnZycsIGtlcmJlcml6ZWRfc2VydmljZT0nZ3JlbWxpbkBob3N0bmFtZS55b3VyLm9yZycpKQorLS0tLQorCitTZWU6IGxpbms6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMTY0MVtUSU5LRVJQT1AtMTY0MV0sCitsaW5rOmh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1weXRob24tY29ubmVjdGluZ1tSZWZlcmVuY2UgRG9jdW1lbnRhdGlvbl0KKworPT09PSAuTkVUIFN0YW5kYXJkIDIuMCBPbmx5CisKK0dyZW1saW4uTkVUIG5vIGxvbmdlciB0YXJnZXRzIC5ORVQgU3RhbmRhcmQgMS4zLCBidXQgb25seSAuTkVUIFN0YW5kYXJkIDIuMC4gU2luY2UgLk5FVCBDb3JlIDIuMCBhbmQgLk5FVCBGcmFtZXdvcmsKKzQuNi4xIGFscmVhZHkgc3VwcG9ydCB0aGlzIC5ORVQgU3RhbmRhcmQgdmVyc2lvbiwgbW9zdCB1c2VycyBzaG91bGQgbm90IGJlIGltcGFjdGVkIGJ5IHRoaXMuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMzM1W1RJTktFUlBPUC0yMzM1XQorCis9PT0gR3JlbWxpbi5ORVQ6IE5ldyBKU09OIExpYnJhcnkKKworR3JlbWxpbi5ORVQgbm93IHVzZXMgYFN5c3RlbS5UZXh0Lkpzb25gIGluc3RlYWQgb2YgTmV3dG9uc29mdC5Kc29uIGFzIGBTeXN0ZW0uVGV4dC5Kc29uYCBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIC5ORVQKK0NvcmUgMy4wIGFuZCBoaWdoZXIgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIG9uZSBkZXBlbmRlbmN5IGxlc3Mgb24gdGhpcyBwbGF0Zm9ybSBhbmQgYmVjYXVzZSBpdCBvZmZlcnMgYW4gaW5jcmVhc2VkCitwZXJmb3JtYW5jZS4KK01vc3QgdXNlcnMgc2hvdWxkIG5vdCBub3RpY2UgdGhpcyBjaGFuZ2UuIEJ1dCB1c2VycyB3aG8gaGF2ZSBpbXBsZW1lbnRlZCB0aGVpciBvd24gR3JhcGhTT04gc2VyaWFsaXplcnMgb3IKK2Rlc2VyaWFsaXplcnMgcHJvYmFibHkgaGF2ZSB0byBjaGFuZ2UgdGhlbSBhY2NvcmRpbmdseS4gVGhlIHNhbWUgYXBwbGllcyB0byB1c2VycyB0aGF0IGxldCBHcmVtbGluLk5FVCByZXR1cm4gZGF0YQord2l0aG91dCBkZXNlcmlhbGl6aW5nIGl0IGZpcnN0IGFzIHRoZSByZXR1cm5lZCBkYXRhIHR5cGVzIHdpbGwgY2hhbmdlIGluIHRoaXMgY2FzZSwgZm9yIGV4YW1wbGUgZnJvbSBOZXd0b25zb2Z0Lkpzb24ncworYEpPYmplY3RgIG9yIGBKVG9rZW5gIHRvIGBKc29uRWxlbWVudGAgd2l0aCBgU3lzdGVtLlRleHQuSnNvbmAuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMzQ5W1RJTktFUlBPUC0yMzQ5XSwKK2xpbms6aHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvMy41LjAvZGV2L3Byb3ZpZGVyLyNfc3VwcG9ydGluZ19ncmVtbGluX25ldF9pb1tEb2N1bWVudGF0aW9uIGZvciBjdXN0b20gSlNPTiBzZXJpYWxpemF0aW9uIHdpdGggR3JlbWxpbi5ORVRdCisKKz09PT0gTmVvNGogQ2hhbmdlcworCitUaGVyZSB3ZXJlIHR3byBrZXkgY2hhbmdlcyB0byB0aGUgbmVvNGotZ3JlbWxpbiBtb2R1bGU6CisKKyogVGhlIHVuZGVybHlpbmcgTmVvNGogdmVyc2lvbiBtb3ZlZCBmcm9tIHRoZSAzLjIueCBsaW5lIHRvIDMuNC54IGxpbmUuIFBsZWFzZSBzZWUgdGhlCitsaW5rOmh0dHBzOi8vbmVvNGouY29tL2d1aWRlcy91cGdyYWRlLWFyY2hpdmUvW05lbzRqIFVwZ3JhZGUgRkFRXSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhcyBmZWF0dXJlcyBhbmQKK2NvbmZpZ3VyYXRpb24gb3B0aW9ucyBtYXkgaGF2ZSBjaGFuZ2VkLgorKiBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgbXVsdGkvbWV0YS1wcm9wZXJ0aWVzIGluIE5lbzRqIHdoaWNoIHdlcmUgcHJldmlvdXNseSBkZXByZWNhdGVkIGhhdmUgbm93IGJlZW4gcGVybWFuZW50bHkKK3JlbW92ZWQuCisKKz09PT0gRGVwcmVjYXRpb24gUmVtb3ZhbAorCitUaGUgZm9sbG93aW5nIGRlcHJlY2F0ZWQgY2xhc3NlcywgbWV0aG9kcyBvciBmaWVsZHMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gdGhpcyB2ZXJzaW9uOgorCisqIGBncmVtbGluLWNvcmVgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmJ1bGtkdW1waW5nLkJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZy5CdWxrTG9hZGVyYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZy5CdWxrTG9hZGVyVmVydGV4UHJvZ3JhbWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuYnVsa2xvYWRpbmcuSW5jcmVtZW50YWxCdWxrTG9hZGVyYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZy5PbmVUaW1lQnVsa0xvYWRlcmAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuY2x1c3RlcmluZy5wZWVycHJlc3N1cmUuUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbS5CdWlsZGVyI3RyYXZlcnNhbCgqKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIucmFua2luZy5wYWdlcmFuay5QYWdlUmFua1ZlcnRleFByb2dyYW0uQnVpbGRlciN0cmF2ZXJzYWwoKilgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnJhbmtpbmcucGFnZXJhbmsuUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtLkJ1aWxkZXIjdmVydGV4Q291bnQoKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlBhZ2VSYW5rVmVydGV4UHJvZ3JhbVN0ZXAubW9kdWxhdGVCeSgqKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlBhZ2VSYW5rVmVydGV4UHJvZ3JhbVN0ZXAubW9kdWxhdGVUaW1lcygpYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RlcC5tYXAuUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbVN0ZXAubW9kdWxhdGVCeSgqKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlBlZXJQcmVzc3VyZVZlcnRleFByb2dyYW1TdGVwLm1vZHVsYXRlVGltZXMoKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5BYnN0cmFjdFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsLkVtYmVkZGVkUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHNgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS50cmF2ZXJzYWwuUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHNgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS50cmF2ZXJzYWwuUmVtb3RlVHJhdmVyc2FsI2dldFNpZGVFZmZlY3RzKClgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5PcmRlci5kZWNyYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuT3JkZXIuaW5jcmAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNvdXJjZSN3aXRoUmVtb3RlKCopYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlI3dpdGhSZW1vdGUoKilgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5Qcm9wZXJ0eU1hcFN0ZXAoVHJhdmVyc2FsLkFkbWluLCBib29sZWFuLCBQcm9wZXJ0eVR5cGUsIFN0cmluZy4uLilgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5Qcm9wZXJ0eU1hcFN0ZXAjaXNJbmNsdWRlVG9rZW5zKClgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5zdGFyLlN0YXJHcmFwaCNidWlsZGVyKClgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5zdGFyLlN0YXJHcmFwaC5CdWlsZGVyI2NyZWF0ZSgpYAorKiBgZ3JlbWxpbi1kcml2ZXJgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuVG9rZW5zI0FSR1NfU0NSSVBUX0VWQUxfVElNRU9VVGAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5DbHVzdGVyLkJ1aWxkZXIja2V5Q2VydENoYWluRmlsZShTdHJpbmcpYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNsdXN0ZXIuQnVpbGRlciNrZXlGaWxlKFN0cmluZylgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQ2x1c3Rlci5CdWlsZGVyI2tleVBhc3N3b3JkKFN0cmluZylgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQ2x1c3Rlci5CdWlsZGVyI21heFdhaXRGb3JTZXNzaW9uQ2xvc2UoSW50ZWdlcilgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQ2x1c3Rlci5CdWlsZGVyI3RydXN0Q2VydGlmaWNhdGVDaGFpbkZpbGUoU3RyaW5nKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5oYW5kbGVyLk5pb0dyZW1saW5SZXF1ZXN0RW5jb2RlcmAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5oYW5kbGVyLk5pb0dyZW1saW5SZXNwb25zZURlY29kZXJgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIucmVtb3RlLkRyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnJlbW90ZS5Ecml2ZXJSZW1vdGVUcmF2ZXJzYWwjZ2V0U2lkZUVmZmVjdHMoKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zaW1wbGUuTmlvQ2xpZW50YAorKiBgZ3JlbWxpbi1weXRob25gCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzLipgCisqIGBncmVtbGluLXNlcnZlcmAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5TZXR0aW5ncy5zY3JpcHRFdmFsdWF0aW9uVGltZW91dGAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5TZXR0aW5ncy5Tc2xTZXR0aW5ncy5rZXlDZXJ0Q2hhaW5GaWxlYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLlNldHRpbmdzLlNzbFNldHRpbmdzLmtleUZpbGVgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuU2V0dGluZ3MuU3NsU2V0dGluZ3Mua2V5UGFzc3dvcmRgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuU2V0dGluZ3MuU3NsU2V0dGluZ3MudHJ1c3RDZXJ0aWZpY2F0ZUNoYWluRmlsZWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5SZXNwb25zZUhhbmRsZXJDb250ZXh0YAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmNoYW5uZWwuTmlvQ2hhbm5lbGl6ZXJgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlci5OaW9HcmVtbGluQmluYXJ5UmVxdWVzdERlY29kZXJgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlci5OaW9HcmVtbGluUmVzcG9uc2VGcmFtZUVuY29kZXJgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIub3AuQWJzdHJhY3RFdmFsT3BQcm9jZXNzb3IuZXZhbE9wSW50ZXJuYWwoUmVzcG9uc2VIYW5kbGVyQ29udGV4dCwgU3VwcGxpZXIsIEJpbmRpbmdTdXBwbGllcilgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIub3AuQWJzdHJhY3RPcFByb2Nlc3Nvci5nZW5lcmF0ZU1ldGFEYXRhKENoYW5uZWxIYW5kbGVyQ29udGV4dCwgUmVxdWVzdE1lc3NhZ2UsIFJlc3BvbnNlU3RhdHVzQ29kZSwgSXRlcmF0b3IpYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLm9wLkFic3RyYWN0T3BQcm9jZXNzb3IuaGFuZGxlSXRlcmF0b3IoUmVzcG9uc2VIYW5kbGVyQ29udGV4dCwgSXRlcmF0b3IpYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLm9wLkFic3RyYWN0T3BQcm9jZXNzb3IubWFrZUZyYW1lKENoYW5uZWxIYW5kbGVyQ29udGV4dCwgUmVxdWVzdE1lc3NhZ2UsIE1lc3NhZ2VTZXJpYWxpemVyLCBib29sZWFuLCBMaXN0LCBSZXNwb25zZVN0YXR1c0NvZGUsIE1hcClgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIub3AuQWJzdHJhY3RPcFByb2Nlc3Nvci5tYWtlRnJhbWUoQ29udGV4dCwgUmVxdWVzdE1lc3NhZ2UsIE1lc3NhZ2VTZXJpYWxpemVyLCBib29sZWFuLCBMaXN0LCBSZXNwb25zZVN0YXR1c0NvZGUsIE1hcClgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIub3AuQWJzdHJhY3RPcFByb2Nlc3Nvci5tYWtlRnJhbWUoUmVzcG9uc2VIYW5kbGVyQ29udGV4dCwgUmVxdWVzdE1lc3NhZ2UsIE1lc3NhZ2VTZXJpYWxpemVyLCBib29sZWFuLCBMaXN0LCBSZXNwb25zZVN0YXR1c0NvZGUsIE1hcClgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIub3AuQWJzdHJhY3RPcFByb2Nlc3Nvci5tYWtlRnJhbWUoUmVzcG9uc2VIYW5kbGVyQ29udGV4dCwgUmVxdWVzdE1lc3NhZ2UsIE1lc3NhZ2VTZXJpYWxpemVyLCBib29sZWFuLCBMaXN0LCBSZXNwb25zZVN0YXR1c0NvZGUsIE1hcCwgTWFwKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5vcC50cmF2ZXJzYWwuVHJhdmVyc2FsT3BQcm9jZXNzb3Iub25TaWRlRWZmZWN0U3VjY2VzcyhHcmFwaCwgQ29udGV4dClgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIudXRpbC5TaWRlRWZmZWN0SXRlcmF0b3JgCisqIGBuZW80ai1ncmVtbGluYAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLk5lbzRqR3JhcGgjZ2V0VHJhaXQoKWAKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80akdyYXBoI0NPTkZJR19NRVRBX1BST1BFUlRJRVNgCisqKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaCNDT05GSUdfTVVMVElfUFJPUEVSVElFU2AKKyoqIGBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS50cmFpdC5NdWx0aU1ldGFOZW80alRyYWl0YAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLnRyYWl0Lk5vTXVsdGlOb01ldGFOZW80alRyYWl0YAorKiogYG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLnRyYWl0Lk5lbzRqVHJhaXRgCisKK0NlcnRhaW4gZWxlbWVudHMgb2YgdGhlIEFQSSB3ZXJlIG5vdCBvciBjb3VsZCBub3QgYmUgZGVwcmVjYXRlZCBpbiBwcmlvciB2ZXJzaW9ucyBhbmQgd2VyZSBzaW1wbHkgcmVuYW1lZCBmb3IgdGhpcworcmVsZWFzZToKKworKiBgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXNwb25zZVN0YXR1c0NvZGUjU0VSVkVSX0VSUk9SX1NDUklQVF9FVkFMVUFUSU9OYCBiZWNhbWUgYFNFUlZFUl9FUlJPUl9FVkFMVUFUSU9OYAorCitTZWU6IGxpbms6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjA4MFtUSU5LRVJQT1AtMjA4MF0sCitsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIyMzFbVElOS0VSUE9QLTIyMzFdLAorbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMjMzW1RJTktFUlBPUC0yMjMzXSwKK2xpbms6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjIzOVtUSU5LRVJQT1AtMjIzOV0sCitsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIyNjlbVElOS0VSUE9QLTIyNjldLAorbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMjczW1RJTktFUlBPUC0yMjczXSwKK2xpbms6aHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzLzMuNS4wL3VwZ3JhZGUvI19zc2xfc2VjdXJpdHlbMy4yLjEwIFVwZ3JhZGUgRG9jdW1lbnRhdGlvbiBmb3IgU1NMXQorCis9PT0gVXBncmFkaW5nIGZvciBQcm92aWRlcgorCis9PT09IEdyYXBoIFN5c3RlbSBQcm92aWRlcnMKKworPT09PT0gU2NhbGFyTWFwU3RlcAorCitgTWFwU3RlcGAgaGFkIGEgc2luZ2xlIGFic3RyYWN0IG1ldGhvZCB0aGF0IG5lZWRlZCB0byBiZSBpbXBsZW1lbnRlZDoKKworW3NvdXJjZSxqYXZhXQorLS0tLQorcHJvdGVjdGVkIGFic3RyYWN0IEUgbWFwKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpOworLS0tLQorCitUaGlzIG1ldGhvZCBtYWRlIGl0IGVhc3kgdG8gaW1wbGVtZW50IG5ldyBpbXBsZW1lbnRhdGlvbnMgYmVjYXVzZSBpdCBoaWQgY2VydGFpbiBwcm9jZXNzaW5nIGxvZ2ljIGFuZCBtYWRlIGl0IHNvIHRoYXQKK3RoZSBpbXBsZW1lbnRlciBvbmx5IGhhZCB0byByZWFzb24gYWJvdXQgaG93IHRvIHRha2UgdGhlIGN1cnJlbnQgb2JqZWN0IGZyb20gdGhlIGBUcmF2ZXJzZXJgIGFuZCB0cmFuc2Zvcm0gaXQgdG8gYQorbmV3IHZhbHVlLiBBcyAzLjUuMCBjaGFuZ2VkIHNlbWFudGljcyBhcm91bmQgaG93IGBudWxsYCBpcyBwcm9jZXNzZWQsIHRoaXMgbWV0aG9kIGJlY2FtZSBhIGJpdCBvZiBhIGhpbmRyYW5jZSB0byB0aGUKK21vcmUgY29tcGxleCBsb2dpYyB3aGljaCB0aG9zZSBzZW1hbnRpY3MgZW50YWlsZWQuIFNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgY291bGQgbm90IGVhc2lseSBjb21tdW5pY2F0ZSB0byB1bmRlcmx5aW5nCitwcm9jZXNzaW5nIHdoYXQgYSBgbnVsbGAgbWlnaHQgbWVhbiAtIGlzIHRoZSBgbnVsbGAgdGhlIGVuZCBvZiB0aGUgdHJhdmVyc2FsIHN0cmVhbSBvciBzaG91bGQgdGhlIGBudWxsYCBiZSBwcm9tb3RlZAorZG93biB0aGUgc3RyZWFtIGFzIGEgdmFsdWUgdG8gYmUgcHJvY2Vzc2VkLgorCitJbnRlcmVzdGluZ2x5LCB0aGUgbWV0aG9kIHRoYXQgZW5hYmxlZCB0aGUgaGFuZGxpbmcgb2YgdGhpcyBtb3JlIGNvbXBsZXggZGVjaXNpb24gbWFraW5nIGFscmVhZHkgZXhpc3RlZCBpbgorYEFic3RyYWN0U3RlcGA6CisKK1tzb3VyY2UsamF2YV0KKy0tLS0KK3Byb3RlY3RlZCBUcmF2ZXJzZXIuQWRtaW48RT4gcHJvY2Vzc05leHRTdGFydCgpCistLS0tCisKK0l0IHJldHVybnMgYSB3aG9sZSBgVHJhdmVyc2VyYCBvYmplY3QgYW5kIGZvcmNlcyBtYW51YWwgcmV0cmlldmFsIG9mIHRoZSAibmV4dCIgYFRyYXZlcnNlcmAuIEF0IHRoaXMgbGV2ZWwgaXQgYmVjb21lcworcG9zc2libGUgdG8gbWFrZSBjaG9pY2VzIG9uIGBudWxsYCBhbmQgcmV0dXJuIGl0IGlmIGl0IHNob3VsZCBiZSBwcm9wYWdhdGVkIG9yIGRpc21pc3MgaXQgYW5kIHJldHVybiBhbgorYEVtcHR5VHJhdmVyc2VyYC4gVG8gYmV0dGVyIGFjY29tbW9kYXRlIHRoZSBgTWFwU3RlcGAgd2hpY2ggcHJvdmlkZXMgdGhlIG5pY2UgaGVscGVyIGBtYXAoVHJhdmVyc2VyKWAgbWV0aG9kIGFzIHdlbGwKK2FzIHRoZSBtb3JlIGZsZXhpYmxlIHZlcnNpb24gdGhhdCBkb2Vzbid0IG5lZWQgdGhhdCBpbmZyYXN0cnVjdHVyZSwgYFNjYWxhck1hcFN0ZXBgIHdhcyBhZGRlZCB0byBleHRlbmQgYE1hcFN0ZXBgLiBUaGUKK2BtYXAoVHJhdmVyc2VyKWAgd2FzIHRoZW4gbW92ZWQgdG8gYFNjYWxhck1hcFN0ZXBgIGFuZCB0aG9zZSBzdGVwcyB0aGF0IGNvdWxkIHJlbHkgb24gdGhhdCBoZWxwZXIgbWV0aG9kIG5vdyBleHRlbmQKK2Zyb20gaXQuIEFsbCBvdGhlciBzdGVwcyBvZiB0aGlzIHNvcnQgc3RpbGwgZXh0ZW5kIGBNYXBTdGVwYCBhbmQgZGlyZWN0bHkgaW1wbGVtZW50IGBwcm9jZXNzTmV4dFN0YXJ0KClgLgorCitQcm92aWRlcnMgd2lsbCBnZXQgY29tcGlsZSBlcnJvcnMgaWYgdGhleSBleHRlbmRlZCBgTWFwU3RlcGAuIFRoZSBlYXN5IHNvbHV0aW9uIHdpbGwgYmUgdG8gc2ltcGx5IG1vZGlmeSB0aGF0IGNvZGUgc28KK3RoYXQgdGhlaXIgc3RlcCBpbnN0ZWFkIGV4dGVuZHMgYFNjYWxhck1hcFN0ZXBgLiBBcyBhIHNlY29uZGFyeSB0YXNrLCBwcm92aWRlcnMgc2hvdWxkIHRoZW4gZXhhbWluZSB0aGVpciBzdGVwCitpbXBsZW1lbnRhdGlvbiB0byBlbnN1cmUgdGhhdCBgbnVsbGAgc2VtYW50aWNzIGFzIHByZXNlbnRlZCBpbiAzLjUuMCBhcHBseSBwcm9wZXJseS4gSWYgdGhleSBkbyBub3QsIHRoZW4gaXQgaXMgbGlrZWx5Cit0aGF0IHRoZSBzdGVwIHNob3VsZCBzaW1wbHkgaW1wbGVtZW50IGBNYXBTdGVwYCBkaXJlY3RseSBhbmQgZm9ybWVyIGBtYXAoVHJhdmVyc2VyKWAgbG9naWMgc2hvdWxkIGJlIG1pZ3JhdGVkIHRvCitgcHJvY2Vzc05leHRTdGFydCgpYC4KKworU2VlOiBsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIyMzVbVElOS0VSUE9QLTIyMzVdLAorbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMDk5W1RJTktFUlBPUC0yMDk5XQorCis9PT09PSBUcmF2ZXJzYWxTdHJhdGVneSBBcHBsaWNhdGlvbgorCitUaGUgbWV0aG9kb2xvZ3kgZm9yIHN0cmF0ZWd5IGFwcGxpY2F0aW9uIGhhcyBiZWVuIGFsdGVyZWQgYW5kIHRoZSBjaGFuZ2UgaXMgbW9zdCBlYXNpbHkgZGVzY3JpYmVkIGJ5IGV4YW1wbGUuIEdpdmVuIGEKK3RyYXZlcnNhbCB3aXRoIHRoZSBzdHJ1Y3R1cmU6CisKK1tzb3VyY2UsdGV4dF0KKy0tLS0KK2EoYigpLGMoZCgpKSkKKy0tLS0KKworU3RyYXRlZ2llcyB3ZXJlIGZvcm1lcmx5IGFwcGxpZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKworW3NvdXJjZSx0ZXh0XQorLS0tLQorU3RyYXRlZ3lBIG9uIGEKK1N0cmF0ZWd5QiBvbiBhCitTdHJhdGVneUEgb24gYgorU3RyYXRlZ3lCIG9uIGIKK1N0cmF0ZWd5QSBvbiBjCitTdHJhdGVneUIgb24gYworU3RyYXRlZ3lBIG9uIGQKK1N0cmF0ZWd5QiBvbiBkCistLS0tCisKK1RoaXMgYXBwcm9hY2ggaGFzIGFsd2F5cyBwcmV2ZW50ZWQgc3RyYXRlZ2llcyBmcm9tIHBlcmZvcm1pbmcgZ2xvYmFsIG9wZXJhdGlvbnMgYWNyb3NzIHRoZSB0cmF2ZXJzYWwgYW5kIGFsbCBkZWNlZGVudHMKK2VmZmVjdGl2ZWx5IGFzIGNoaWxkcmVuIHdpbGwgbm90IGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgcHJlY2VkaW5nIHN0cmF0ZWdpZXMgeWV0LiBBcyBvZiB0aGlzIHJlbGVhc2UsIHRoZSBhcHByb2FjaAoraGFzIGJlZW4gYWx0ZXJlZCB0byBhcHBseSBzdHJhdGVnaWVzIGFzIGZvbGxvd3M6CisKK1tzb3VyY2UsdGV4dF0KKy0tLS0KK1N0cmF0ZWd5QSBvbiBhCitTdHJhdGVneUEgb24gYgorU3RyYXRlZ3lBIG9uIGMKK1N0cmF0ZWd5QSBvbiBkCitTdHJhdGVneUIgb24gYQorU3RyYXRlZ3lCIG9uIGIKK1N0cmF0ZWd5QiBvbiBjCitTdHJhdGVneUIgb24gZAorLS0tLQorCitJbiB0aGlzIHdheSwgc3RyYXRlZ3kgQiBjYW4gY2hlY2sgaWYgaXQgaXMgYmVpbmcgYXBwbGllZCB0byB0aGUgcm9vdCB0cmF2ZXJzYWwgYW5kIGlmIGl0IGlzIGl0IGtub3dzIHRoYXQgQSBoYXMgYmVlbgorYXBwbGllZCBnbG9iYWxseS4KKworVGhpcyByZXZpc2VkIG1ldGhvZG9sb2d5IGNvdWxkIHJlcHJlc2VudCBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYFRyYXZlcnNhbFN0cmF0ZWd5YCBpbXBsZW1lbnRhdGlvbnMgaWYgdGhleSBzb21laG93CityZWxpZWQgb24gdGhlIG9sZCBvcmRlcmluZyBvZiBhcHBsaWNhdGlvbi4gSXQgbWF5IGFsc28gcHJlc2VudCBhbiBvcHBvcnR1bml0eSB0byByZXZpc2UgaG93IGEgYFRyYXZlcnNhbFN0cmF0ZWd5YCBpcword3JpdHRlbiB0byBnYWluIHNvbWUgcHJvY2Vzc2luZyBiZW5lZml0IHRvIHRoZSBuZXcgb3JkZXIuIFBsZWFzZSBiZSBzdXJlIHRvIHJldmlldyBhbnkgY3VzdG9tIHN0cmF0ZWdpZXMgY2FyZWZ1bGx5Cit3aGVuIHVwZ3JhZGluZyB0byB0aGlzIHZlcnNpb24uCisKK0FzIHBhcnQgb2YgdGhpcyBjaGFuZ2UsIHRoZXJlIGhhdmUgYmVlbiBzb21lIGFkanVzdG1lbnRzIHRvIHRoZSBgVHJhdmVyc2FsYCBhbmQgYFRyYXZlcnNhbC5BZG1pbmAgaW50ZXJmYWNlcyB3aGljaCBoYXZlCitoZWxwZWQgdG8gY2xhcmlmeSBjb2RpbmcgaW50ZW50LiBUaGVyZSBpcyBub3cgYW4gYGlzUm9vdCgpYCBtZXRob2Qgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgdHJhdmVyc2FsIGhhcyBhCitwYXJlbnQgb3Igbm90LiBVbmRlciByZXZpc2VkIHNlbWFudGljcyBmb3IgMy41LjAsIGEgdHJhdmVyc2FsJ3MgcGFyZW50IG11c3QgYmUgYW4gYEVtcHR5U3RlcGAgaW5zdGFuY2UgYW5kIHNob3VsZCBub3QKK2JlIGBudWxsYC4gV2l0aCB0aGlzIGNoYW5nZSwgcHJvdmlkZXIgYFRyYXZlcnNhbFN0cmF0ZWd5YCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGJlIHJldmlld2VkIHRvIGV2YWx1YXRlIGlmIGBpc1Jvb3QoKWAKK3NlbWFudGljcyBjYXVzZSBhbnkgYnJlYWtzIGluIGxvZ2ljIHRvIGV4aXN0aW5nIGNvZGUuCisKK0luIGFkZGl0aW9uLCBgVHJhdmVyc2FsU3RyYXRlZ2llc2Agbm93IGltcGxlbWVudHMgYEl0ZXJhYmxlYCBhbmQgZXhwb3NlcyBhbiBgaXRlcmF0b3IoKWAgbWV0aG9kIHdoaWNoIG1heSBiZSBwcmVmZXJyZWQKK292ZXIgdGhlIG9sZCBgdG9MaXN0KClgIHN0eWxlIGNvbnN0cnVjdGlvbiBmb3IgZ2V0dGluZyB0aGUgbGlzdCBvZiBjb25maWd1cmVkIHN0cmF0ZWdpZXMuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0xNTY4W1RJTktFUlBPUC0xNTY4XSwKK2xpbms6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjMxMFtUSU5LRVJQT1AtMjMxMF0sCitsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIzMTFbVElOS0VSUE9QLTIzMTFdCisKKz09PT09IE51bGwgU2VtYW50aWNzCisKK0dyYXBoIHByb3ZpZGVycyBzaG91bGQgdGFrZSBub3RlIG9mIHRoZSBjaGFuZ2VzIHRvIGBudWxsYCBzZW1hbnRpY3MgZGVzY3JpYmVkIGluIHRoZSAidXNlcnMiIHNlY3Rpb24gb2YgdGhlc2UgdXBncmFkZQorbm90ZXMuIEFzIGBudWxsYCBpcyBub3cgYWNjZXB0YWJsZSBhcyBhIGBUcmF2ZXJzZXJgIG9iamVjdCwgdGhpcyBjaGFuZ2UgbWF5IGFmZmVjdCBjdXN0b20gc3RlcHMuIEZ1cnRoZXIgbm90ZSB0aGF0CitgbnVsbGAgbm93IHdvcmtzIG1vcmUgY29uc2lzdGVudGx5IHdpdGggbXV0YXRpb24gc3RlcHMgYW5kIGdyYXBoIHByb3ZpZGVycyBtYXkgbmVlZCB0byBpbmNsdWRlIGFkZGl0aW9uYWwgbG9naWMgdG8KK2RlYWwgd2l0aCB0aG9zZSBwb3NzaWJsZSBjb25kaXRpb25zLiBQbGVhc2Ugc2VlIHRoZSBjb25zb2xlIHNlc3Npb25zIGJlbG93IHdoaWNoIHVzZXMgVGlua2VyR3JhcGggdG8gZGVtb25zdHJhdGUgdGhlCitjdXJyZW50IGJlaGF2aW9yYWwgZXhwZWN0YXRpb25zLgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLmdldEdyYXBoKCkuZmVhdHVyZXMoKS52ZXJ0ZXgoKS5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpCis9PT5mYWxzZQorZ3JlbWxpbj4gZy5hZGRWKG51bGwpLnByb3BlcnR5KGlkLCBudWxsKS5wcm9wZXJ0eSgnbmFtZScsbnVsbCkKKz09PnZbMF0KK2dyZW1saW4+IGcuVigpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjAsbGFiZWw6dmVydGV4XQorLi4uCitncmVtbGluPiBnLmdldEdyYXBoKCkuZmVhdHVyZXMoKS52ZXJ0ZXgoKS5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpCis9PT50cnVlCitncmVtbGluPiBnLmFkZFYobnVsbCkucHJvcGVydHkoaWQsIG51bGwpLnByb3BlcnR5KCduYW1lJyxudWxsKQorPT0+dlswXQorZ3JlbWxpbj4gZy5WKCkuZWxlbWVudE1hcCgpCis9PT5baWQ6MCxsYWJlbDp2ZXJ0ZXgsbmFtZTpudWxsXQorLS0tLQorCitJbiB0aGUgYWJvdmUgZXhhbXBsZSwgYGFkZFYoKWAgZGVmYXVsdHMgdG8gYFZlcnRleC5ERUZBVUxUX0xBQkVMYCwgdGhlIGBpZGAgaXMgZ2VuZXJhdGVkIGFuZCBzZXR0aW5nIHRoZSAibmFtZSIKK3Byb3BlcnR5IHRvIGBudWxsYCByZXN1bHRzIGluIHRoZSB2YWx1ZSBub3QgYmVpbmcgc2V0LiBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgc2V0IHRvIGFuIGFjdHVhbCB2YWx1ZSBhbmQgdGhlbiBzZXQKK3RvIGBudWxsYCBUaW5rZXJHcmFwaCB3aWxsIHJlbW92ZSB0aGUgcHJvcGVydHkga2V5IGFsbCB0b2dldGhlcjoKKworW3NvdXJjZSx0ZXh0XQorLS0tLQorZ3JlbWxpbj4gZy5nZXRHcmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkuc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKQorPT0+ZmFsc2UKK2dyZW1saW4+IGcuYWRkVigpLnByb3BlcnR5KCduYW1lJywnc3RlcGhlbicpCis9PT52WzBdCitncmVtbGluPiBnLlYoKS5lbGVtZW50TWFwKCkKKz09PltpZDowLGxhYmVsOnZlcnRleCxuYW1lOnN0ZXBoZW5dCitncmVtbGluPiBnLlYoKS5oYXMoJ3ZlcnRleCcsJ25hbWUnLCdzdGVwaGVuJykucHJvcGVydHkoJ25hbWUnLG51bGwpCis9PT52WzBdCitncmVtbGluPiBnLlYoKS5lbGVtZW50TWFwKCkKKz09PltpZDowLGxhYmVsOnZlcnRleF0KKy4uLgorZ3JlbWxpbj4gZy5nZXRHcmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkuc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKQorPT0+dHJ1ZQorZ3JlbWxpbj4gZy5hZGRWKCkucHJvcGVydHkoJ25hbWUnLCdzdGVwaGVuJykKKz09PnZbMl0KK2dyZW1saW4+IGcuVigpLmhhcygndmVydGV4JywnbmFtZScsJ3N0ZXBoZW4nKS5wcm9wZXJ0eSgnbmFtZScsbnVsbCkKKz09PnZbMl0KK2dyZW1saW4+IGcuVigpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjIsbGFiZWw6dmVydGV4LG5hbWU6bnVsbF0KKy0tLS0KKworVGhlIGFib3ZlIGV4YW1wbGVzIHBvaW50IG91dCB0aGUgZGVmYXVsdCBvcGVyYXRpb25zIG9mIFRpbmtlckdyYXBoLCBidXQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYWN0dWFsbHkgYWNjZXB0IHRoZQorYG51bGxgIGFzIGEgcHJvcGVydHkgdmFsdWUgYW5kIGl0IGlzIHVwIHRvIGdyYXBoIHByb3ZpZGVycyB0byBkZWNpZGVkIGhvdyB0aGV5IHdpc2ggdG8gdHJlYXQgYSBgbnVsbGAgcHJvcGVydHkgdmFsdWUuCitQcm92aWRlcnMgc2hvdWxkIHVzZSB0aGUgbmV3IGBzdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpYCBmZWF0dXJlIHRvIGluZGljYXRlIHRvIHVzZXJzIGhvdyBgbnVsbGAgaXMgaGFuZGxlZC4KKworRm9yIGVkZ2VzLCB0aGUgYGxhYmVsYCBzdGlsbCBjYW5ub3QgYmUgZGVmYXVsdGVkIGFuZCBtdXN0IGJlIHNwZWNpZmllZCwgdGhlcmVmb3JlOgorCitbc291cmNlLHRleHRdCistLS0tCitncmVtbGluPiBnLlYoMEwpLmFzKCdhJykuYWRkRShudWxsKS50bygnYScpCitMYWJlbCBjYW4gbm90IGJlIG51bGwKK1R5cGUgJzpoZWxwJyBvciAnOmgnIGZvciBoZWxwLgorRGlzcGxheSBzdGFjayB0cmFjZT8gW3lOXW4KK2dyZW1saW4+IGcuVigwTCkuYXMoJ2EnKS5hZGRFKGNvbnN0YW50KG51bGwpKS50bygnYScpCitMYWJlbCBjYW4gbm90IGJlIG51bGwKK1R5cGUgJzpoZWxwJyBvciAnOmgnIGZvciBoZWxwLgorRGlzcGxheSBzdGFjayB0cmFjZT8gW3lOXQorLS0tLQorCitBbHNvLCBlZGdlcyBoYXZlIHNpbWlsYXIgYmVoYXZpb3IgdG8gdmVydGljZXMgd2hlbiBpdCBjb21lcyB0byBzZXR0aW5nIHByb3BlcnRpZXMgKGFnYWluLCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvcgorVGlua2VyR3JhcGggaXMgYmVpbmcgdXNlZCBoZXJlKToKKworW3NvdXJjZSx0ZXh0XQorLS0tLQorZ3JlbWxpbj4gZy5nZXRHcmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkuc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKQorPT0+ZmFsc2UKK2dyZW1saW4+IGcuYWRkVigpLnByb3BlcnR5KCduYW1lJywnc3RlcGhlbicpCis9PT52WzBdCitncmVtbGluPiBnLlYoKS5oYXMoJ3ZlcnRleCcsJ25hbWUnLCdzdGVwaGVuJykuYXMoJ2EnKS5hZGRFKCdrbm93cycpLnRvKCdhJykucHJvcGVydHkoaWQsbnVsbCkucHJvcGVydHkoJ3dlaWdodCcsbnVsbCkKKz09PmVbMl1bMC1rbm93cy0+MF0KK2dyZW1saW4+IGcuRSgpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjIsbGFiZWw6a25vd3MsSU46W2lkOjAsbGFiZWw6dmVydGV4XSxPVVQ6W2lkOjAsbGFiZWw6dmVydGV4XV0KK2dyZW1saW4+IGcuRSgpLnByb3BlcnR5KCd3ZWlnaHQnLDAuNSkKKz09PmVbMl1bMC1rbm93cy0+MF0KK2dyZW1saW4+IGcuRSgpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjIsbGFiZWw6a25vd3MsSU46W2lkOjAsbGFiZWw6dmVydGV4XSxPVVQ6W2lkOjAsbGFiZWw6dmVydGV4XSx3ZWlnaHQ6MC41XQorZ3JlbWxpbj4gZy5FKCkucHJvcGVydHkoJ3dlaWdodCcsbnVsbCkKKz09PmVbMl1bMC1rbm93cy0+MF0KK2dyZW1saW4+IGcuRSgpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjIsbGFiZWw6a25vd3MsSU46W2lkOjAsbGFiZWw6dmVydGV4XSxPVVQ6W2lkOjAsbGFiZWw6dmVydGV4XV0KKy4uLgorZ3JlbWxpbj4gZy5nZXRHcmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkuc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKQorPT0+dHJ1ZQorZ3JlbWxpbj4gZy5hZGRWKCkucHJvcGVydHkoJ25hbWUnLCdzdGVwaGVuJykKKz09PnZbOF0KK2dyZW1saW4+IGcuVigpLmhhcygndmVydGV4JywnbmFtZScsJ3N0ZXBoZW4nKS5hcygnYScpLmFkZEUoJ2tub3dzJykudG8oJ2EnKS5wcm9wZXJ0eShpZCxudWxsKS5wcm9wZXJ0eSgnd2VpZ2h0JyxudWxsKQorPT0+ZVsxMF1bOC1rbm93cy0+OF0KK2dyZW1saW4+IGcuRSgpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjEwLGxhYmVsOmtub3dzLElOOltpZDo4LGxhYmVsOnZlcnRleF0sT1VUOltpZDo4LGxhYmVsOnZlcnRleF0sd2VpZ2h0Om51bGxdCitncmVtbGluPiBnLkUoKS5wcm9wZXJ0eSgnd2VpZ2h0JywwLjUpCis9PT5lWzEwXVs4LWtub3dzLT44XQorZ3JlbWxpbj4gZy5FKCkuZWxlbWVudE1hcCgpCis9PT5baWQ6MTAsbGFiZWw6a25vd3MsSU46W2lkOjgsbGFiZWw6dmVydGV4XSxPVVQ6W2lkOjgsbGFiZWw6dmVydGV4XSx3ZWlnaHQ6MC41XQorZ3JlbWxpbj4gZy5FKCkucHJvcGVydHkoJ3dlaWdodCcsbnVsbCkKKz09PmVbMTBdWzgta25vd3MtPjhdCitncmVtbGluPiBnLkUoKS5lbGVtZW50TWFwKCkKKz09PltpZDoxMCxsYWJlbDprbm93cyxJTjpbaWQ6OCxsYWJlbDp2ZXJ0ZXhdLE9VVDpbaWQ6OCxsYWJlbDp2ZXJ0ZXhdLHdlaWdodDpudWxsXQorLS0tLQorCitHcmFwaHMgdGhhdCBzdXBwb3J0IG11bHRpL21ldGEtcHJvcGVydGllcyBoYXZlIHNvbWUgaXNzdWVzIHRvIGNvbnNpZGVyIGFzIHdlbGwgYXMgZGVtb25zdHJhdGVkIHdpdGggVGlua2VyR3JhcGg6CisKK1tzb3VyY2UsdGV4dF0KKy0tLS0KK2dyZW1saW4+IGcuZ2V0R3JhcGgoKS5mZWF0dXJlcygpLnZlcnRleCgpLnN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCkKKz09PmZhbHNlCitncmVtbGluPiBnLmFkZFYoKS5wcm9wZXJ0eShsaXN0LCdmb28nLCJ4IikucHJvcGVydHkobGlzdCwiZm9vIiwgbnVsbCkucHJvcGVydHkobGlzdCwnZm9vJywnYmFyJykKKz09PnZbMF0KK2dyZW1saW4+IGcuVigpLmVsZW1lbnRNYXAoKQorPT0+W2lkOjAsbGFiZWw6dmVydGV4LGZvbzpiYXJdCitncmVtbGluPiBnLlYoKS52YWx1ZU1hcCgpCis9PT5bZm9vOlt4LGJhcl1dCitncmVtbGluPiBnLlYoKS5wcm9wZXJ0eSgnZm9vJyxudWxsKQorPT0+dlswXQorZ3JlbWxpbj4gZy5WKCkudmFsdWVNYXAodHJ1ZSkKKz09PltpZDowLGxhYmVsOnZlcnRleF0KKy4uLgorZ3JlbWxpbj4gZy5hZGRWKCkucHJvcGVydHkobGlzdCwnZm9vJywnYmFyJywneCcsMSwneScsbnVsbCkKKz09PnZbMF0KK2dyZW1saW4+IGcuVigpLnByb3BlcnRpZXMoJ2ZvbycpLnZhbHVlTWFwKHRydWUpCis9PT5baWQ6MSxrZXk6Zm9vLHZhbHVlOmJhcix4OjFdCitncmVtbGluPiBnLlYoKS5wcm9wZXJ0aWVzKCdmb28nKS5wcm9wZXJ0eSgneCcsbnVsbCkKKz09PnZwW2Zvby0+YmFyXQorZ3JlbWxpbj4gZy5WKCkucHJvcGVydGllcygnZm9vJykudmFsdWVNYXAodHJ1ZSkKKz09PltpZDoxLGtleTpmb28sdmFsdWU6YmFyXQorLi4uCitncmVtbGluPiBnLmdldEdyYXBoKCkuZmVhdHVyZXMoKS52ZXJ0ZXgoKS5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpCis9PT5mYWxzZQorZ3JlbWxpbj4gZy5hZGRWKCkucHJvcGVydHkobGlzdCwnZm9vJywieCIpLnByb3BlcnR5KGxpc3QsImZvbyIsIG51bGwpLnByb3BlcnR5KGxpc3QsJ2ZvbycsJ2JhcicpCis9PT52WzExXQorZ3JlbWxpbj4gZy5WKCkuZWxlbWVudE1hcCgpCis9PT5baWQ6MTEsbGFiZWw6dmVydGV4LGZvbzpiYXJdCitncmVtbGluPiBnLlYoKS52YWx1ZU1hcCgpCis9PT5bZm9vOlt4LG51bGwsYmFyXV0KKy4uLgorZ3JlbWxpbj4gZy5hZGRWKCkucHJvcGVydHkobGlzdCwnZm9vJywnYmFyJywneCcsMSwneScsbnVsbCkKKz09PnZbMF0KK2dyZW1saW4+IGcuVigpLnByb3BlcnRpZXMoJ2ZvbycpLnZhbHVlTWFwKHRydWUpCis9PT5baWQ6MSxrZXk6Zm9vLHZhbHVlOmJhcix4OjEseTpudWxsXQorZ3JlbWxpbj4gZy5WKCkucHJvcGVydGllcygnZm9vJykucHJvcGVydHkoJ3gnLG51bGwpCis9PT52cFtmb28tPmJhcl0KK2dyZW1saW4+IGcuVigpLnByb3BlcnRpZXMoJ2ZvbycpLnZhbHVlTWFwKHRydWUpCis9PT5baWQ6MSxrZXk6Zm9vLHZhbHVlOmJhcix4Om51bGwseTpudWxsXQorLS0tLQorCitTZWU6IGxpbms6aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjIzNVtUSU5LRVJQT1AtMjIzNV0sCitsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIwOTlbVElOS0VSUE9QLTIwOTldCisKKz09PT09IEFic3RyYWN0T3BQcm9jZXNzb3IgQVBJIENoYW5nZQorCitUaGUgYGdlbmVyYXRlTWV0YURhdGEoKWAgbWV0aG9kIHdhcyByZW1vdmVkIGFzIGl0IHdhcyBkZXByZWNhdGVkIGluIGEgcHJldmlvdXMgdmVyc2lvbi4gVGhlcmUgYWxyZWFkeSB3YXMgYSBwcmVmZXJyZWQKK21ldGhvZCBjYWxsZWQgYGdlbmVyYXRlUmVzdWx0TWV0YURhdGEoKWAgdGhhdCB0b29rIGFuIGV4dHJhIGBTZXR0aW5nc2AgcGFyYW1ldGVyLiBUbyBmaXggY29tcGlsYXRpb24gaXNzdWVzIHNpbXBseQorcmVwbGFjZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGBnZW5lcmF0ZU1ldGFEYXRhKClgIG1ldGhvZCB3aXRoIGBnZW5lcmF0ZVJlc3VsdE1ldGFEYXRhKClgLiBHcmVtbGluIFNlcnZlciBoYXMKK29ubHkgYmVlbiBjYWxsaW5nIGBnZW5lcmF0ZVJlc3VsdE1ldGFEYXRhKClgIHNpbmNlIHRoZSBkZXByZWNhdGlvbiwgc28gdGhpcyBjb3JyZWN0aW9uIHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQuCisKKz09PT09IFN0b3JlU3RlcCBhbmQgQWdncmVnYXRlU3RlcAorCitOb3RlIHRoYXQgYFN0b3JlU3RlcGAgaGFzIGJlZW4gcmVuYW1lZCB0byBgQWdncmVnYXRlTG9jYWxTdGVwYCBhbmQgYEFnZ3JlZ2F0ZVN0ZXBgIGhhcyBiZWVuIHJlbmFtZWQgdG8KK2BBZ2dyZWdhdGVHbG9iYWxTdGVwYC4gVGhlIHJlbmFtaW5nIGlzIGltcG9ydGFudCB0byBjb25zaWRlciBpZiBhbnkgY3VzdG9tIGBUcmF2ZXJzYWxTdHJhdGVnaWVzYCBoYXZlIGJlZW4gd3JpdHRlbgordGhhdCByZWx5IG9uIHRoZSBvbGQgc3RlcCBuYW1lcy4KKworU2VlOiBsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIyNTRbVElOS0VSUE9QLTIyNTRdCisKKz09PT09IFNlc3Npb24gQ2xvc2UKKworVGlua2VyUG9wIGRyaXZlcnMgbm8gbG9uZ2VyIHNlbmQgdGhlIHNlc3Npb24gImNsb3NlIiBtZXNzYWdlIHRvIGtpbGwgYSBzZXNzaW9uLiBUaGUgY2xvc2Ugb2YgdGhlIGNvbm5lY3Rpb24gaXRzZWxmCitzaG91bGQgYmUgcmVzcG9uc2libGUgZm9yIHRoZSBjbG9zZSBvZiB0aGUgc2Vzc2lvbi4gSXQgaXMgYWxzbyBleHBlY3RlZCB0aGF0IGEgc2Vzc2lvbiBpcyBib3VuZCB0byB0aGUgY2xpZW50IHRoYXQKK2NyZWF0ZWQgaXQuIENsb3NpbmcgdGhlIHNlc3Npb24gZXhwbGljaXRseSBieSBjbG9zaW5nIHRoZSBjb25uZWN0aW9uIHdpbGwgYWN0IGFzIGEgZm9yY2UgY2xvc2Ugd2hlcmUgdHJhbnNhY3Rpb24gYXJlCitub3QgZXhwbGljaXRseSByb2xsZWQtYmFjayBieSBHcmVtbGluIFNlcnZlci4gU3VjaCB0cmFuc2FjdGlvbnMgd291bGQgYmUgaGFuZGxlZCBieSB0aGUgdW5kZXJseWluZyBncmFwaCBzeXN0ZW0gaW4gdGhlCittYW5uZXIgdGhhdCB0aGV5IHByb3ZpZGUuCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMzM2W1RJTktFUlBPUC0yMzM2XQorCis9PT09IEdyYXBoIERyaXZlciBQcm92aWRlcnMKKworPT09PT0gVHJhdmVyc2FsT3BQcm9jZXNzb3IgU2lkZS1lZmZlY3RzCisKK2BUcmF2ZXJzYWxPcFByb2Nlc3NvcmAgbm8gbG9uZ2VyIGhvbGRzIGEgY2FjaGUgb2Ygc2lkZS1lZmZlY3RzIGFuZCBtb3JlIGdlbmVyYWxseSB0aGUgZW50aXJlIHNpZGUtZWZmZWN0IHByb3RvY29sIGhhcworYmVlbiByZW1vdmVkIGFuZCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHRoZSBzZXJ2ZXIgb3IgZHJpdmVycy4KKworU2VlOiBsaW5rOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIyNjlbVElOS0VSUE9QLTIyNjldCisKKz09PT09IENsb3NlIE1lc3NhZ2UKKworVGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlICJjbG9zZSIgbWVzc2FnZSBpcyBubyBsb25nZXIgaW4gcGxhY2UgaW4gR3JlbWxpbiBTZXJ2ZXIuIFNlbmRpbmcgdGhlIG1lc3NhZ2UgKGZyb20gb2xkZXIKK2RyaXZlcnMgZm9yIGV4YW1wbGUpIHdpbGwgc2ltcGx5IHJlc3VsdCBpbiBhIG5vLW9wIG9uIHRoZSBzZXJ2ZXIgYW5kIHRoZSBleHBlY3RlZCByZXR1cm4gb2YgdGhlIGBOT19DT05URU5UYCBtZXNzYWdlLgorRnJvbSAzLjUuMCBmb3J3YXJkLCBkcml2ZXJzIG5lZWQgbm90IHNlbmQgdGhpcyBtZXNzYWdlIHRvIGNsb3NlIHRoZSBzZXNzaW9uIGFuZCBzaW1wbHkgcmVseSBvbiB0aGUgY2xvc2Ugb2YgdGhlCitjb25uZWN0aW9uIHRvIGtpbGwgdGhlIHNlc3Npb24uCisKK1NlZTogbGluazpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RJTktFUlBPUC0yMzM2W1RJTktFUlBPUC0yMzM2XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvc3RhdGljL2ltYWdlcy9ncmVtbGluLXNsZWVwaW5nLWJlYXV0eS5wbmcgYi9kb2NzL3N0YXRpYy9pbWFnZXMvZ3JlbWxpbi1zbGVlcGluZy1iZWF1dHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTVkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3N0YXRpYy9pbWFnZXMvZ3JlbWxpbi1zbGVlcGluZy1iZWF1dHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLWRzbC9wb20ueG1sIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtZHNsL3BvbS54bWwKaW5kZXggMjFiNjgyMC4uYzU1NGNiMiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtZHNsL3BvbS54bWwKKysrIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtZHNsL3BvbS54bWwKQEAgLTIxLDcgKzIxLDcgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KIAogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tYXJjaGV0eXBlLWRzbDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLWRzbC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9SRUFETUUuYXNjaWlkb2MgYi9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1kc2wvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLmFzY2lpZG9jCmluZGV4IDQ5ZmQ3YzguLjE0NzEwMTggMTAwNjQ0Ci0tLSBhL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLWRzbC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9SRUFETUUuYXNjaWlkb2MKKysrIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtZHNsL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL1JFQURNRS5hc2NpaWRvYwpAQCAtMjMsOCArMjMsOCBAQAogCiA9PSBQcmVyZXF1aXNpdGVzCiAKLSogSmF2YSA4IFVwZGF0ZSA0MCsKLSogbGluazpodHRwczovL21hdmVuLmFwYWNoZS5vcmcvW01hdmVuIDMueF0KKyogSmF2YSAxMQorKiBsaW5rOmh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9bTWF2ZW4gMy4zK10KIAogPT0gQnVpbGRpbmcgYW5kIFJ1bm5pbmcKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtZHNsL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1kc2wvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAppbmRleCBkN2JiMzFjLi4yODI3NzlmIDEwMDY0NAotLS0gYS9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1kc2wvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgYi9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1kc2wvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApAQCAtNDksMTUgKzQ5LDQxIEBACiAgICAgPGJ1aWxkPgogICAgICAgICA8cGx1Z2lucz4KICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBUaW5rZXJQb3AzIHJlcXVpcmVzIEphdmEgOCAtLT4KICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjguMDwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KICAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJncz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcmc+LXBhcmFtZXRlcnM8L2FyZz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3M+CiAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgIDwvcGx1Z2lucz4KICAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5qZGsxMTwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8amRrPjExPC9qZGs+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxlYXNlPjg8L3JlbGVhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJncz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZz4tcGFyYW1ldGVyczwvYXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmdzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KIDwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1zZXJ2ZXIvcG9tLnhtbCBiL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXNlcnZlci9wb20ueG1sCmluZGV4IGRmNGQ2NjAuLmUzY2UyZmQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXNlcnZlci9wb20ueG1sCisrKyBiL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXNlcnZlci9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPmdyZW1saW4tYXJjaGV0eXBlPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAKICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLWFyY2hldHlwZS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLmFzY2lpZG9jIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL1JFQURNRS5hc2NpaWRvYwppbmRleCBkNGEwZWIxLi45ZGFhZmIyIDEwMDY0NAotLS0gYS9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLmFzY2lpZG9jCisrKyBiL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9SRUFETUUuYXNjaWlkb2MKQEAgLTI0LDggKzI0LDggQEAKIAogPT0gUHJlcmVxdWlzaXRlcwogCi0qIEphdmEgOCBVcGRhdGUgNDArCi0qIGxpbms6aHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL1tNYXZlbiAzLnhdCisqIEphdmEgMTEKKyogbGluazpodHRwczovL21hdmVuLmFwYWNoZS5vcmcvW01hdmVuIDMuMytdCiAqIEdyZW1saW4gU2VydmVyIGlzIGxpbms6aHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RpbmtlcnBvcC9bZG93bmxvYWRlZF0gYW5kIHVucGFja2FnZWQKIAogPT0gQnVpbGRpbmcgYW5kIFJ1bm5pbmcKZGlmZiAtLWdpdCBhL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKaW5kZXggY2EyOTYwNC4uM2Y0OTQ1YiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKQEAgLTU1LDE5ICs1NSwyMSBAQAogICAgIDxidWlsZD4KICAgICAgICAgPHBsdWdpbnM+CiAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gVGlua2VyUG9wMyByZXF1aXJlcyBKYXZhIDggLS0+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My44LjA8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CiAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJnPi1wYXJhbWV0ZXJzPC9hcmc+CisgICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmdzPgogICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTc8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yMi4wPC92ZXJzaW9uPgogICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8bG9nNGouY29uZmlndXJhdGlvbj5maWxlOmNvbmYvbG9nNGotdGVzdC5wcm9wZXJ0aWVzPC9sb2c0ai5jb25maWd1cmF0aW9uPgpAQCAtNzYsNCArNzgsMjggQEAKICAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8L3BsdWdpbnM+CiAgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+amRrMTE8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGpkaz4xMTwvamRrPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsZWFzZT44PC9yZWxlYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmc+LXBhcmFtZXRlcnM8L2FyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJncz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CiA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L3Jlc291cmNlcy9ncmVtbGluLXNlcnZlci55YW1sIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L3Jlc291cmNlcy9ncmVtbGluLXNlcnZlci55YW1sCmluZGV4IDk1MzBiNTAuLjNiYTkxMmQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvdGVzdC9yZXNvdXJjZXMvZ3JlbWxpbi1zZXJ2ZXIueWFtbAorKysgYi9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL3Rlc3QvcmVzb3VyY2VzL2dyZW1saW4tc2VydmVyLnlhbWwKQEAgLTI4LDggKzI4LDcgQEAKICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguanNyMjIzLlRpbmtlckdyYXBoR3JlbWxpblBsdWdpbjoge30sCiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5TY3JpcHRGaWxlR3JlbWxpblBsdWdpbjoge2ZpbGVzOiBbc2NyaXB0cy9nZW5lcmF0ZS1tb2Rlcm4uZ3Jvb3Z5XX19fX0KIHNlcmlhbGl6ZXJzOgotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IGlvUmVnaXN0cmllczogW29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlcklvUmVnaXN0cnlWM2QwXX19Ci0gIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgc2VyaWFsaXplUmVzdWx0VG9TdHJpbmc6IHRydWUgfX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12MS4wK2dyeW8tc3RyaW5nZAorICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxIH0KIG1ldHJpY3M6IHsKICAgc2xmNGpSZXBvcnRlcjoge2VuYWJsZWQ6IHRydWUsIGludGVydmFsOiAxODAwMDB9fQogc3RyaWN0VHJhbnNhY3Rpb25NYW5hZ2VtZW50OiBmYWxzZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtdGlua2VyZ3JhcGgvcG9tLnhtbCBiL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXRpbmtlcmdyYXBoL3BvbS54bWwKaW5kZXggNzliOGEwMC4uYzNiOWUxOSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtdGlua2VyZ3JhcGgvcG9tLnhtbAorKysgYi9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS10aW5rZXJncmFwaC9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPmdyZW1saW4tYXJjaGV0eXBlPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAKICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLWFyY2hldHlwZS10aW5rZXJncmFwaDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXRpbmtlcmdyYXBoL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL1JFQURNRS5hc2NpaWRvYyBiL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXRpbmtlcmdyYXBoL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL1JFQURNRS5hc2NpaWRvYwppbmRleCBkZGI2ZGU2Li42NTM1NjQ3IDEwMDY0NAotLS0gYS9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS10aW5rZXJncmFwaC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9SRUFETUUuYXNjaWlkb2MKKysrIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtdGlua2VyZ3JhcGgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLmFzY2lpZG9jCkBAIC0yMiw4ICsyMiw4IEBACiAKID09IFByZXJlcXVpc2l0ZXMKIAotKiBKYXZhIDggVXBkYXRlIDQwKwotKiBsaW5rOmh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9bTWF2ZW4gMy54XQorKiBKYXZhIDExCisqIGxpbms6aHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL1tNYXZlbiAzLjMrXQogCiA9PSBCdWlsZGluZyBhbmQgUnVubmluZwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS10aW5rZXJncmFwaC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvZ3JlbWxpbi1hcmNoZXR5cGUvZ3JlbWxpbi1hcmNoZXR5cGUtdGlua2VyZ3JhcGgvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAppbmRleCAwNzI3MzE5Li42ZjFlYmVkIDEwMDY0NAotLS0gYS9ncmVtbGluLWFyY2hldHlwZS9ncmVtbGluLWFyY2hldHlwZS10aW5rZXJncmFwaC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyBiL2dyZW1saW4tYXJjaGV0eXBlL2dyZW1saW4tYXJjaGV0eXBlLXRpbmtlcmdyYXBoL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKQEAgLTQ5LDE1ICs0OSw0MSBAQAogICAgIDxidWlsZD4KICAgICAgICAgPHBsdWdpbnM+CiAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gVGlua2VyUG9wMyByZXF1aXJlcyBKYXZhIDggLS0+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My44LjA8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CiAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJnPi1wYXJhbWV0ZXJzPC9hcmc+CisgICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmdzPgogICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8L3BsdWdpbnM+CiAgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+amRrMTE8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGpkaz4xMTwvamRrPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsZWFzZT44PC9yZWxlYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmc+LXBhcmFtZXRlcnM8L2FyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJncz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CiA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1hcmNoZXR5cGUvcG9tLnhtbCBiL2dyZW1saW4tYXJjaGV0eXBlL3BvbS54bWwKaW5kZXggYzUwYmM4OS4uYWM0MGU0MSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1hcmNoZXR5cGUvcG9tLnhtbAorKysgYi9ncmVtbGluLWFyY2hldHlwZS9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VycG9wPC9hcnRpZmFjdElkPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogCiAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvbnNvbGUvRG9ja2VyZmlsZSBiL2dyZW1saW4tY29uc29sZS9Eb2NrZXJmaWxlCmluZGV4IGZmNTcyMjcuLjMyOTFkNjkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9Eb2NrZXJmaWxlCisrKyBiL2dyZW1saW4tY29uc29sZS9Eb2NrZXJmaWxlCkBAIC0xNSw3ICsxNSw3IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLUZST00gb3Blbmpkazo4LWpyZS1hbHBpbmUKK0ZST00gYWRvcHRvcGVuamRrL29wZW5qZGsxMTphbHBpbmUtc2xpbQogCiBMQUJFTCBtYWludGFpbmVyPSJkZXZAdGlua2VycG9wLmFwYWNoZS5vcmciCiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9iaW4vZ3JlbWxpbi5zaCBiL2dyZW1saW4tY29uc29sZS9iaW4vZ3JlbWxpbi5zaAppbmRleCBiNTg0ZTI4Li5iOGMxZDIxIDEyMDAwMAotLS0gYS9ncmVtbGluLWNvbnNvbGUvYmluL2dyZW1saW4uc2gKKysrIGIvZ3JlbWxpbi1jb25zb2xlL2Jpbi9ncmVtbGluLnNoCkBAIC0xICsxIEBACi0uLi90YXJnZXQvYXBhY2hlLXRpbmtlcnBvcC1ncmVtbGluLWNvbnNvbGUtMy40LjktU05BUFNIT1Qtc3RhbmRhbG9uZS9iaW4vZ3JlbWxpbi5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uL3RhcmdldC9hcGFjaGUtdGlua2VycG9wLWdyZW1saW4tY29uc29sZS0zLjUuMC1TTkFQU0hPVC1zdGFuZGFsb25lL2Jpbi9ncmVtbGluLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3BvbS54bWwgYi9ncmVtbGluLWNvbnNvbGUvcG9tLnhtbAppbmRleCBhMmI2ZTYxLi5kZDViNTE4IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvbnNvbGUvcG9tLnhtbAorKysgYi9ncmVtbGluLWNvbnNvbGUvcG9tLnhtbApAQCAtMjEsNyArMjEsNyBAQAogICAgIDxwYXJlbnQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnRpbmtlcnBvcDwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLWNvbnNvbGU8L2FydGlmYWN0SWQ+CiAgICAgPG5hbWU+QXBhY2hlIFRpbmtlclBvcCA6OiBHcmVtbGluIENvbnNvbGU8L25hbWU+CkBAIC02OCw3ICs2OCw3IEBACiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1hbGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdDwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KQEAgLTMzOSw2ICszMzksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdC9weXRob24iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9weXRob24iIGV4ZWN1dGFibGU9InB5dGhvbjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii0tdmVyc2lvbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlYyBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbiIgZXhlY3V0YWJsZT0idmlydHVhbGVudiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLS12ZXJzaW9uIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uIiBleGVjdXRhYmxlPSJ2aXJ0dWFsZW52IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItLXB5dGhvbj1weXRob24zIGVudiIvPgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvQ29sb3JpemVyLmdyb292eSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL0NvbG9yaXplci5ncm9vdnkKaW5kZXggMGZlZTQwMi4uZjE1NTAyNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvQ29sb3JpemVyLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9Db2xvcml6ZXIuZ3Jvb3Z5CkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5jb25zb2xlOwogCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5BbnNpRGV0ZWN0b3IKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5BbnNpRGV0ZWN0b3IKIGltcG9ydCBvcmcuZnVzZXNvdXJjZS5qYW5zaS5BbnNpCiBpbXBvcnQgb3JnLmZ1c2Vzb3VyY2UuamFuc2kuQW5zaUNvbnNvbGUKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvQ29uc29sZS5ncm9vdnkgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9Db25zb2xlLmdyb292eQppbmRleCAzZGQ4ZTY5Li43ZjI5OWU5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9Db25zb2xlLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9Db25zb2xlLmdyb292eQpAQCAtNDIsMTEgKzQyLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLkdyZW1saW4KIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuaXRlcmF0b3IuQXJyYXlJdGVyYXRvcgotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuRXhpdE5vdGlmaWNhdGlvbgotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5FeGl0Tm90aWZpY2F0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guR3Jvb3Z5c2gKIGltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLklPCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5JbnRlcmFjdGl2ZVNoZWxsUnVubmVyCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcy5TZXRDb21tYW5kCitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guSW50ZXJhY3RpdmVTaGVsbFJ1bm5lcgoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLmNvbW1hbmRzLlNldENvbW1hbmQKIGltcG9ydCBvcmcuZnVzZXNvdXJjZS5qYW5zaS5BbnNpCiBpbXBvcnQgc3VuLm1pc2MuU2lnbmFsCiBpbXBvcnQgc3VuLm1pc2MuU2lnbmFsSGFuZGxlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvR3JlbWxpbkdyb292eXNoLmdyb292eSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL0dyZW1saW5Hcm9vdnlzaC5ncm9vdnkKaW5kZXggOTYwMTVkYi4uYjdjZmQ5NCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvR3JlbWxpbkdyb292eXNoLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9HcmVtbGluR3Jvb3Z5c2guZ3Jvb3Z5CkBAIC0yMiwxMiArMjIsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmNvbnNvbGUuY29tbWFuZHMuR3JlbWxpblNldENvbW1hbmQKIGltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uCiBpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLmN1c3RvbWl6ZXJzLkFTVFRyYW5zZm9ybWF0aW9uQ3VzdG9taXplcgotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tbWFuZAotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Db21tYW5kCitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guR3Jvb3Z5c2gKIGltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLklPCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5QYXJzZUNvZGUKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlBhcnNlcgotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5Db21tYW5kQXJndW1lbnRQYXJzZXIKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5QYXJzZUNvZGUKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5QYXJzZXIKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC51dGlsLkNvbW1hbmRBcmd1bWVudFBhcnNlcgogCiAvKioKICAqIE92ZXJyaWRlcyB0aGUgcG9zaXggc3R5bGUgcGFyc2luZyBvZiBHcm9vdnlzaCBhbGxvd2luZyBmb3IgY29tbWFuZHMgdG8gcGFyc2UgcHJpb3IgdG8gR3Jvb3Z5IDIuNC54LgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvUGx1Z2dlZEluLmdyb292eSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL1BsdWdnZWRJbi5ncm9vdnkKaW5kZXggZmI4N2Y3OS4uZmVjOGZkOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvUGx1Z2dlZEluLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9QbHVnZ2VkSW4uZ3Jvb3Z5CkBAIC0xOCw3ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5jb25zb2xlCiAKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmNvbnNvbGUuUHJlZmVyZW5jZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuQmluZGluZ3NDdXN0b21pemVyCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuR3JlbWxpblBsdWdpbgogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkltcG9ydEN1c3RvbWl6ZXIKQEAgLTI2LDcgKzI1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5jb25zb2xlLkNvbnNvbGVDdXN0b21pemVyCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuY29uc29sZS5HcmVtbGluU2hlbGxFbnZpcm9ubWVudAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLmNvbnNvbGUuUmVtb3RlQWNjZXB0b3IKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkdyb292eXNoCitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guR3Jvb3Z5c2gKIGltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLklPCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvUHJlZmVyZW5jZXMuZ3Jvb3Z5IGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvUHJlZmVyZW5jZXMuZ3Jvb3Z5CmluZGV4IGQ4YzFhZmUuLjYzY2NmZDYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL1ByZWZlcmVuY2VzLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9QcmVmZXJlbmNlcy5ncm9vdnkKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50CiBpbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcgogCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkdyb292eXNoCiBpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5JTwogCiBwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXMgewpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvQnl0ZWNvZGVDb21tYW5kLmdyb292eSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL0J5dGVjb2RlQ29tbWFuZC5ncm9vdnkKaW5kZXggZDI0NTVjYy4uZTg1M2IyNyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvQnl0ZWNvZGVDb21tYW5kLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9CeXRlY29kZUNvbW1hbmQuZ3Jvb3Z5CkBAIC0yNSw4ICsyNSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb24uR3JhcGhTT05NYXBwZXIKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbi5HcmFwaFNPTlZlcnNpb24KIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5zaGFkZWQuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXIKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbXBsZXhDb21tYW5kU3VwcG9ydAotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Db21wbGV4Q29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Hcm9vdnlzaAogCiAvKioKICAqIENvbW1hbmRzIHRoYXQgaGVscCB3b3JrIHdpdGggR3JlbWxpbiBieXRlY29kZS4KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL0Nsc0NvbW1hbmQuZ3Jvb3Z5IGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvQ2xzQ29tbWFuZC5ncm9vdnkKaW5kZXggYjIxZTBjNC4uNDUxZDk0MiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvQ2xzQ29tbWFuZC5ncm9vdnkKKysrIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvQ2xzQ29tbWFuZC5ncm9vdnkKQEAgLTE5LDggKzE5LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5jb25zb2xlLmNvbW1hbmRzCiAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmNvbnNvbGUuTWVkaWF0b3IKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRTdXBwb3J0Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkNvbW1hbmRTdXBwb3J0CitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guR3Jvb3Z5c2gKIAogLyoqCiAgKiBDbGVhciB0aGUgY29uc29sZS4KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL0dyZW1saW5TZXRDb21tYW5kLmdyb292eSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL0dyZW1saW5TZXRDb21tYW5kLmdyb292eQppbmRleCBmODYwNDJkLi5lMDcxZDhlIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9HcmVtbGluU2V0Q29tbWFuZC5ncm9vdnkKKysrIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvR3JlbWxpblNldENvbW1hbmQuZ3Jvb3Z5CkBAIC0yMCw5ICsyMCw5IEBACiAKIGltcG9ydCBqbGluZS5jb25zb2xlLmNvbXBsZXRlci5Db21wbGV0ZXIKIAotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzLlNldENvbW1hbmQKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuUGFja2FnZUhlbHBlcgoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkdyb292eXNoCitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guY29tbWFuZHMuU2V0Q29tbWFuZAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLnV0aWwuUGFja2FnZUhlbHBlcgogaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5QcmVmZXJlbmNlcwogaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5TaW1wbGVDb21wbGV0b3IKIApAQCAtNzksOCArNzksOCBAQAogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIFsKLSAgICAgICAgICAgIG5ldyBTaW1wbGVDb21wbGV0b3IobG9hZGVyKSwKLSAgICAgICAgICAgIG51bGwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQ29tcGxldG9yKGxvYWRlciksCisgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICBdCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvSW5zdGFsbENvbW1hbmQuZ3Jvb3Z5IGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvSW5zdGFsbENvbW1hbmQuZ3Jvb3Z5CmluZGV4IDk3MzZmNDQuLjhmYTJhYWEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL0luc3RhbGxDb21tYW5kLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9JbnN0YWxsQ29tbWFuZC5ncm9vdnkKQEAgLTI1LDggKzI1LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS51dGlsLkFydGlmYWN0CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkudXRpbC5EZXBlbmRlbmN5R3JhYmJlcgogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkdyZW1saW5QbHVnaW4KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRTdXBwb3J0Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkNvbW1hbmRTdXBwb3J0CitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guR3Jvb3Z5c2gKIAogLyoqCiAgKiBJbnN0YWxsIGEgZGVwZW5kZW5jeSBpbnRvIHRoZSBjb25zb2xlLgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvUGx1Z2luQ29tbWFuZC5ncm9vdnkgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9QbHVnaW5Db21tYW5kLmdyb292eQppbmRleCA5OGNkN2NmLi4yODQxZDdkIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9QbHVnaW5Db21tYW5kLmdyb292eQorKysgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9QbHVnaW5Db21tYW5kLmdyb292eQpAQCAtMjAsOCArMjAsOCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5jb25zb2xlLkNvbnNvbGVGcwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uY29uc29sZS5NZWRpYXRvcgotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tcGxleENvbW1hbmRTdXBwb3J0Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkNvbXBsZXhDb21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkdyb292eXNoCiAKIC8qKgogICogQWN0aXZhdGUgYW5kIG1hbmFnZSBhIHBsdWdpbi4KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL1JlbW90ZUNvbW1hbmQuZ3Jvb3Z5IGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvUmVtb3RlQ29tbWFuZC5ncm9vdnkKaW5kZXggNjhlNDhkOS4uNGUyNWExYSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvUmVtb3RlQ29tbWFuZC5ncm9vdnkKKysrIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvY29tbWFuZHMvUmVtb3RlQ29tbWFuZC5ncm9vdnkKQEAgLTIxLDggKzIxLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmNvbnNvbGUuTWVkaWF0b3IKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5jb25zb2xlLlJlbW90ZUFjY2VwdG9yCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuY29uc29sZS5SZW1vdGVFeGNlcHRpb24KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbXBsZXhDb21tYW5kU3VwcG9ydAotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Db21wbGV4Q29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Hcm9vdnlzaAogCiAvKioKICAqIENvbmZpZ3VyZSBhIHJlbW90ZSBjb25uZWN0aW9uIHRvIGEgR3JlbWxpbiBTZXJ2ZXIuCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9TdWJtaXRDb21tYW5kLmdyb292eSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL1N1Ym1pdENvbW1hbmQuZ3Jvb3Z5CmluZGV4IDUwMjE0NTguLmVjMTU2Y2IgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL1N1Ym1pdENvbW1hbmQuZ3Jvb3Z5CisrKyBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL1N1Ym1pdENvbW1hbmQuZ3Jvb3Z5CkBAIC0xOSw4ICsxOSw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uY29uc29sZS5jb21tYW5kcwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5jb25zb2xlLk1lZGlhdG9yCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kU3VwcG9ydAotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Db21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkdyb292eXNoCiAKIC8qKgogICogU3VibWl0IGEgc2NyaXB0IHRvIGEgR3JlbWxpbiBTZXJ2ZXIgaW5zdGFuY2UuCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9jb21tYW5kcy9Vbmluc3RhbGxDb21tYW5kLmdyb292eSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL1VuaW5zdGFsbENvbW1hbmQuZ3Jvb3Z5CmluZGV4IDI4NWEyMzEuLjk4MjEwMmEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL1VuaW5zdGFsbENvbW1hbmQuZ3Jvb3Z5CisrKyBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2NvbW1hbmRzL1VuaW5zdGFsbENvbW1hbmQuZ3Jvb3Z5CkBAIC0yMCw4ICsyMCw4IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmNvbnNvbGUuQ29uc29sZUZzCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5jb25zb2xlLk1lZGlhdG9yCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kU3VwcG9ydAotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Db21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5hcGFjaGUuZ3Jvb3Z5Lmdyb292eXNoLkdyb292eXNoCiAKIC8qKgogICogVW5pbnN0YWxsIGEgbWF2ZW4gZGVwZW5kZW5jeSBmcm9tIHRoZSBDb25zb2xlJ3MgcGF0aC4KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2pzcjIyMy9HZXBoaVRyYXZlcnNhbFZpc3VhbGl6YXRpb25TdHJhdGVneS5ncm9vdnkgYi9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvR2VwaGlUcmF2ZXJzYWxWaXN1YWxpemF0aW9uU3RyYXRlZ3kuZ3Jvb3Z5CmluZGV4IDVlNDQ4MDAuLjRjYjhmZmQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2pzcjIyMy9HZXBoaVRyYXZlcnNhbFZpc3VhbGl6YXRpb25TdHJhdGVneS5ncm9vdnkKKysrIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL0dlcGhpVHJhdmVyc2FsVmlzdWFsaXphdGlvblN0cmF0ZWd5Lmdyb292eQpAQCAtMjgsNyArMjgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuRWRnZVZlcnRleFN0ZXAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLkdyYXBoU3RlcAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuVmVydGV4U3RlcAotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LkFnZ3JlZ2F0ZVN0ZXAKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5BZ2dyZWdhdGVHbG9iYWxTdGVwCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuTGFtYmRhU2lkZUVmZmVjdFN0ZXAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5CdWxrU2V0CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5BYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5CkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoYWNjZXB0b3Iudml6U3RlcERlbGF5KQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSksIHMsIHRyYXZlcnNhbCkKLSAgICAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuaW5zZXJ0QWZ0ZXJTdGVwKG5ldyBBZ2dyZWdhdGVTdGVwKHRyYXZlcnNhbCwgc2lkZUVmZmVjdEtleSksIHMsIHRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuaW5zZXJ0QWZ0ZXJTdGVwKG5ldyBBZ2dyZWdhdGVHbG9iYWxTdGVwKHRyYXZlcnNhbCwgc2lkZUVmZmVjdEtleSksIHMsIHRyYXZlcnNhbCkKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZGVjYXkgYWxsIHZlcnRpY2VzIGV4Y2VwdCB0aG9zZSB0aGF0IG1hZGUgaXQgdGhyb3VnaCB0aGUgZmlsdGVyIC0gInRoaXMgd2F5IHlvdSBjYW4gd2F0Y2gKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGFjY2VwdG9yLnZpelN0ZXBEZWxheSkKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0pLCBzLCB0cmF2ZXJzYWwpCi0gICAgICAgICAgICAgICAgVHJhdmVyc2FsSGVscGVyLmluc2VydEFmdGVyU3RlcChuZXcgQWdncmVnYXRlU3RlcCh0cmF2ZXJzYWwsIHNpZGVFZmZlY3RLZXkpLCBzLCB0cmF2ZXJzYWwpCisgICAgICAgICAgICAgICAgVHJhdmVyc2FsSGVscGVyLmluc2VydEFmdGVyU3RlcChuZXcgQWdncmVnYXRlR2xvYmFsU3RlcCh0cmF2ZXJzYWwsIHNpZGVFZmZlY3RLZXkpLCBzLCB0cmF2ZXJzYWwpCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL0RyaXZlckdyZW1saW5QbHVnaW4uamF2YSBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvRHJpdmVyR3JlbWxpblBsdWdpbi5qYXZhCmluZGV4IDgwYTc4YWIuLjJmMTJjNGMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvRHJpdmVyR3JlbWxpblBsdWdpbi5qYXZhCisrKyBiL2dyZW1saW4tY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvRHJpdmVyR3JlbWxpblBsdWdpbi5qYXZhCkBAIC0zNSw3ICszNSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXNwb25zZVN0YXR1c0NvZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIucmVtb3RlLkRyaXZlclJlbW90ZUNvbm5lY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIucmVtb3RlLkRyaXZlclJlbW90ZVRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5yZW1vdGUuRHJpdmVyUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplckdyZW1saW5WMWQwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyR3JlbWxpblYyZDA7CkBAIC05Myw4ICs5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6ZXJzLmNsYXNzLAogICAgICAgICAgICAgICAgICAgICBTZXJUb2tlbnMuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIERyaXZlclJlbW90ZUNvbm5lY3Rpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIERyaXZlclJlbW90ZVRyYXZlcnNhbC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgRHJpdmVyUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMuY2xhc3MpLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgICAgICBEcml2ZXJSZW1vdGVUcmF2ZXJzYWwuY2xhc3MpLmNyZWF0ZSgpOwogCiAgICAgcHVibGljIERyaXZlckdyZW1saW5QbHVnaW4oKSB7CiAgICAgICAgIHN1cGVyKE5BTUUsIGltcG9ydHMsIG5ldyBEcml2ZXJDb25zb2xlQ3VzdG9taXplcigpKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvRHJpdmVyUmVtb3RlQWNjZXB0b3JJbnRlZ3JhdGVUZXN0LmphdmEgYi9ncmVtbGluLWNvbnNvbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL0RyaXZlclJlbW90ZUFjY2VwdG9ySW50ZWdyYXRlVGVzdC5qYXZhCmluZGV4IDMxMGE0OWEuLjIyZWM0YmMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvRHJpdmVyUmVtb3RlQWNjZXB0b3JJbnRlZ3JhdGVUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2pzcjIyMy9Ecml2ZXJSZW1vdGVBY2NlcHRvckludGVncmF0ZVRlc3QuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLlNldHRpbmdzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLlN0b3JhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaDsKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Hcm9vdnlzaDsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvRHJpdmVyUmVtb3RlQWNjZXB0b3JUZXN0LmphdmEgYi9ncmVtbGluLWNvbnNvbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL0RyaXZlclJlbW90ZUFjY2VwdG9yVGVzdC5qYXZhCmluZGV4IGFiMTFkMmUuLjBjYzg5NWIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvRHJpdmVyUmVtb3RlQWNjZXB0b3JUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2pzcjIyMy9Ecml2ZXJSZW1vdGVBY2NlcHRvclRlc3QuamF2YQpAQCAtMjEsNyArMjEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uVGVzdEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5jb25zb2xlLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5TdG9yYWdlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2g7CitpbXBvcnQgb3JnLmFwYWNoZS5ncm9vdnkuZ3Jvb3Z5c2guR3Jvb3Z5c2g7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvbnNvbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL0dlcGhpUmVtb3RlQWNjZXB0b3JJbnRlZ3JhdGVUZXN0LmphdmEgYi9ncmVtbGluLWNvbnNvbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL0dlcGhpUmVtb3RlQWNjZXB0b3JJbnRlZ3JhdGVUZXN0LmphdmEKaW5kZXggYjFmOGVmZi4uN2MyNjlmNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb25zb2xlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2pzcjIyMy9HZXBoaVJlbW90ZUFjY2VwdG9ySW50ZWdyYXRlVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvR2VwaGlSZW1vdGVBY2NlcHRvckludGVncmF0ZVRlc3QuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLmNvbnNvbGUuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaDsKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Hcm9vdnlzaDsKIGltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLklPOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvbnNvbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL01vY2tHcm9vdnlHcmVtbGluU2hlbGxFbnZpcm9ubWVudC5qYXZhIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2pzcjIyMy9Nb2NrR3Jvb3Z5R3JlbWxpblNoZWxsRW52aXJvbm1lbnQuamF2YQppbmRleCBlMjRiNzdjLi5lMTNlZmI2IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvbnNvbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL01vY2tHcm9vdnlHcmVtbGluU2hlbGxFbnZpcm9ubWVudC5qYXZhCisrKyBiL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvTW9ja0dyb292eUdyZW1saW5TaGVsbEVudmlyb25tZW50LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5jb25zb2xlLmpzcjIyMzsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLmNvbnNvbGUuR3JlbWxpblNoZWxsRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaDsKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Hcm9vdnlzaDsKIGltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLklPOwogCiAvKioKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvVXRpbGl0aWVzR3JlbWxpblBsdWdpblRlc3QuamF2YSBiL2dyZW1saW4tY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vY29uc29sZS9qc3IyMjMvVXRpbGl0aWVzR3JlbWxpblBsdWdpblRlc3QuamF2YQppbmRleCAzODVlMDg2Li5iZWUxNGFkIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvbnNvbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2NvbnNvbGUvanNyMjIzL1V0aWxpdGllc0dyZW1saW5QbHVnaW5UZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1jb25zb2xlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9jb25zb2xlL2pzcjIyMy9VdGlsaXRpZXNHcmVtbGluUGx1Z2luVGVzdC5qYXZhCkBAIC0yMSw3ICsyMSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0Lk51bGxJbnB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmNvbnNvbGUuUGx1Z2dlZEluOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Hcm9vdnlzaDsKK2ltcG9ydCBvcmcuYXBhY2hlLmdyb292eS5ncm9vdnlzaC5Hcm9vdnlzaDsKIGltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLklPOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvcG9tLnhtbCBiL2dyZW1saW4tY29yZS9wb20ueG1sCmluZGV4IDRlOTNmMzQuLmNlMjQzYWQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9wb20ueG1sCisrKyBiL2dyZW1saW4tY29yZS9wb20ueG1sCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnRpbmtlcnBvcDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tY29yZTwvYXJ0aWZhY3RJZD4KICAgICA8bmFtZT5BcGFjaGUgVGlua2VyUG9wIDo6IEdyZW1saW4gQ29yZTwvbmFtZT4KQEAgLTMxLDggKzMxLDEyIEBACiAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbmZpZ3VyYXRpb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbmZpZ3VyYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbmZpZ3VyYXRpb24yPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1iZWFudXRpbHM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWJlYW51dGlsczwvYXJ0aWZhY3RJZD4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CkBAIC0xMDUsMTMgKzEwOSw0MiBAQAogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtYWxsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3Q8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLnRlc3RpbmcuY29tcGlsZTwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbXBpbGUtdGVzdGluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjAuMTA8L3ZlcnNpb24+CisgICAgICAgICAgICA8dmVyc2lvbj4wLjE1PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5lcnJvcnByb25lPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lcnJvcl9wcm9uZV9hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHJlc29sdmUgc2VsZi1jb25mbGljdCB3aXRoaW4gY29tcGlsZS10ZXN0aW5nIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIzLjQtYW5kcm9pZDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZXJyb3Jwcm9uZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXJyb3JfcHJvbmVfYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmVycm9ycHJvbmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lcnJvcl9wcm9uZV9hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xOTwvdmVyc2lvbj4KICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICAgICAgICAgIDxleGNsdXNpb25zPgogICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgpAQCAtMTU0LDQgKzE4NywzMSBAQAogICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgIDwvcGx1Z2lucz4KICAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5qZGsxMTwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8amRrPjExPC9qZGs+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsZWFzZT44PC9yZWxlYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGlsZXJBcmdzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZz4tcGFyYW1ldGVyczwvYXJnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZz4tcHJvYzpub25lPC9hcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmdzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2pzcjIyMy9Db3JlSW1wb3J0cy5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9qc3IyMjMvQ29yZUltcG9ydHMuamF2YQppbmRleCBjYzc4ODFjLi45YWRmMDNiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2pzcjIyMy9Db3JlSW1wb3J0cy5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vanNyMjIzL0NvcmVJbXBvcnRzLmphdmEKQEAgLTE5LDI4ICsxOSwyNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29tYmluZWRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbXBvc2l0ZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uRmlsZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uSGllcmFyY2hpY2FsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5NYXBDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLlByb3BlcnRpZXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLlN1YnNldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uWE1MQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbWJpbmVkQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29tcG9zaXRlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5GaWxlQmFzZWRDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5IaWVyYXJjaGljYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Qcm9wZXJ0aWVzQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuU3Vic2V0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuWE1MQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuYnVpbGRlci5CYXNpY0NvbmZpZ3VyYXRpb25CdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5idWlsZGVyLkZpbGVCYXNlZENvbmZpZ3VyYXRpb25CdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5idWlsZGVyLmZsdWVudC5Db25maWd1cmF0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkNvbXB1dGVyUmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NZW1vcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLlZlcnRleFByb2dyYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmJ1bGtkdW1waW5nLkJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZy5CdWxrTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZy5CdWxrTG9hZGVyVmVydGV4UHJvZ3JhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuYnVsa2xvYWRpbmcuSW5jcmVtZW50YWxCdWxrTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZy5PbmVUaW1lQnVsa0xvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuY2xvbmUuQ2xvbmVWZXJ0ZXhQcm9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5jbHVzdGVyaW5nLmNvbm5lY3RlZC5Db25uZWN0ZWRDb21wb25lbnRWZXJ0ZXhQcm9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5jbHVzdGVyaW5nLnBlZXJwcmVzc3VyZS5DbHVzdGVyQ291bnRNYXBSZWR1Y2U7CkBAIC04NSw2ICs4Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5maW5hbGl6YXRpb24uTWF0Y2hBbGdvcml0aG1TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmZpbmFsaXphdGlvbi5Qcm9maWxlU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uQWRqYWNlbnRUb0luY2lkZW50U3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5FYXJseUxpbWl0U3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uRmlsdGVyUmFua2luZ1N0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLklkZW50aXR5UmVtb3ZhbFN0cmF0ZWd5OwpAQCAtMjI0LDE0ICsyMjIsMTMgQEAKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQ29tYmluZWRDb25maWd1cmF0aW9uLmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQ29tcG9zaXRlQ29uZmlndXJhdGlvbi5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKENvbmZpZ3VyYXRpb24uY2xhc3MpOwotICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChDb25maWd1cmF0aW9uQnVpbGRlci5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKENvbmZpZ3VyYXRpb25VdGlscy5jbGFzcyk7Ci0gICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKEZpbGVDb25maWd1cmF0aW9uLmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoSGllcmFyY2hpY2FsQ29uZmlndXJhdGlvbi5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKE1hcENvbmZpZ3VyYXRpb24uY2xhc3MpOwogICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChQcm9wZXJ0aWVzQ29uZmlndXJhdGlvbi5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKFN1YnNldENvbmZpZ3VyYXRpb24uY2xhc3MpOwogICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChYTUxDb25maWd1cmF0aW9uLmNsYXNzKTsKKyAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQ29uZmlndXJhdGlvbnMuY2xhc3MpOwogICAgICAgICAvLyBzdHJhdGVnaWVzCiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKENvbm5lY3RpdmVTdHJhdGVneS5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKEVsZW1lbnRJZFN0cmF0ZWd5LmNsYXNzKTsKQEAgLTI0Myw2ICsyNDAsOCBAQAogICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChNYXRjaEFsZ29yaXRobVN0cmF0ZWd5LmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoUHJvZmlsZVN0cmF0ZWd5LmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQWRqYWNlbnRUb0luY2lkZW50U3RyYXRlZ3kuY2xhc3MpOworICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5LmNsYXNzKTsKKyAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQ291bnRTdHJhdGVneS5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKEZpbHRlclJhbmtpbmdTdHJhdGVneS5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKElkZW50aXR5UmVtb3ZhbFN0cmF0ZWd5LmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoSW5jaWRlbnRUb0FkamFjZW50U3RyYXRlZ3kuY2xhc3MpOwpAQCAtMjUwLDcgKzI0OSw2IEBACiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKEVhcmx5TGltaXRTdHJhdGVneS5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKE9yZGVyTGltaXRTdHJhdGVneS5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKFBhdGhQcm9jZXNzb3JTdHJhdGVneS5jbGFzcyk7Ci0gICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKENvdW50U3RyYXRlZ3kuY2xhc3MpOwogICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChDb21wdXRlclZlcmlmaWNhdGlvblN0cmF0ZWd5LmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoTGFtYmRhUmVzdHJpY3Rpb25TdHJhdGVneS5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKFJlYWRPbmx5U3RyYXRlZ3kuY2xhc3MpOwpAQCAtMjc1LDExICsyNzMsNiBAQAogICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChNZW1vcnkuY2xhc3MpOwogICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChWZXJ0ZXhQcm9ncmFtLmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQ2xvbmVWZXJ0ZXhQcm9ncmFtLmNsYXNzKTsKLSAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQnVsa0R1bXBlclZlcnRleFByb2dyYW0uY2xhc3MpOwotICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChCdWxrTG9hZGVyLmNsYXNzKTsKLSAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoQnVsa0xvYWRlclZlcnRleFByb2dyYW0uY2xhc3MpOwotICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChJbmNyZW1lbnRhbEJ1bGtMb2FkZXIuY2xhc3MpOwotICAgICAgICBDTEFTU19JTVBPUlRTLmFkZChPbmVUaW1lQnVsa0xvYWRlci5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKENsdXN0ZXJDb3VudE1hcFJlZHVjZS5jbGFzcyk7CiAgICAgICAgIENMQVNTX0lNUE9SVFMuYWRkKENsdXN0ZXJQb3B1bGF0aW9uTWFwUmVkdWNlLmNsYXNzKTsKICAgICAgICAgQ0xBU1NfSU1QT1JUUy5hZGQoTWVtb3J5VHJhdmVyc2FsU2lkZUVmZmVjdHMuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9qc3IyMjMvSmF2YVRyYW5zbGF0b3IuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vanNyMjIzL0phdmFUcmFuc2xhdG9yLmphdmEKaW5kZXggNzk0NWQ3Yy4uNjAzNDc5MyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9qc3IyMjMvSmF2YVRyYW5zbGF0b3IuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2pzcjIyMy9KYXZhVHJhbnNsYXRvci5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLk1hcENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5CeXRlY29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYW5zbGF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CkBAIC0yMTQsNyArMjE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzW2ldLmlzVmFyQXJncygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHBhcmFtZXRlckNsYXNzID0gcGFyYW1ldGVyc1tpXS5nZXRUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzQ29weS5sZW5ndGggPiBpICYmICFwYXJhbWV0ZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGFyZ3VtZW50c0NvcHlbaV0uZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c0NvcHkubGVuZ3RoID4gaSAmJiBhcmd1bWVudHNDb3B5W2ldICE9IG51bGwgJiYgIXBhcmFtZXRlckNsYXNzLmlzQXNzaWduYWJsZUZyb20oYXJndW1lbnRzQ29weVtpXS5nZXRDbGFzcygpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMjYsMTMgKzIyNiwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBcmd1bWVudHNbaV0gPSB2YXJBcmdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGFyZ3VtZW50c0NvcHkubGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtZXRlcnNbaV0uZ2V0VHlwZSgpLmlzQXNzaWduYWJsZUZyb20oYXJndW1lbnRzQ29weVtpXS5nZXRDbGFzcygpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZGV0ZWN0IHRoZSByaWdodCBtZXRob2QgYnkgY29tcGFyaW5nIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGFyZ3VtZW50LiBkb2Vzbid0IGFsd2F5cyB3b3JrIHNvIHdlbGwgYmVjYXVzZSBvZiBudWxsIGFyZ3VtZW50cyB3aGljaCBkb24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBicmluZyB0aGVpciB0eXBlIGluIGJ5dGVjb2RlIGFuZCByZWx5IG9uIHBvc2l0aW9uLiB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gb2Z0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4ubHVja2lseS4uLmJlY2F1c2UgbWV0aG9kIHNpZ25hdHVyZXMgdGVuZCB0byBiZSBzdWZmaWNpZW50bHkgdW5pcXVlIGFuZCBkbyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5jb3VyYWdlIHdoYWNreSB1c2UgLSBsaWtlIGcuVigpLmhhcyhudWxsLCBudWxsKSBpcyBjbGVhcmx5IGludmFsaWQgc28gd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBuZWVkIHRvIHRyeSB0byBzb3J0IHRoYXQgb3V0LiBvbiB0aGUgb3RoZXIgaGFuZCBnLlYoKS5oYXMoJ25hbWUnLG51bGwpIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHZhbGlkIGhpdHMgbGlrZSBmb3VyIGRpZmZlcmVudCBwb3NzaWJsZSBvdmVybG9hZHMsIGJ1dCB3ZSBjYW4gcmVseSBvbiB0aGUgbW9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmljIG9uZSB3aGljaCB0YWtlcyBPYmplY3QgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIHRoYXQgc2VlbXMgdG8gd29yayBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UsIGJ1dCBpdCdzIGEgc2hhbWUgdGhpcyBpc24ndCBuaWNlci4gc2VlbXMgbGlrZSBuaWNlciB3b3VsZCBtZWFuIGEgaGVhdnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcmhhdWwgdG8gR3JlbWxpbiBvciB0byBHTFZzL2J5dGVjb2RlIGFuZC9vciB0byBzZXJpYWxpemF0aW9uIG1lY2hhbmlzbXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjaGVjayB3aGVyZSBhcmd1bWVudHNDb3B5W2ldIGlzIG51bGwgY291bGQgYmUgYWNjb21wYW5pZWQgYnkgYSB0eXBlIGNoZWNrIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd2FibGUgc2lnbmF0dXJlcyBsaWtlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudWxsID09IGFyZ3VtZW50c0NvcHlbaV0gJiYgcGFyYW1ldGVyc1tpXS5nZXRUeXBlKCkgPT0gT2JqZWN0LmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbSBoZWxwZnVsLiBwZXJoYXBzIHRoaXMgYXBwcm9hY2ggaXMgZmluZSBhcyBsb25nIGFzIHdlIGVuc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSBvZiBudWxsIGNhbGxzIHRvIGFsbCBvdmVybG9hZHMuIGluIG90aGVyIHdvcmRzIGFkZFYoU3RyaW5nKSBtdXN0IGJlaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBhcyBhZGRWKFRyYXZlcnNhbCkgaWYgbnVsbCBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudC4gc28gZmFyLCB0aGF0IHNlZW1zIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHRoZSBjYXNlLiBpZiB3ZSBmaW5kIHRoYXQgaXMgbm90IGhhcHBlbmluZyB3ZSBlaXRoZXIgZml4IHRoYXQgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jb25zaXN0ZW5jeSwgc3RhcnQgc3BlY2lhbCBjYXNpbmcgdGhvc2UgbWV0aG9kIGZpbmRzIGhlcmUsIG9yIGFzIG1lbnRpb25lZCBhYm92ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgZmFyIG1vcmUgZHJhc3RpYyB0aGF0IGRvZXNuJ3QgaW52b2x2ZSByZWZsZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGFyZ3VtZW50c0NvcHkubGVuZ3RoICYmIChudWxsID09IGFyZ3VtZW50c0NvcHlbaV0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJndW1lbnRzQ29weVtpXSAhPSBudWxsICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ldLmdldFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKGFyZ3VtZW50c0NvcHlbaV0uZ2V0Q2xhc3MoKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbWV0ZXJzW2ldLmdldFR5cGUoKS5pc1ByaW1pdGl2ZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhcmd1bWVudHNDb3B5W2ldLmdldENsYXNzKCkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzQ29weVtpXS5nZXRDbGFzcygpLmVxdWFscyhCb29sZWFuLmNsYXNzKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c0NvcHlbaV0uZ2V0Q2xhc3MoKS5lcXVhbHMoQnl0ZS5jbGFzcykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNDb3B5W2ldLmdldENsYXNzKCkuZXF1YWxzKENoYXJhY3Rlci5jbGFzcykpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNDb3B5W2ldLmdldENsYXNzKCkuZXF1YWxzKENoYXJhY3Rlci5jbGFzcykpKSkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXJndW1lbnRzW2ldID0gYXJndW1lbnRzQ29weVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvTWFwUmVkdWNlLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvTWFwUmVkdWNlLmphdmEKaW5kZXggNjBhOGFkMy4uMDU5OTZhZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL01hcFJlZHVjZS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9NYXBSZWR1Y2UuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnV0aWwuRGVmYXVsdENvbXB1dGVyUmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9WZXJ0ZXhQcm9ncmFtLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvVmVydGV4UHJvZ3JhbS5qYXZhCmluZGV4IDU2Mzc3NDAuLjY4MmNhNWIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9WZXJ0ZXhQcm9ncmFtLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL1ZlcnRleFByb2dyYW0uamF2YQpAQCAtMTksNyArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIuVHJhdmVyc2VyUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9idWxrZHVtcGluZy9CdWxrRHVtcGVyVmVydGV4UHJvZ3JhbS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtkdW1waW5nL0J1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MGZjYzIuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtkdW1waW5nL0J1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrZHVtcGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NZW1vcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLk1lc3NhZ2VTY29wZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5WZXJ0ZXhQcm9ncmFtOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5jbG9uZS5DbG9uZVZlcnRleFByb2dyYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnV0aWwuQWJzdHJhY3RWZXJ0ZXhQcm9ncmFtQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5TdHJpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5qYXZhdHVwbGVzLlR1cGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCByZXBsYWNlZCBieSB7QGxpbmsgQ2xvbmVWZXJ0ZXhQcm9ncmFtfS4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBCdWxrRHVtcGVyVmVydGV4UHJvZ3JhbSBpbXBsZW1lbnRzIFZlcnRleFByb2dyYW08VHVwbGU+IHsKLQotICAgIHByaXZhdGUgQnVsa0R1bXBlclZlcnRleFByb2dyYW0oKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0dXAoZmluYWwgTWVtb3J5IG1lbW9yeSkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgVmVydGV4IHNvdXJjZVZlcnRleCwgZmluYWwgTWVzc2VuZ2VyPFR1cGxlPiBtZXNzZW5nZXIsIGZpbmFsIE1lbW9yeSBtZW1vcnkpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXJtaW5hdGUoZmluYWwgTWVtb3J5IG1lbW9yeSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PE1lc3NhZ2VTY29wZT4gZ2V0TWVzc2FnZVNjb3BlcyhmaW5hbCBNZW1vcnkgbWVtb3J5KSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ2xvbmVEb2VzbnREZWNsYXJlQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iLCAiQ2xvbmVEb2VzbnRDYWxsU3VwZXJDbG9uZSJ9KQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWZXJ0ZXhQcm9ncmFtPFR1cGxlPiBjbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEdyYXBoQ29tcHV0ZXIuUmVzdWx0R3JhcGggZ2V0UHJlZmVycmVkUmVzdWx0R3JhcGgoKSB7Ci0gICAgICAgIHJldHVybiBHcmFwaENvbXB1dGVyLlJlc3VsdEdyYXBoLk5FVzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR3JhcGhDb21wdXRlci5QZXJzaXN0IGdldFByZWZlcnJlZFBlcnNpc3QoKSB7Ci0gICAgICAgIHJldHVybiBHcmFwaENvbXB1dGVyLlBlcnNpc3QuRURHRVM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ0ZhY3RvcnkudmVydGV4UHJvZ3JhbVN0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIEFic3RyYWN0VmVydGV4UHJvZ3JhbUJ1aWxkZXI8QnVpbGRlcj4gewotCi0gICAgICAgIHByaXZhdGUgQnVpbGRlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKEJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtIGNyZWF0ZShmaW5hbCBHcmFwaCBncmFwaCkgewotICAgICAgICAgICAgcmV0dXJuIChCdWxrRHVtcGVyVmVydGV4UHJvZ3JhbSkgVmVydGV4UHJvZ3JhbS5jcmVhdGVWZXJ0ZXhQcm9ncmFtKGdyYXBoLCBjb25maWd1cmF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9idWxrbG9hZGluZy9CdWxrTG9hZGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvYnVsa2xvYWRpbmcvQnVsa0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY3ZjczLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9idWxrbG9hZGluZy9CdWxrTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgLSBjb25zaWRlciBncmFwaCBwcm92aWRlciBzcGVjaWZpYyBidWxrIGxvYWRpbmcgbWV0aG9kcwotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGludGVyZmFjZSBCdWxrTG9hZGVyIHsKLQotICAgIC8qKgotICAgICAqIEdldHMgb3IgY3JlYXRlcyBhIGNsb25lIG9mIHRoZSBnaXZlbiB2ZXJ0ZXggaW4gdGhlIGdpdmVuIGdyYXBoLgotICAgICAqCi0gICAgICogQHBhcmFtIHZlcnRleCBUaGUgdmVydGV4IHRvIGJlIGNsb25lZC4KLSAgICAgKiBAcGFyYW0gZ3JhcGggIFRoZSBncmFwaCB0aGF0IGhvbGRzIHRoZSBjbG9uZWQgdmVydGV4IGFmdGVyIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQuCi0gICAgICogQHBhcmFtIGcgICAgICBBIHN0YW5kYXJkIHRyYXZlcnNhbCBzb3VyY2UgZm9yIHRoZSBnaXZlbiBncmFwaC4KLSAgICAgKiBAcmV0dXJuIFRoZSBjbG9uZWQgdmVydGV4LgotICAgICAqLwotICAgIHB1YmxpYyBWZXJ0ZXggZ2V0T3JDcmVhdGVWZXJ0ZXgoZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBnaXZlbiBlZGdlIGJldHdlZW4gdGhlIGdpdmVuIGluLSBhbmQgb3V0LXZlcnRpY2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVkZ2UgICAgICBUaGUgZWRnZSB0byBiZSBjbG9uZWQuCi0gICAgICogQHBhcmFtIG91dFZlcnRleCBUaGUgb3V0LXZlcnRleCBpbiB0aGUgZ2l2ZW4gZ3JhcGguLgotICAgICAqIEBwYXJhbSBpblZlcnRleCAgVGhlIGluLXZlcnRleCBpbiB0aGUgZ2l2ZW4gZ3JhcGguCi0gICAgICogQHBhcmFtIGdyYXBoICAgICBUaGUgZ3JhcGggdGhhdCBob2xkcyB0aGUgY2xvbmVkIGVkZ2UgYWZ0ZXIgdGhpcyBtZXRob2Qgd2FzIGNhbGxlZC4KLSAgICAgKiBAcGFyYW0gZyAgICAgICAgIEEgc3RhbmRhcmQgdHJhdmVyc2FsIHNvdXJjZSBmb3IgdGhlIGdpdmVuIGdyYXBoLgotICAgICAqIEByZXR1cm4gVGhlIGNsb25lZCBlZGdlLgotICAgICAqLwotICAgIHB1YmxpYyBkZWZhdWx0IEVkZ2UgY3JlYXRlRWRnZShmaW5hbCBFZGdlIGVkZ2UsIGZpbmFsIFZlcnRleCBvdXRWZXJ0ZXgsIGZpbmFsIFZlcnRleCBpblZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpIHsKLSAgICAgICAgZmluYWwgRWRnZSByZXN1bHQgPSBvdXRWZXJ0ZXguYWRkRWRnZShlZGdlLmxhYmVsKCksIGluVmVydGV4KTsKLSAgICAgICAgZWRnZS5wcm9wZXJ0aWVzKCkuZm9yRWFjaFJlbWFpbmluZyhwcm9wZXJ0eSAtPiByZXN1bHQucHJvcGVydHkocHJvcGVydHkua2V5KCksIHByb3BlcnR5LnZhbHVlKCkpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgZ2l2ZW4gZWRnZSBiZXR3ZWVuIHRoZSBnaXZlbiBpbi0gYW5kIG91dC12ZXJ0aWNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlZGdlICAgICAgVGhlIGVkZ2UgdG8gYmUgY2xvbmVkLgotICAgICAqIEBwYXJhbSBvdXRWZXJ0ZXggVGhlIG91dC12ZXJ0ZXggaW4gdGhlIGdpdmVuIGdyYXBoLi4KLSAgICAgKiBAcGFyYW0gaW5WZXJ0ZXggIFRoZSBpbi12ZXJ0ZXggaW4gdGhlIGdpdmVuIGdyYXBoLgotICAgICAqIEBwYXJhbSBncmFwaCAgICAgVGhlIGdyYXBoIHRoYXQgaG9sZHMgdGhlIGNsb25lZCBlZGdlIGFmdGVyIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQuCi0gICAgICogQHBhcmFtIGcgICAgICAgICBBIHN0YW5kYXJkIHRyYXZlcnNhbCBzb3VyY2UgZm9yIHRoZSBnaXZlbiBncmFwaC4KLSAgICAgKiBAcmV0dXJuIFRoZSBjbG9uZWQgZWRnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWRnZSBnZXRPckNyZWF0ZUVkZ2UoZmluYWwgRWRnZSBlZGdlLCBmaW5hbCBWZXJ0ZXggb3V0VmVydGV4LCBmaW5hbCBWZXJ0ZXggaW5WZXJ0ZXgsIGZpbmFsIEdyYXBoIGdyYXBoLCBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgZm9yIHRoZSBnaXZlbiB2ZXJ0ZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNsb25lZC4KLSAgICAgKiBAcGFyYW0gdmVydGV4ICAgVGhlIHZlcnRleCBpbiB0aGUgZ2l2ZW4gZ3JhcGguLgotICAgICAqIEBwYXJhbSBncmFwaCAgICBUaGUgZ3JhcGggdGhhdCBob2xkcyB0aGUgZ2l2ZW4gdmVydGV4LgotICAgICAqIEBwYXJhbSBnICAgICAgICBBIHN0YW5kYXJkIHRyYXZlcnNhbCBzb3VyY2UgZm9yIHRoZSBnaXZlbiBncmFwaC4KLSAgICAgKiBAcmV0dXJuIFRoZSBjbG9uZWQgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIGRlZmF1bHQgVmVydGV4UHJvcGVydHkgY3JlYXRlVmVydGV4UHJvcGVydHkoZmluYWwgVmVydGV4UHJvcGVydHk8Pz4gcHJvcGVydHksIGZpbmFsIFZlcnRleCB2ZXJ0ZXgsIGZpbmFsIEdyYXBoIGdyYXBoLCBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnKSB7Ci0gICAgICAgIGZpbmFsIFZlcnRleFByb3BlcnR5IHJlc3VsdCA9IHZlcnRleC5wcm9wZXJ0eShwcm9wZXJ0eS5rZXkoKSwgcHJvcGVydHkudmFsdWUoKSk7Ci0gICAgICAgIHByb3BlcnR5LnByb3BlcnRpZXMoKS5mb3JFYWNoUmVtYWluaW5nKG1ldGFQcm9wZXJ0eSAtPiByZXN1bHQucHJvcGVydHkobWV0YVByb3BlcnR5LmtleSgpLCBtZXRhUHJvcGVydHkudmFsdWUoKSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgb3IgY3JlYXRlcyBhIGNsb25lIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBmb3IgdGhlIGdpdmVuIHZlcnRleC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2xvbmVkLgotICAgICAqIEBwYXJhbSB2ZXJ0ZXggICBUaGUgdmVydGV4IGluIHRoZSBnaXZlbiBncmFwaC4uCi0gICAgICogQHBhcmFtIGdyYXBoICAgIFRoZSBncmFwaCB0aGF0IGhvbGRzIHRoZSBnaXZlbiB2ZXJ0ZXguCi0gICAgICogQHBhcmFtIGcgICAgICAgIEEgc3RhbmRhcmQgdHJhdmVyc2FsIHNvdXJjZSBmb3IgdGhlIGdpdmVuIGdyYXBoLgotICAgICAqIEByZXR1cm4gVGhlIGNsb25lZCBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmVydGV4UHJvcGVydHkgZ2V0T3JDcmVhdGVWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBWZXJ0ZXhQcm9wZXJ0eTw/PiBwcm9wZXJ0eSwgZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGEgdmVydGV4IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmVydGV4IGZyb20gdGhlIGdpdmVuIGdyYXBoLgotICAgICAqCi0gICAgICogQHBhcmFtIHZlcnRleCBUaGUgdmVydGV4IHRvIGJlIG1hdGNoZWQuCi0gICAgICogQHBhcmFtIGdyYXBoICBUaGUgZ3JhcGggdGhhdCBob2xkcyB0aGUgZ2l2ZW4gdmVydGV4LgotICAgICAqIEBwYXJhbSBnICAgICAgQSBzdGFuZGFyZCB0cmF2ZXJzYWwgc291cmNlIGZvciB0aGUgZ2l2ZW4gZ3JhcGguCi0gICAgICogQHJldHVybiBUaGUgbWF0Y2hlZCB2ZXJ0ZXguCi0gICAgICovCi0gICAgcHVibGljIFZlcnRleCBnZXRWZXJ0ZXgoZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZlcnRleCBieSBpdHMgSUQgZnJvbSB0aGUgZ2l2ZW4gZ3JhcGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgICAgVGhlIHZlcnRleCBJRC4KLSAgICAgKiBAcGFyYW0gZ3JhcGggVGhlIGdyYXBoIHRoYXQgaG9sZHMgdGhlIHZlcnRleCB3aXRoIHRoZSBnaXZlbiBJRC4KLSAgICAgKiBAcGFyYW0gZyAgICAgQSBzdGFuZGFyZCB0cmF2ZXJzYWwgc291cmNlIGZvciB0aGUgZ2l2ZW4gZ3JhcGguCi0gICAgICogQHJldHVybiBUaGUgdmVydGV4IHdpdGggdGhlIGdpdmVuIElELgotICAgICAqLwotICAgIHB1YmxpYyBkZWZhdWx0IFZlcnRleCBnZXRWZXJ0ZXhCeUlkKGZpbmFsIE9iamVjdCBpZCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpIHsKLSAgICAgICAgcmV0dXJuIGcuVigpLmhhc0lkKGlkKS5uZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBXaGV0aGVyIHRvIHVzZSB1c2VyIHN1cHBsaWVkIGlkZW50aWZpZXJzIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VVc2VyU3VwcGxpZWRJZHMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gV2hldGhlciB0byBrZWVwIHRoZSBvcmlnaW5hbCB2ZXJ0ZXggaWRlbnRpZmllcnMgaW4gdGhlIHRhcmdldCBncmFwaCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4ga2VlcE9yaWdpbmFsSWRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSB2ZXJ0ZXggcHJvcGVydHkgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCB2ZXJ0ZXggaWQuCi0gICAgICovCi0gICAgcHVibGljIGRlZmF1bHQgU3RyaW5nIGdldFZlcnRleElkUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiBCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbS5ERUZBVUxUX0JVTEtfTE9BREVSX1ZFUlRFWF9JRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoZSBCdWxrTG9hZGVyIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVGhlIEJ1bGtMb2FkZXIgY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9idWxrbG9hZGluZy9CdWxrTG9hZGVyVmVydGV4UHJvZ3JhbS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtsb2FkaW5nL0J1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzA0MjIuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtsb2FkaW5nL0J1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uUHJvcGVydGllc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLk1lbW9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuTWVzc2FnZVNjb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLlZlcnRleENvbXB1dGVLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLlZlcnRleFByb2dyYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnV0aWwuQWJzdHJhY3RWZXJ0ZXhQcm9ncmFtQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXzsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5ldmVudC5NdXRhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5FdmVudFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkRpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXhQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLkdyYXBoRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLlN0cmluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmphdmF0dXBsZXMuUGFpcjsKLWltcG9ydCBvcmcuamF2YXR1cGxlcy5UdXBsZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgLSBjb25zaWRlciBncmFwaCBwcm92aWRlciBzcGVjaWZpYyBidWxrIGxvYWRpbmcgbWV0aG9kcwotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtIGltcGxlbWVudHMgVmVydGV4UHJvZ3JhbTxUdXBsZT4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTEtfTE9BREVSX1ZFUlRFWF9QUk9HUkFNX0NGR19QUkVGSVggPSAiZ3JlbWxpbi5idWxrTG9hZGVyVmVydGV4UHJvZ3JhbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVMS19MT0FERVJfQ0xBU1NfQ0ZHX0tFWSA9IFN0cmluZy5qb2luKCIuIiwgQlVMS19MT0FERVJfVkVSVEVYX1BST0dSQU1fQ0ZHX1BSRUZJWCwgImNsYXNzIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVMS19MT0FERVJfVkVSVEVYX0lEX0NGR19LRVkgPSBTdHJpbmcuam9pbigiLiIsIEJVTEtfTE9BREVSX1ZFUlRFWF9QUk9HUkFNX0NGR19QUkVGSVgsICJ2ZXJ0ZXhJZFByb3BlcnR5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJNRURJQVRFX0JBVENIX1NJWkVfQ0ZHX0tFWSA9IFN0cmluZy5qb2luKCIuIiwgQlVMS19MT0FERVJfVkVSVEVYX1BST0dSQU1fQ0ZHX1BSRUZJWCwgImludGVybWVkaWF0ZUJhdGNoU2l6ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFRVBfT1JJR0lOQUxfSURTX0NGR19LRVkgPSBTdHJpbmcuam9pbigiLiIsIEJVTEtfTE9BREVSX1ZFUlRFWF9QUk9HUkFNX0NGR19QUkVGSVgsICJrZWVwT3JpZ2luYWxJZHMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1NVUFBMSUVEX0lEU19DRkdfS0VZID0gU3RyaW5nLmpvaW4oIi4iLCBCVUxLX0xPQURFUl9WRVJURVhfUFJPR1JBTV9DRkdfUFJFRklYLCAidXNlclN1cHBsaWVkSWRzIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfR1JBUEhfQ0ZHX0tFWSA9IFN0cmluZy5qb2luKCIuIiwgQlVMS19MT0FERVJfVkVSVEVYX1BST0dSQU1fQ0ZHX1BSRUZJWCwgIndyaXRlR3JhcGgiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JVTEtfTE9BREVSX1ZFUlRFWF9JRCA9ICJidWxrTG9hZGVyLnZlcnRleC5pZCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VTY29wZSBtZXNzYWdlU2NvcGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8VmVydGV4Q29tcHV0ZUtleT4gZWxlbWVudENvbXB1dGVLZXlzOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotICAgIHByaXZhdGUgQnVsa0xvYWRlciBidWxrTG9hZGVyOwotICAgIHByaXZhdGUgR3JhcGggZ3JhcGg7Ci0gICAgcHJpdmF0ZSBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnOwotICAgIHByaXZhdGUgbG9uZyBpbnRlcm1lZGlhdGVCYXRjaFNpemU7Ci0KLSAgICBwcml2YXRlIEJ1bGtMb2FkaW5nTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtKCkgewotICAgICAgICBtZXNzYWdlU2NvcGUgPSBNZXNzYWdlU2NvcGUuTG9jYWwub2YoX186OmluRSk7Ci0gICAgICAgIGVsZW1lbnRDb21wdXRlS2V5cyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1bGtMb2FkZXIgY3JlYXRlQnVsa0xvYWRlcigpIHsKLSAgICAgICAgZmluYWwgQnVsa0xvYWRlciBsb2FkZXI7Ci0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlndXJhdGlvbi5zdWJzZXQoQlVMS19MT0FERVJfVkVSVEVYX1BST0dSQU1fQ0ZHX1BSRUZJWCk7Ci0gICAgICAgIGlmIChjb25maWcuY29udGFpbnNLZXkoImNsYXNzIikpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBjb25maWcuZ2V0U3RyaW5nKCJjbGFzcyIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBidWxrTG9hZGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gKEJ1bGtMb2FkZXIpIGJ1bGtMb2FkZXJDbGFzcy5nZXRDb25zdHJ1Y3RvcigpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIlVuYWJsZSB0byBmaW5kIGN1c3RvbSBidWxrIGxvYWRlciBjbGFzczoge30iLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExPR0dFUi5lcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gYnVsayBsb2FkZXIgY2xhc3M6IHt9IiwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9hZGVyID0gbmV3IEluY3JlbWVudGFsQnVsa0xvYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGxvYWRlci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBsb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZlbnR1YWxseSBjb21taXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCBjbG9zZXMgdGhlIGN1cnJlbnQgZ3JhcGggaW5zdGFuY2UuIGNvbW1pdCgpIHdpbGwgYmUgY2FsbGVkCi0gICAgICogaWYgY2xvc2UgaXMgc2V0IHRydWUsIG90aGVyd2lzZSBpdCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBpbnRlcm1lZGlhdGUgYmF0Y2ggc2l6ZSBpcyBzZXQgYW5kIHJlYWNoZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xvc2UgV2hldGhlciB0byBjbG9zZSB0aGUgY3VycmVudCBncmFwaCBpbnN0YW5jZSBhZnRlciBjYWxsaW5nIGNvbW1pdCgpIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tbWl0KGZpbmFsIGJvb2xlYW4gY2xvc2UpIHsKLSAgICAgICAgaWYgKCFjbG9zZSAmJiAoaW50ZXJtZWRpYXRlQmF0Y2hTaXplID09IDBMIHx8IGxpc3RlbmVyLm11dGF0aW9ucygpIDwgaW50ZXJtZWRpYXRlQmF0Y2hTaXplKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKG51bGwgIT0gZ3JhcGgpIHsKLSAgICAgICAgICAgIGlmIChncmFwaC5mZWF0dXJlcygpLmdyYXBoKCkuc3VwcG9ydHNUcmFuc2FjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDb21taXR0aW5nIHRyYW5zYWN0aW9uIG9uIEdyYXBoIGluc3RhbmNlOiB7fSBbe30gbXV0YXRpb25zXSIsIGdyYXBoLCBsaXN0ZW5lci5tdXRhdGlvbnMoKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZ3JhcGgudHgoKS5jb21taXQoKTsKLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJDb21taXR0ZWQgdHJhbnNhY3Rpb24gb24gR3JhcGggaW5zdGFuY2U6IHt9IiwgZ3JhcGgpOwotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5yZXNldENvdW50ZXIoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkZhaWxlZCB0byBjb21taXQgdHJhbnNhY3Rpb24gb24gR3JhcGggaW5zdGFuY2U6IHt9IiwgZ3JhcGgpOwotICAgICAgICAgICAgICAgICAgICBncmFwaC50eCgpLnJvbGxiYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnJlc2V0Q291bnRlcigpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbG9zZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyYXBoLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDbG9zZWQgR3JhcGggaW5zdGFuY2U6IHt9IiwgZ3JhcGgpOwotICAgICAgICAgICAgICAgICAgICBncmFwaCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm4oIkZhaWxlZCB0byBjbG9zZSBHcmFwaCBpbnN0YW5jZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldHVwKGZpbmFsIE1lbW9yeSBtZW1vcnkpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBsb2FkU3RhdGUoZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24gPSBuZXcgQmFzZUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uVXRpbHMuY29weShjb25maWcsIGNvbmZpZ3VyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGludGVybWVkaWF0ZUJhdGNoU2l6ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0TG9uZyhJTlRFUk1FRElBVEVfQkFUQ0hfU0laRV9DRkdfS0VZLCAwTCk7Ci0gICAgICAgIGVsZW1lbnRDb21wdXRlS2V5cy5hZGQoVmVydGV4Q29tcHV0ZUtleS5vZihERUZBVUxUX0JVTEtfTE9BREVSX1ZFUlRFWF9JRCwgdHJ1ZSkpOwotICAgICAgICBidWxrTG9hZGVyID0gY3JlYXRlQnVsa0xvYWRlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3JlU3RhdGUoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgVmVydGV4UHJvZ3JhbS5zdXBlci5zdG9yZVN0YXRlKGNvbmZpZyk7Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25VdGlscy5jb3B5KGNvbmZpZ3VyYXRpb24sIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3b3JrZXJJdGVyYXRpb25TdGFydChmaW5hbCBNZW1vcnkgbWVtb3J5KSB7Ci0gICAgICAgIGlmIChudWxsID09IGdyYXBoKSB7Ci0gICAgICAgICAgICBncmFwaCA9IEdyYXBoRmFjdG9yeS5vcGVuKGNvbmZpZ3VyYXRpb24uc3Vic2V0KFdSSVRFX0dSQVBIX0NGR19LRVkpKTsKLSAgICAgICAgICAgIExPR0dFUi5pbmZvKCJPcGVuZWQgR3JhcGggaW5zdGFuY2U6IHt9IiwgZ3JhcGgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBCdWxrTG9hZGluZ0xpc3RlbmVyKCk7Ci0gICAgICAgICAgICAgICAgZyA9IGdyYXBoLnRyYXZlcnNhbCgpLndpdGhTdHJhdGVnaWVzKEV2ZW50U3RyYXRlZ3kuYnVpbGQoKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcikuY3JlYXRlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBncmFwaC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybigiRmFpbGVkIHRvIGNsb3NlIEdyYXBoIGluc3RhbmNlIiwgZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HR0VSLndhcm4oIkxlYWtlZCBHcmFwaCBpbnN0YW5jZToge30iLCBncmFwaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3b3JrZXJJdGVyYXRpb25FbmQoZmluYWwgTWVtb3J5IG1lbW9yeSkgewotICAgICAgICB0aGlzLmNvbW1pdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFZlcnRleCBzb3VyY2VWZXJ0ZXgsIGZpbmFsIE1lc3NlbmdlcjxUdXBsZT4gbWVzc2VuZ2VyLCBmaW5hbCBNZW1vcnkgbWVtb3J5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlSW50ZXJuYWwoc291cmNlVmVydGV4LCBtZXNzZW5nZXIsIG1lbW9yeSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZ3JhcGguZmVhdHVyZXMoKS5ncmFwaCgpLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBncmFwaC50eCgpLnJvbGxiYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVJbnRlcm5hbChmaW5hbCBWZXJ0ZXggc291cmNlVmVydGV4LCBmaW5hbCBNZXNzZW5nZXI8VHVwbGU+IG1lc3NlbmdlciwgZmluYWwgTWVtb3J5IG1lbW9yeSkgewotICAgICAgICBpZiAobWVtb3J5LmlzSW5pdGlhbEl0ZXJhdGlvbigpKSB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLnJlc2V0U3RhdHMoKTsKLSAgICAgICAgICAgIC8vIGdldCBvciBjcmVhdGUgdGhlIHZlcnRleAotICAgICAgICAgICAgZmluYWwgVmVydGV4IHRhcmdldFZlcnRleCA9IGJ1bGtMb2FkZXIuZ2V0T3JDcmVhdGVWZXJ0ZXgoc291cmNlVmVydGV4LCBncmFwaCwgZyk7Ci0gICAgICAgICAgICAvLyB3cml0ZSBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHZlcnRleCB0byB0aGUgbmV3bHkgY3JlYXRlZCB2ZXJ0ZXgKLSAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFZlcnRleFByb3BlcnR5PE9iamVjdD4+IHZwaSA9IHNvdXJjZVZlcnRleC5wcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lci5pc05ld1ZlcnRleCgpKSB7Ci0gICAgICAgICAgICAgICAgdnBpLmZvckVhY2hSZW1haW5pbmcodnAgLT4gYnVsa0xvYWRlci5jcmVhdGVWZXJ0ZXhQcm9wZXJ0eSh2cCwgdGFyZ2V0VmVydGV4LCBncmFwaCwgZykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2cGkuZm9yRWFjaFJlbWFpbmluZyh2cCAtPiBidWxrTG9hZGVyLmdldE9yQ3JlYXRlVmVydGV4UHJvcGVydHkodnAsIHRhcmdldFZlcnRleCwgZ3JhcGgsIGcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuY29tbWl0KGZhbHNlKTsKLSAgICAgICAgICAgIGlmICghYnVsa0xvYWRlci51c2VVc2VyU3VwcGxpZWRJZHMoKSkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpZCBwYWlyIGFuZCBzZW5kIGl0IHRvIGFsbCB0aGUgdmVydGV4J3MgaW5jb21pbmcgYWRqYWNlbnQgdmVydGljZXMKLSAgICAgICAgICAgICAgICBzb3VyY2VWZXJ0ZXgucHJvcGVydHkoREVGQVVMVF9CVUxLX0xPQURFUl9WRVJURVhfSUQsIHRhcmdldFZlcnRleC5pZCgpKTsKLSAgICAgICAgICAgICAgICBtZXNzZW5nZXIuc2VuZE1lc3NhZ2UobWVzc2FnZVNjb3BlLCBQYWlyLndpdGgoc291cmNlVmVydGV4LmlkKCksIHRhcmdldFZlcnRleC5pZCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobWVtb3J5LmdldEl0ZXJhdGlvbigpID09IDEpIHsKLSAgICAgICAgICAgIGlmIChidWxrTG9hZGVyLnVzZVVzZXJTdXBwbGllZElkcygpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmVydGV4IG91dFYgPSBidWxrTG9hZGVyLmdldFZlcnRleChzb3VyY2VWZXJ0ZXgsIGdyYXBoLCBnKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGluY3JlbWVudGFsID0gb3V0Vi5lZGdlcyhEaXJlY3Rpb24uT1VUKS5oYXNOZXh0KCk7Ci0gICAgICAgICAgICAgICAgc291cmNlVmVydGV4LmVkZ2VzKERpcmVjdGlvbi5PVVQpLmZvckVhY2hSZW1haW5pbmcoZWRnZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFZlcnRleCBpblYgPSBidWxrTG9hZGVyLmdldFZlcnRleChlZGdlLmluVmVydGV4KCksIGdyYXBoLCBnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluY3JlbWVudGFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWxrTG9hZGVyLmdldE9yQ3JlYXRlRWRnZShlZGdlLCBvdXRWLCBpblYsIGdyYXBoLCBnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1bGtMb2FkZXIuY3JlYXRlRWRnZShlZGdlLCBvdXRWLCBpblYsIGdyYXBoLCBnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1pdChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpZCBtYXAgYW5kIHBvcHVsYXRlIGl0IHdpdGggYWxsIHRoZSBpbmNvbWluZyBtZXNzYWdlcwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gaWRQYWlycyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxUdXBsZT4gaWRpID0gbWVzc2VuZ2VyLnJlY2VpdmVNZXNzYWdlcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpZGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFR1cGxlIGlkUGFpciA9IGlkaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlkUGFpcnMucHV0KGlkUGFpci5nZXRWYWx1ZSgwKSwgaWRQYWlyLmdldFZhbHVlKDEpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2ZXJ0ZXggd2l0aCBnaXZlbiB0aGUgZHVtbXkgaWQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb3V0VklkID0gc291cmNlVmVydGV4LnZhbHVlKERFRkFVTFRfQlVMS19MT0FERVJfVkVSVEVYX0lEKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggb3V0ViA9IGJ1bGtMb2FkZXIuZ2V0VmVydGV4QnlJZChvdXRWSWQsIGdyYXBoLCBnKTsKLSAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIHRoZSBpbmNvbWluZyBlZGdlcyBvZiB0aGUgdmVydGV4LCBnZXQgdGhlIGluY29taW5nIGFkamFjZW50IHZlcnRleCBhbmQgd3JpdGUgdGhlIGVkZ2UgYW5kIGl0cyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgc291cmNlVmVydGV4LmVkZ2VzKERpcmVjdGlvbi5PVVQpLmZvckVhY2hSZW1haW5pbmcoZWRnZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBpblZJZCA9IGlkUGFpcnMuZ2V0KGVkZ2UuaW5WZXJ0ZXgoKS5pZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVydGV4IGluViA9IGJ1bGtMb2FkZXIuZ2V0VmVydGV4QnlJZChpblZJZCwgZ3JhcGgsIGcpOwotICAgICAgICAgICAgICAgICAgICBidWxrTG9hZGVyLmdldE9yQ3JlYXRlRWRnZShlZGdlLCBvdXRWLCBpblYsIGdyYXBoLCBnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21taXQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1lbW9yeS5nZXRJdGVyYXRpb24oKSA9PSAyKSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmVydGV4SWQgPSBzb3VyY2VWZXJ0ZXgudmFsdWUoREVGQVVMVF9CVUxLX0xPQURFUl9WRVJURVhfSUQpOwotICAgICAgICAgICAgYnVsa0xvYWRlci5nZXRWZXJ0ZXhCeUlkKHZlcnRleElkLCBncmFwaCwgZykKLSAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KGJ1bGtMb2FkZXIuZ2V0VmVydGV4SWRQcm9wZXJ0eSgpKS5yZW1vdmUoKTsKLSAgICAgICAgICAgIHRoaXMuY29tbWl0KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHRlcm1pbmF0ZShmaW5hbCBNZW1vcnkgbWVtb3J5KSB7Ci0gICAgICAgIHN3aXRjaCAobWVtb3J5LmdldEl0ZXJhdGlvbigpKSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1bGtMb2FkZXIua2VlcE9yaWdpbmFsSWRzKCkgfHwgYnVsa0xvYWRlci5nZXRWZXJ0ZXhJZFByb3BlcnR5KCkgPT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxWZXJ0ZXhDb21wdXRlS2V5PiBnZXRWZXJ0ZXhDb21wdXRlS2V5cygpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRDb21wdXRlS2V5czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PE1lc3NhZ2VTY29wZT4gZ2V0TWVzc2FnZVNjb3BlcyhmaW5hbCBNZW1vcnkgbWVtb3J5KSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24obWVzc2FnZVNjb3BlKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNsb25lRG9lc250RGVjbGFyZUNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIiwgIkNsb25lRG9lc250Q2FsbFN1cGVyQ2xvbmUifSkKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmVydGV4UHJvZ3JhbTxUdXBsZT4gY2xvbmUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHcmFwaENvbXB1dGVyLlJlc3VsdEdyYXBoIGdldFByZWZlcnJlZFJlc3VsdEdyYXBoKCkgewotICAgICAgICByZXR1cm4gR3JhcGhDb21wdXRlci5SZXN1bHRHcmFwaC5PUklHSU5BTDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR3JhcGhDb21wdXRlci5QZXJzaXN0IGdldFByZWZlcnJlZFBlcnNpc3QoKSB7Ci0gICAgICAgIHJldHVybiBHcmFwaENvbXB1dGVyLlBlcnNpc3QuTk9USElORzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaWYgKGJ1bGtMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJidWxrTG9hZGVyPSIpLmFwcGVuZChidWxrTG9hZGVyLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKS5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInZlcnRleElkUHJvcGVydHk9IikuYXBwZW5kKGJ1bGtMb2FkZXIuZ2V0VmVydGV4SWRQcm9wZXJ0eSgpKS5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInVzZXJTdXBwbGllZElkcz0iKS5hcHBlbmQoYnVsa0xvYWRlci51c2VVc2VyU3VwcGxpZWRJZHMoKSkuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJrZWVwT3JpZ2luYWxJZHM9IikuYXBwZW5kKGJ1bGtMb2FkZXIua2VlcE9yaWdpbmFsSWRzKCkpLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiYnVsa0xvYWRlcj0iKS5hcHBlbmQoYnVsa0xvYWRlcikuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZCgiYmF0Y2hTaXplPSIpLmFwcGVuZChpbnRlcm1lZGlhdGVCYXRjaFNpemUpOwotICAgICAgICByZXR1cm4gU3RyaW5nRmFjdG9yeS52ZXJ0ZXhQcm9ncmFtU3RyaW5nKHRoaXMsIHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RWZXJ0ZXhQcm9ncmFtQnVpbGRlcjxCdWlsZGVyPiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBCdWlsZGVyKCkgewotICAgICAgICAgICAgc3VwZXIoQnVsa0xvYWRlclZlcnRleFByb2dyYW0uY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVsa0xvYWRlclZlcnRleFByb2dyYW0gY3JlYXRlKGZpbmFsIEdyYXBoIGdyYXBoKSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uVXRpbHMuYXBwZW5kKGdyYXBoLmNvbmZpZ3VyYXRpb24oKS5zdWJzZXQoQlVMS19MT0FERVJfVkVSVEVYX1BST0dSQU1fQ0ZHX1BSRUZJWCksIGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIChCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbSkgVmVydGV4UHJvZ3JhbS5jcmVhdGVWZXJ0ZXhQcm9ncmFtKGdyYXBoLCBjb25maWd1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRHcmFwaENvbmZpZ3VyYXRpb25Qcm9wZXJ0eShmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoU3RyaW5nLmpvaW4oIi4iLCBXUklURV9HUkFQSF9DRkdfS0VZLCBrZXkpLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgQnVsa0xvYWRlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYnVsa0xvYWRlcihmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFByb3BlcnR5KEJVTEtfTE9BREVSX0NMQVNTX0NGR19LRVksIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBjbGFzcyBvZiB0aGUgQnVsa0xvYWRlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYnVsa0xvYWRlcihmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVsa0xvYWRlcj4gY2xhenopIHsKLSAgICAgICAgICAgIHJldHVybiBidWxrTG9hZGVyKGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCB2ZXJ0ZXggaWRlbnRpZmllcnMgaW4gdGhlIHRhcmdldCBncmFwaC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHZlcnRleElkUHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQlVMS19MT0FERVJfVkVSVEVYX0lEX0NGR19LRVksIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdXNlciBzdXBwbGllZCBpZGVudGlmaWVycyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBidWxrIGxvYWRlciBjcmVhdGVzIHZlcnRpY2VzIGluIHRoZQotICAgICAgICAgKiB0YXJnZXQgZ3JhcGguCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciB1c2VyU3VwcGxpZWRJZHMoZmluYWwgYm9vbGVhbiB1c2VVc2VyU3VwcGxpZWRJZHMpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoVVNFUl9TVVBQTElFRF9JRFNfQ0ZHX0tFWSwgdXNlVXNlclN1cHBsaWVkSWRzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBvcmlnaW5hbCB2ZXJ0ZXggaWRlbnRpZmllcnMgc2hvdWxkIGJlIGtlcHQgaW4gdGhlIHRhcmdldCBncmFwaCBvciBub3QuIEluIGNhc2Ugb2YgZmFsc2UKLSAgICAgICAgICogQnVsa0xvYWRlclZlcnRleFByb2dyYW0gd2lsbCBhZGQgYW5vdGhlciBpdGVyYXRpb24gdG8gcmVtb3ZlIHRoZSBwcm9wZXJ0aWVzIGFuZCBpdCB3b24ndCBiZSBwb3NzaWJsZSB0byB1c2UKLSAgICAgICAgICogdGhlIGRhdGEgZm9yIGZ1cnRoZXIgaW5jcmVtZW50YWwgYnVsayBsb2Fkcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGtlZXBPcmlnaW5hbElkcyhmaW5hbCBib29sZWFuIGtlZXBPcmlnaW5hbElkcykgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShLRUVQX09SSUdJTkFMX0lEU19DRkdfS0VZLCBrZWVwT3JpZ2luYWxJZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGJhdGNoIHNpemUgZm9yIGEgc2luZ2xlIHRyYW5zYWN0aW9uIChudW1iZXIgb2YgdmVydGljZXMgaW4gdGhlIHZlcnRleCBsb2FkaW5nIHN0YWdlOyBudW1iZXIgb2YgZWRnZXMgaW4KLSAgICAgICAgICogdGhlIGVkZ2UgbG9hZGluZyBzdGFnZSkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBpbnRlcm1lZGlhdGVCYXRjaFNpemUoZmluYWwgaW50IGJhdGNoU2l6ZSkgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShJTlRFUk1FRElBVEVfQkFUQ0hfU0laRV9DRkdfS0VZLCBiYXRjaFNpemUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBjb25maWd1cmF0aW9uIGZvciB0aGUgdGFyZ2V0IGdyYXBoIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBHcmFwaEZhY3Rvcnkub3BlbigpLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgd3JpdGVHcmFwaChmaW5hbCBTdHJpbmcgY29uZmlndXJhdGlvbkZpbGUpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB3cml0ZUdyYXBoKG5ldyBQcm9wZXJ0aWVzQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uRmlsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldCBncmFwaCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gR3JhcGhGYWN0b3J5Lm9wZW4oKS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHdyaXRlR3JhcGgoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldEtleXMoKS5mb3JFYWNoUmVtYWluaW5nKGtleSAtPiBzZXRHcmFwaENvbmZpZ3VyYXRpb25Qcm9wZXJ0eShrZXksIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoa2V5KSkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmVhdHVyZXMgZ2V0RmVhdHVyZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmVhdHVyZXMoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzTG9jYWxNZXNzYWdlU2NvcGVzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzVmVydGV4UHJvcGVydHlBZGRpdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQnVsa0xvYWRpbmdMaXN0ZW5lciBpbXBsZW1lbnRzIE11dGF0aW9uTGlzdGVuZXIgewotCi0gICAgICAgIHByaXZhdGUgbG9uZyBjb3VudGVyOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXdWZXJ0ZXg7Ci0KLSAgICAgICAgcHVibGljIEJ1bGtMb2FkaW5nTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICB0aGlzLmNvdW50ZXIgPSAwTDsKLSAgICAgICAgICAgIHRoaXMuaXNOZXdWZXJ0ZXggPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTmV3VmVydGV4KCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNOZXdWZXJ0ZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBtdXRhdGlvbnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jb3VudGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXRTdGF0cygpIHsKLSAgICAgICAgICAgIHRoaXMuaXNOZXdWZXJ0ZXggPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0Q291bnRlcigpIHsKLSAgICAgICAgICAgIHRoaXMuY291bnRlciA9IDBMOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHZlcnRleEFkZGVkKGZpbmFsIFZlcnRleCB2ZXJ0ZXgpIHsKLSAgICAgICAgICAgIHRoaXMuaXNOZXdWZXJ0ZXggPSB0cnVlOwotICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmVydGV4UmVtb3ZlZChmaW5hbCBWZXJ0ZXggdmVydGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmNvdW50ZXIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB2ZXJ0ZXhQcm9wZXJ0eUNoYW5nZWQoZmluYWwgVmVydGV4IGVsZW1lbnQsIGZpbmFsIFZlcnRleFByb3BlcnR5IG9sZFZhbHVlLCBmaW5hbCBPYmplY3Qgc2V0VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QuLi4gdmVydGV4UHJvcGVydHlLZXlWYWx1ZXMpIHsKLSAgICAgICAgICAgIHRoaXMuY291bnRlcisrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHZlcnRleFByb3BlcnR5UmVtb3ZlZChmaW5hbCBWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSkgewotICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZWRnZUFkZGVkKGZpbmFsIEVkZ2UgZWRnZSkgewotICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZWRnZVJlbW92ZWQoZmluYWwgRWRnZSBlZGdlKSB7Ci0gICAgICAgICAgICB0aGlzLmNvdW50ZXIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlZGdlUHJvcGVydHlDaGFuZ2VkKGZpbmFsIEVkZ2UgZWxlbWVudCwgZmluYWwgUHJvcGVydHkgb2xkVmFsdWUsIGZpbmFsIE9iamVjdCBzZXRWYWx1ZSkgewotICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZWRnZVByb3BlcnR5UmVtb3ZlZChmaW5hbCBFZGdlIGVsZW1lbnQsIGZpbmFsIFByb3BlcnR5IHByb3BlcnR5KSB7Ci0gICAgICAgICAgICB0aGlzLmNvdW50ZXIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB2ZXJ0ZXhQcm9wZXJ0eVByb3BlcnR5Q2hhbmdlZChmaW5hbCBWZXJ0ZXhQcm9wZXJ0eSBlbGVtZW50LCBmaW5hbCBQcm9wZXJ0eSBvbGRWYWx1ZSwgZmluYWwgT2JqZWN0IHNldFZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLmNvdW50ZXIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB2ZXJ0ZXhQcm9wZXJ0eVByb3BlcnR5UmVtb3ZlZChmaW5hbCBWZXJ0ZXhQcm9wZXJ0eSBlbGVtZW50LCBmaW5hbCBQcm9wZXJ0eSBwcm9wZXJ0eSkgewotICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvYnVsa2xvYWRpbmcvSW5jcmVtZW50YWxCdWxrTG9hZGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvYnVsa2xvYWRpbmcvSW5jcmVtZW50YWxCdWxrTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTM3NzMuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtsb2FkaW5nL0luY3JlbWVudGFsQnVsa0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuYnVsa2xvYWRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgLSBjb25zaWRlciBncmFwaCBwcm92aWRlciBzcGVjaWZpYyBidWxrIGxvYWRpbmcgbWV0aG9kcwotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIEluY3JlbWVudGFsQnVsa0xvYWRlciBpbXBsZW1lbnRzIEJ1bGtMb2FkZXIgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYnVsa0xvYWRlclZlcnRleElkID0gQnVsa0xvYWRlclZlcnRleFByb2dyYW0uREVGQVVMVF9CVUxLX0xPQURFUl9WRVJURVhfSUQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGtlZXBPcmlnaW5hbElkcyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVzZXJTdXBwbGllZElkcyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWZXJ0ZXggZ2V0T3JDcmVhdGVWZXJ0ZXgoZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpIHsKLSAgICAgICAgZmluYWwgSXRlcmF0b3I8VmVydGV4PiBpdGVyYXRvciA9IHVzZVVzZXJTdXBwbGllZElkcygpCi0gICAgICAgICAgICAgICAgPyBnLlYoKS5oYXNJZCh2ZXJ0ZXguaWQoKSkKLSAgICAgICAgICAgICAgICA6IGcuVigpLmhhcyh2ZXJ0ZXgubGFiZWwoKSwgYnVsa0xvYWRlclZlcnRleElkLCB2ZXJ0ZXguaWQoKS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKQotICAgICAgICAgICAgICAgID8gaXRlcmF0b3IubmV4dCgpCi0gICAgICAgICAgICAgICAgOiB1c2VVc2VyU3VwcGxpZWRJZHMoKQotICAgICAgICAgICAgICAgID8gZy5hZGRWKHZlcnRleC5sYWJlbCgpKS5wcm9wZXJ0eShULmlkLCB2ZXJ0ZXguaWQoKSkubmV4dCgpCi0gICAgICAgICAgICAgICAgOiBnLmFkZFYodmVydGV4LmxhYmVsKCkpLnByb3BlcnR5KGJ1bGtMb2FkZXJWZXJ0ZXhJZCwgdmVydGV4LmlkKCkudG9TdHJpbmcoKSkubmV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRWRnZSBnZXRPckNyZWF0ZUVkZ2UoZmluYWwgRWRnZSBlZGdlLCBmaW5hbCBWZXJ0ZXggb3V0VmVydGV4LCBmaW5hbCBWZXJ0ZXggaW5WZXJ0ZXgsIGZpbmFsIEdyYXBoIGdyYXBoLCBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnKSB7Ci0gICAgICAgIGZpbmFsIEVkZ2UgZTsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgRWRnZT4gdCA9IGcuVihvdXRWZXJ0ZXgpLm91dEUoZWRnZS5sYWJlbCgpKS5maWx0ZXIoX18uaW5WKCkuaXMoaW5WZXJ0ZXgpKTsKLSAgICAgICAgaWYgKHQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBlID0gdC5uZXh0KCk7Ci0gICAgICAgICAgICBlZGdlLnByb3BlcnRpZXMoKS5mb3JFYWNoUmVtYWluaW5nKHByb3BlcnR5IC0+IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eTw/PiBleGlzdGluZyA9IGUucHJvcGVydHkocHJvcGVydHkua2V5KCkpOwotICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmcuaXNQcmVzZW50KCkgfHwgIWV4aXN0aW5nLnZhbHVlKCkuZXF1YWxzKHByb3BlcnR5LnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJvcGVydHkocHJvcGVydHkua2V5KCksIHByb3BlcnR5LnZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZSA9IGNyZWF0ZUVkZ2UoZWRnZSwgb3V0VmVydGV4LCBpblZlcnRleCwgZ3JhcGgsIGcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmVydGV4UHJvcGVydHkgZ2V0T3JDcmVhdGVWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBWZXJ0ZXhQcm9wZXJ0eTw/PiBwcm9wZXJ0eSwgZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpIHsKLSAgICAgICAgZmluYWwgVmVydGV4UHJvcGVydHk8Pz4gdnA7Ci0gICAgICAgIGZpbmFsIFZlcnRleFByb3BlcnR5PD8+IGV4aXN0aW5nID0gdmVydGV4LnByb3BlcnR5KHByb3BlcnR5LmtleSgpKTsKLSAgICAgICAgaWYgKCFleGlzdGluZy5pc1ByZXNlbnQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVZlcnRleFByb3BlcnR5KHByb3BlcnR5LCB2ZXJ0ZXgsIGdyYXBoLCBnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4aXN0aW5nLnZhbHVlKCkuZXF1YWxzKHByb3BlcnR5LnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICB2cCA9IHZlcnRleC5wcm9wZXJ0eShwcm9wZXJ0eS5rZXkoKSwgcHJvcGVydHkudmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2cCA9IGV4aXN0aW5nOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5LnByb3BlcnRpZXMoKS5mb3JFYWNoUmVtYWluaW5nKG1ldGFQcm9wZXJ0eSAtPiB7Ci0gICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eTw/PiBleGlzdGluZzIgPSB2cC5wcm9wZXJ0eShtZXRhUHJvcGVydHkua2V5KCkpOwotICAgICAgICAgICAgaWYgKCFleGlzdGluZzIuaXNQcmVzZW50KCkgfHwgIWV4aXN0aW5nMi52YWx1ZSgpLmVxdWFscyhtZXRhUHJvcGVydHkudmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICB2cC5wcm9wZXJ0eShtZXRhUHJvcGVydHkua2V5KCksIG1ldGFQcm9wZXJ0eS52YWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB2cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZlcnRleCBnZXRWZXJ0ZXgoZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpIHsKLSAgICAgICAgcmV0dXJuIHVzZVVzZXJTdXBwbGllZElkcygpCi0gICAgICAgICAgICAgICAgPyBnZXRWZXJ0ZXhCeUlkKHZlcnRleC5pZCgpLCBncmFwaCwgZykKLSAgICAgICAgICAgICAgICA6IGcuVigpLmhhcyh2ZXJ0ZXgubGFiZWwoKSwgYnVsa0xvYWRlclZlcnRleElkLCB2ZXJ0ZXguaWQoKS50b1N0cmluZygpKS5uZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHVzZVVzZXJTdXBwbGllZElkcygpIHsKLSAgICAgICAgcmV0dXJuIHVzZXJTdXBwbGllZElkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4ga2VlcE9yaWdpbmFsSWRzKCkgewotICAgICAgICByZXR1cm4ga2VlcE9yaWdpbmFsSWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnRleElkUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiBidWxrTG9hZGVyVmVydGV4SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoQnVsa0xvYWRlclZlcnRleFByb2dyYW0uQlVMS19MT0FERVJfVkVSVEVYX0lEX0NGR19LRVkpKSB7Ci0gICAgICAgICAgICBidWxrTG9hZGVyVmVydGV4SWQgPSBjb25maWd1cmF0aW9uLmdldFN0cmluZyhCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbS5CVUxLX0xPQURFUl9WRVJURVhfSURfQ0ZHX0tFWSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoQnVsa0xvYWRlclZlcnRleFByb2dyYW0uVVNFUl9TVVBQTElFRF9JRFNfQ0ZHX0tFWSkpIHsKLSAgICAgICAgICAgIHVzZXJTdXBwbGllZElkcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Qm9vbGVhbihCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbS5VU0VSX1NVUFBMSUVEX0lEU19DRkdfS0VZKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5jb250YWluc0tleShCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbS5LRUVQX09SSUdJTkFMX0lEU19DRkdfS0VZKSkgewotICAgICAgICAgICAga2VlcE9yaWdpbmFsSWRzID0gY29uZmlndXJhdGlvbi5nZXRCb29sZWFuKEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLktFRVBfT1JJR0lOQUxfSURTX0NGR19LRVkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtsb2FkaW5nL09uZVRpbWVCdWxrTG9hZGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvYnVsa2xvYWRpbmcvT25lVGltZUJ1bGtMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxOGM3Zi4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvYnVsa2xvYWRpbmcvT25lVGltZUJ1bGtMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmJ1bGtsb2FkaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleFByb3BlcnR5OwotCi0vKioKLSAqIHtAbGluayBPbmVUaW1lQnVsa0xvYWRlcn0gaXMgYSB7QGxpbmsgQnVsa0xvYWRlcn0gaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgaW5pdGlhbCBidWxrIGxvYWRzLiBJbgotICogY29udHJhc3QgdG8ge0BsaW5rIEluY3JlbWVudGFsQnVsa0xvYWRlcn0gaXQgZG9lc24ndCBzdG9yZSB0ZW1wb3JhcnkgaWRlbnRpZmllcnMgaW4gdGhlIHdyaXRlIGdyYXBoIG5vciBkb2VzIGl0Ci0gKiBhdHRlbXB0IHRvIGZpbmQgZXhpc3RpbmcgZWxlbWVudHMsIGluc3RlYWQgaXQgIG9ubHkgY2xvbmVzIGVhY2ggZWxlbWVudCBmcm9tIHRoZSBzb3VyY2UgZ3JhcGguCi0gKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgLSBjb25zaWRlciBncmFwaCBwcm92aWRlciBzcGVjaWZpYyBidWxrIGxvYWRpbmcgbWV0aG9kcwotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIE9uZVRpbWVCdWxrTG9hZGVyIGltcGxlbWVudHMgQnVsa0xvYWRlciB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlclN1cHBsaWVkSWRzID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGdpdmVuIHZlcnRleCBpbiB0aGUgZ2l2ZW4gZ3JhcGguCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZlcnRleCBnZXRPckNyZWF0ZVZlcnRleChmaW5hbCBWZXJ0ZXggdmVydGV4LCBmaW5hbCBHcmFwaCBncmFwaCwgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZykgewotICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gdCA9IGcuYWRkVih2ZXJ0ZXgubGFiZWwoKSk7Ci0gICAgICAgIHJldHVybiAodXNlVXNlclN1cHBsaWVkSWRzKCkgPyB0LnByb3BlcnR5KFQuaWQsIHZlcnRleC5pZCgpKSA6IHQpLm5leHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGdpdmVuIGVkZ2UgYmV0d2VlbiB0aGUgZ2l2ZW4gaW4tIGFuZCBvdXQtdmVydGljZXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVkZ2UgZ2V0T3JDcmVhdGVFZGdlKGZpbmFsIEVkZ2UgZWRnZSwgZmluYWwgVmVydGV4IG91dFZlcnRleCwgZmluYWwgVmVydGV4IGluVmVydGV4LCBmaW5hbCBHcmFwaCBncmFwaCwgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZykgewotICAgICAgICByZXR1cm4gY3JlYXRlRWRnZShlZGdlLCBvdXRWZXJ0ZXgsIGluVmVydGV4LCBncmFwaCwgZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBmb3IgdGhlIGdpdmVuIHZlcnRleC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmVydGV4UHJvcGVydHkgZ2V0T3JDcmVhdGVWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBWZXJ0ZXhQcm9wZXJ0eTw/PiBwcm9wZXJ0eSwgZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVZlcnRleFByb3BlcnR5KHByb3BlcnR5LCB2ZXJ0ZXgsIGdyYXBoLCBnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZlcnRleCBnZXRWZXJ0ZXgoZmluYWwgVmVydGV4IHZlcnRleCwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcpIHsKLSAgICAgICAgcmV0dXJuIGdldFZlcnRleEJ5SWQodmVydGV4LmlkKCksIGdyYXBoLCBnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVXNlclN1cHBsaWVkSWRzKCkgewotICAgICAgICByZXR1cm4gdXNlclN1cHBsaWVkSWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsd2F5cyByZXR1cm5zIGZhbHNlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGtlZXBPcmlnaW5hbElkcygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsd2F5cyByZXR1cm5zIG51bGwuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJ0ZXhJZFByb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5jb250YWluc0tleShCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbS5VU0VSX1NVUFBMSUVEX0lEU19DRkdfS0VZKSkgewotICAgICAgICAgICAgdXNlclN1cHBsaWVkSWRzID0gY29uZmlndXJhdGlvbi5nZXRCb29sZWFuKEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLlVTRVJfU1VQUExJRURfSURTX0NGR19LRVkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2NsdXN0ZXJpbmcvY29ubmVjdGVkL0Nvbm5lY3RlZENvbXBvbmVudFZlcnRleFByb2dyYW0uamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL2Nvbm5lY3RlZC9Db25uZWN0ZWRDb21wb25lbnRWZXJ0ZXhQcm9ncmFtLmphdmEKaW5kZXggYWNjOGYzYy4uY2E4MWFiZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2NsdXN0ZXJpbmcvY29ubmVjdGVkL0Nvbm5lY3RlZENvbXBvbmVudFZlcnRleFByb2dyYW0uamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvY2x1c3RlcmluZy9jb25uZWN0ZWQvQ29ubmVjdGVkQ29tcG9uZW50VmVydGV4UHJvZ3JhbS5qYXZhCkBAIC0xOCw5ICsxOCw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmNsdXN0ZXJpbmcuY29ubmVjdGVkOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLk1lbW9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuTWVtb3J5Q29tcHV0ZUtleTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9DbHVzdGVyQ291bnRNYXBSZWR1Y2UuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9DbHVzdGVyQ291bnRNYXBSZWR1Y2UuamF2YQppbmRleCBkMzQzZThlLi5mY2YxNWNiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvY2x1c3RlcmluZy9wZWVycHJlc3N1cmUvQ2x1c3RlckNvdW50TWFwUmVkdWNlLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2NsdXN0ZXJpbmcvcGVlcnByZXNzdXJlL0NsdXN0ZXJDb3VudE1hcFJlZHVjZS5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvY2x1c3RlcmluZy9wZWVycHJlc3N1cmUvQ2x1c3RlclBvcHVsYXRpb25NYXBSZWR1Y2UuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9DbHVzdGVyUG9wdWxhdGlvbk1hcFJlZHVjZS5qYXZhCmluZGV4IDAzMThhZDYuLjMwMWZiYTEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9DbHVzdGVyUG9wdWxhdGlvbk1hcFJlZHVjZS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9DbHVzdGVyUG9wdWxhdGlvbk1hcFJlZHVjZS5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvY2x1c3RlcmluZy9wZWVycHJlc3N1cmUvUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2NsdXN0ZXJpbmcvcGVlcnByZXNzdXJlL1BlZXJQcmVzc3VyZVZlcnRleFByb2dyYW0uamF2YQppbmRleCBiNjgxODA3Li4yZWFkNDJlIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvY2x1c3RlcmluZy9wZWVycHJlc3N1cmUvUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9QZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuY2x1c3RlcmluZy5wZWVycHJlc3N1cmU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NZW1vcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLk1lbW9yeUNvbXB1dGVLZXk7CkBAIC0yNDMsMjMgKzI0Myw2IEBACiAgICAgICAgICAgICBQdXJlVHJhdmVyc2FsLnN0b3JlU3RhdGUodGhpcy5jb25maWd1cmF0aW9uLCBJTklUSUFMX1ZPVEVfU1RSRU5HVEhfVFJBVkVSU0FMLCBpbml0aWFsVm90ZVN0cmVuZ3RoVHJhdmVyc2FsKTsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjAsIHJlcGxhY2VkIGJ5IHtAbGluayBQZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtLkJ1aWxkZXIjZWRnZXMoVHJhdmVyc2FsLkFkbWluKX0KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHRyYXZlcnNhbChmaW5hbCBUcmF2ZXJzYWxTb3VyY2UgdHJhdmVyc2FsU291cmNlLCBmaW5hbCBTdHJpbmcgc2NyaXB0RW5naW5lLCBmaW5hbCBTdHJpbmcgdHJhdmVyc2FsU2NyaXB0LCBmaW5hbCBPYmplY3QuLi4gYmluZGluZ3MpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVkZ2VzKG5ldyBTY3JpcHRUcmF2ZXJzYWw8Pih0cmF2ZXJzYWxTb3VyY2UsIHNjcmlwdEVuZ2luZSwgdHJhdmVyc2FsU2NyaXB0LCBiaW5kaW5ncykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjAsIHJlcGxhY2VkIGJ5IHtAbGluayBQZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtLkJ1aWxkZXIjZWRnZXMoVHJhdmVyc2FsLkFkbWluKX0KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHRyYXZlcnNhbChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48VmVydGV4LCBFZGdlPiBlZGdlVHJhdmVyc2FsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5lZGdlcyhlZGdlVHJhdmVyc2FsKTsKLSAgICAgICAgfQotCiAgICAgfQogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3JhbmtpbmcvcGFnZXJhbmsvUGFnZVJhbmtNYXBSZWR1Y2UuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9yYW5raW5nL3BhZ2VyYW5rL1BhZ2VSYW5rTWFwUmVkdWNlLmphdmEKaW5kZXggY2ZmNWUzOS4uYjI1MjNiNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3JhbmtpbmcvcGFnZXJhbmsvUGFnZVJhbmtNYXBSZWR1Y2UuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvcmFua2luZy9wYWdlcmFuay9QYWdlUmFua01hcFJlZHVjZS5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvcmFua2luZy9wYWdlcmFuay9QYWdlUmFua1ZlcnRleFByb2dyYW0uamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9yYW5raW5nL3BhZ2VyYW5rL1BhZ2VSYW5rVmVydGV4UHJvZ3JhbS5qYXZhCmluZGV4IGNlMGI1ZjIuLjI0N2IxZWEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9yYW5raW5nL3BhZ2VyYW5rL1BhZ2VSYW5rVmVydGV4UHJvZ3JhbS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9yYW5raW5nL3BhZ2VyYW5rL1BhZ2VSYW5rVmVydGV4UHJvZ3JhbS5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnJhbmtpbmcucGFnZXJhbms7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NZW1vcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLk1lbW9yeUNvbXB1dGVLZXk7CkBAIC0yNTcsMzEgKzI1Nyw2IEBACiAgICAgICAgICAgICBQdXJlVHJhdmVyc2FsLnN0b3JlU3RhdGUodGhpcy5jb25maWd1cmF0aW9uLCBJTklUSUFMX1JBTktfVFJBVkVSU0FMLCBpbml0aWFsUmFua1RyYXZlcnNhbCk7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMi4wLCByZXBsYWNlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnJhbmtpbmcucGFnZXJhbmsuUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtLkJ1aWxkZXIjaW5pdGlhbFJhbmsoVHJhdmVyc2FsLkFkbWluKX0KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHZlcnRleENvdW50KGZpbmFsIGxvbmcgdmVydGV4Q291bnQpIHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShWRVJURVhfQ09VTlQsIChkb3VibGUpIHZlcnRleENvdW50KTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjAsIHJlcGxhY2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIucmFua2luZy5wYWdlcmFuay5QYWdlUmFua1ZlcnRleFByb2dyYW0uQnVpbGRlciNlZGdlcyhUcmF2ZXJzYWwuQWRtaW4pfQotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgdHJhdmVyc2FsKGZpbmFsIFRyYXZlcnNhbFNvdXJjZSB0cmF2ZXJzYWxTb3VyY2UsIGZpbmFsIFN0cmluZyBzY3JpcHRFbmdpbmUsIGZpbmFsIFN0cmluZyB0cmF2ZXJzYWxTY3JpcHQsIGZpbmFsIE9iamVjdC4uLiBiaW5kaW5ncykgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRnZXMobmV3IFNjcmlwdFRyYXZlcnNhbDw+KHRyYXZlcnNhbFNvdXJjZSwgc2NyaXB0RW5naW5lLCB0cmF2ZXJzYWxTY3JpcHQsIGJpbmRpbmdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMCwgcmVwbGFjZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5yYW5raW5nLnBhZ2VyYW5rLlBhZ2VSYW5rVmVydGV4UHJvZ3JhbS5CdWlsZGVyI2VkZ2VzKFRyYXZlcnNhbC5BZG1pbil9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciB0cmF2ZXJzYWwoZmluYWwgVHJhdmVyc2FsLkFkbWluPFZlcnRleCwgRWRnZT4gdHJhdmVyc2FsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5lZGdlcyh0cmF2ZXJzYWwpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3NlYXJjaC9wYXRoL1Nob3J0ZXN0UGF0aFZlcnRleFByb2dyYW0uamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9zZWFyY2gvcGF0aC9TaG9ydGVzdFBhdGhWZXJ0ZXhQcm9ncmFtLmphdmEKaW5kZXggMTk0OWM1My4uODg4NzViMSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3NlYXJjaC9wYXRoL1Nob3J0ZXN0UGF0aFZlcnRleFByb2dyYW0uamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvc2VhcmNoL3BhdGgvU2hvcnRlc3RQYXRoVmVydGV4UHJvZ3JhbS5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnNlYXJjaC5wYXRoOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuTWVtb3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NZW1vcnlDb21wdXRlS2V5OwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9UcmF2ZXJzYWxWZXJ0ZXhQcm9ncmFtLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL1RyYXZlcnNhbFZlcnRleFByb2dyYW0uamF2YQppbmRleCBlYjU2NDg0Li5hNWY5ZGZlIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL1RyYXZlcnNhbFZlcnRleFByb2dyYW0uamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL1RyYXZlcnNhbFZlcnRleFByb2dyYW0uamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5Db21wdXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuTWFwUmVkdWNlOwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhdmVyc2FsLmdldCgpLmdldFBhcmVudCgpLmFzU3RlcCgpLmdldE5leHRTdGVwKCkuZ2V0TmV4dFN0ZXAoKSBpbnN0YW5jZW9mIENvbXB1dGVyUmVzdWx0U3RlcCkpOwogCiAgICAgICAgIC8vIGRldGVybWluZSBob3cgdG8gc3RvcmUgaGFsdGVkIHRyYXZlcnNlcnMKLSAgICAgICAgZmluYWwgSXRlcmF0b3I8Pz4gaXR0eSA9IEl0ZXJhdG9yVXRpbHMuZmlsdGVyKHRoaXMudHJhdmVyc2FsLmdldCgpLmdldFN0cmF0ZWdpZXMoKS50b0xpc3QoKSwgc3RyYXRlZ3kgLT4gc3RyYXRlZ3kgaW5zdGFuY2VvZiBIYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneSkuaXRlcmF0b3IoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8Pz4gaXR0eSA9IEl0ZXJhdG9yVXRpbHMuZmlsdGVyKHRoaXMudHJhdmVyc2FsLmdldCgpLmdldFN0cmF0ZWdpZXMoKSwgc3RyYXRlZ3kgLT4gc3RyYXRlZ3kgaW5zdGFuY2VvZiBIYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneSkuaXRlcmF0b3IoKTsKICAgICAgICAgdGhpcy5oYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneSA9IGl0dHkuaGFzTmV4dCgpID8gKEhhbHRlZFRyYXZlcnNlclN0cmF0ZWd5KSBpdHR5Lm5leHQoKSA6IEhhbHRlZFRyYXZlcnNlclN0cmF0ZWd5LnJlZmVyZW5jZSgpOwogCiAgICAgICAgIC8vIHJlZ2lzdGVyIHRyYXZlcnNhbCBzaWRlLWVmZmVjdHMgaW4gbWVtb3J5CkBAIC0zNjgsNyArMzY4LDcgQEAKICAgICBwdWJsaWMgdm9pZCB3b3JrZXJJdGVyYXRpb25FbmQoZmluYWwgTWVtb3J5IG1lbW9yeSkgewogICAgICAgICAvLyBzdG9yZSBwcm9maWxlIG1ldHJpY3MgaW4gcHJvcGVyIFByb2ZpbGVTdGVwIG1ldHJpY3MKICAgICAgICAgaWYgKHRoaXMucHJvZmlsZSkgewotICAgICAgICAgICAgTGlzdDxQcm9maWxlU3RlcD4gcHJvZmlsZVN0ZXBzID0gVHJhdmVyc2FsSGVscGVyLmdldFN0ZXBzT2ZBc3NpZ25hYmxlQ2xhc3NSZWN1cnNpdmVseShQcm9maWxlU3RlcC5jbGFzcywgdGhpcy50cmF2ZXJzYWwuZ2V0KCkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxQcm9maWxlU3RlcD4gcHJvZmlsZVN0ZXBzID0gVHJhdmVyc2FsSGVscGVyLmdldFN0ZXBzT2ZBc3NpZ25hYmxlQ2xhc3NSZWN1cnNpdmVseShQcm9maWxlU3RlcC5jbGFzcywgdGhpcy50cmF2ZXJzYWwuZ2V0KCkpOwogICAgICAgICAgICAgLy8gZ3Vlc3MgdGhlIHByb2ZpbGUgc3RlcCB0byBzdG9yZSBkYXRhCiAgICAgICAgICAgICBpbnQgcHJvZmlsZVN0ZXBJbmRleCA9IG1lbW9yeS5nZXRJdGVyYXRpb24oKTsKICAgICAgICAgICAgIC8vIGlmIHdlIGd1ZXNzIHdyb25nbHkgd3JpdGUgdGltaW5nIGludG8gbGFzdCBzdGVwCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0ZXAvbWFwL1BhZ2VSYW5rVmVydGV4UHJvZ3JhbVN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RlcC9tYXAvUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtU3RlcC5qYXZhCmluZGV4IDI3N2I0YzYuLmMyNjU5MjcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RlcC9tYXAvUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RlcC9tYXAvUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtU3RlcC5qYXZhCkBAIC0yNyw4ICsyNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVnaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CeU1vZHVsYXRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRpbWVzTW9kdWxhdGluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLlBhcmFtZXRlcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIuVHJhdmVyc2VyUmVxdWlyZW1lbnQ7CkBAIC00Niw4ICs0NCw3IEBACiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBhZ2VSYW5rVmVydGV4UHJvZ3JhbVN0ZXAgZXh0ZW5kcyBWZXJ0ZXhQcm9ncmFtU3RlcAotICAgICAgICBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgQnlNb2R1bGF0aW5nLCBUaW1lc01vZHVsYXRpbmcsIENvbmZpZ3VyaW5nIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBQYWdlUmFua1ZlcnRleFByb2dyYW1TdGVwIGV4dGVuZHMgVmVydGV4UHJvZ3JhbVN0ZXAgaW1wbGVtZW50cyBUcmF2ZXJzYWxQYXJlbnQsIENvbmZpZ3VyaW5nIHsKIAogICAgIHByaXZhdGUgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlcnMoKTsKICAgICBwcml2YXRlIFB1cmVUcmF2ZXJzYWw8VmVydGV4LCBFZGdlPiBlZGdlVHJhdmVyc2FsOwpAQCAtNzYsNyArNzMsNyBAQAogICAgICAgICAgICAgaWYgKCEoa2V5VmFsdWVzWzFdIGluc3RhbmNlb2YgSW50ZWdlcikpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFnZVJhbmsudGltZXMgcmVxdWlyZXMgYW4gSW50ZWdlciBhcyBpdHMgYXJndW1lbnQiKTsKICAgICAgICAgICAgIHRoaXMudGltZXMgPSAoaW50KSBrZXlWYWx1ZXNbMV07Ci0gICAgICAgIH1lbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQodGhpcywga2V5VmFsdWVzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTg2LDMzICs4Myw2IEBACiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy40LjAsIHJlcGxhY2VkIGJ5IHtAbGluayAjY29uZmlndXJlKE9iamVjdC4uLil9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtb2R1bGF0ZUJ5KGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBlZGdlVHJhdmVyc2FsKSB7Ci0gICAgICAgIGNvbmZpZ3VyZShQYWdlUmFuay5lZGdlcywgZWRnZVRyYXZlcnNhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjQuMCwgcmVwbGFjZWQgYnkge0BsaW5rICNjb25maWd1cmUoT2JqZWN0Li4uKX0KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1vZHVsYXRlQnkoZmluYWwgU3RyaW5nIHBhZ2VSYW5rUHJvcGVydHkpIHsKLSAgICAgICAgY29uZmlndXJlKFBhZ2VSYW5rLnByb3BlcnR5TmFtZSwgcGFnZVJhbmtQcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjQuMCwgcmVwbGFjZWQgYnkge0BsaW5rICNjb25maWd1cmUoT2JqZWN0Li4uKX0KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1vZHVsYXRlVGltZXMoaW50IHRpbWVzKSB7Ci0gICAgICAgIGNvbmZpZ3VyZShQYWdlUmFuay50aW1lcywgdGltZXMpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PFRyYXZlcnNhbC5BZG1pbjxWZXJ0ZXgsIEVkZ2U+PiBnZXRMb2NhbENoaWxkcmVuKCkgewogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0aGlzLmVkZ2VUcmF2ZXJzYWwuZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdGVwL21hcC9QZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdGVwL21hcC9QZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtU3RlcC5qYXZhCmluZGV4IGUxY2JhNjAuLmQ5OGNmNWUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RlcC9tYXAvUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0ZXAvbWFwL1BlZXJQcmVzc3VyZVZlcnRleFByb2dyYW1TdGVwLmphdmEKQEAgLTI2LDkgKzI2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWdpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLkJ5TW9kdWxhdGluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuQ29uZmlndXJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRpbWVzTW9kdWxhdGluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLlBhcmFtZXRlcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIuVHJhdmVyc2VyUmVxdWlyZW1lbnQ7CkBAIC00Niw4ICs0NCw3IEBACiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBlZXJQcmVzc3VyZVZlcnRleFByb2dyYW1TdGVwIGV4dGVuZHMgVmVydGV4UHJvZ3JhbVN0ZXAKLSAgICAgICAgaW1wbGVtZW50cyBUcmF2ZXJzYWxQYXJlbnQsIEJ5TW9kdWxhdGluZywgVGltZXNNb2R1bGF0aW5nLCBDb25maWd1cmluZyB7CitwdWJsaWMgZmluYWwgY2xhc3MgUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbVN0ZXAgZXh0ZW5kcyBWZXJ0ZXhQcm9ncmFtU3RlcCBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgQ29uZmlndXJpbmcgewogCiAgICAgcHJpdmF0ZSBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVycygpOwogICAgIHByaXZhdGUgUHVyZVRyYXZlcnNhbDxWZXJ0ZXgsIEVkZ2U+IGVkZ2VUcmF2ZXJzYWw7CkBAIC04OSwzMyArODYsNiBAQAogICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKSBeIHRoaXMuZWRnZVRyYXZlcnNhbC5oYXNoQ29kZSgpIF4gdGhpcy5jbHVzdGVyUHJvcGVydHkuaGFzaENvZGUoKSBeIHRoaXMudGltZXM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjQuMCwgcmVwbGFjZWQgYnkge0BsaW5rICNjb25maWd1cmUoT2JqZWN0Li4uKX0KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1vZHVsYXRlQnkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IGVkZ2VUcmF2ZXJzYWwpIHsKLSAgICAgICAgY29uZmlndXJlKFBlZXJQcmVzc3VyZS5lZGdlcywgZWRnZVRyYXZlcnNhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjQuMCwgcmVwbGFjZWQgYnkge0BsaW5rICNjb25maWd1cmUoT2JqZWN0Li4uKX0KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1vZHVsYXRlQnkoZmluYWwgU3RyaW5nIGNsdXN0ZXJQcm9wZXJ0eSkgewotICAgICAgICBjb25maWd1cmUoUGVlclByZXNzdXJlLnByb3BlcnR5TmFtZSwgY2x1c3RlclByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuNC4wLCByZXBsYWNlZCBieSB7QGxpbmsgI2NvbmZpZ3VyZShPYmplY3QuLi4pfQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbW9kdWxhdGVUaW1lcyhpbnQgdGltZXMpIHsKLSAgICAgICAgY29uZmlndXJlKFBlZXJQcmVzc3VyZS50aW1lcywgdGltZXMpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PFRyYXZlcnNhbC5BZG1pbjxWZXJ0ZXgsIEVkZ2U+PiBnZXRMb2NhbENoaWxkcmVuKCkgewogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0aGlzLmVkZ2VUcmF2ZXJzYWwuZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9ncmFtVmVydGV4UHJvZ3JhbVN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvZ3JhbVZlcnRleFByb2dyYW1TdGVwLmphdmEKaW5kZXggNDlhZGQ3Mi4uMDI1MDY5ZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9ncmFtVmVydGV4UHJvZ3JhbVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb2dyYW1WZXJ0ZXhQcm9ncmFtU3RlcC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLk1hcENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NZW1vcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLlZlcnRleFByb2dyYW07CkBAIC00OCw3ICs0OCw2IEBACiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CiAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgZmluYWwgTWFwQ29uZmlndXJhdGlvbiBiYXNlID0gbmV3IE1hcENvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKTsKLSAgICAgICAgYmFzZS5zZXREZWxpbWl0ZXJQYXJzaW5nRGlzYWJsZWQodHJ1ZSk7CiAgICAgICAgIHZlcnRleFByb2dyYW0uc3RvcmVTdGF0ZShiYXNlKTsKICAgICAgICAgdGhpcy50b1N0cmluZ09mVmVydGV4UHJvZ3JhbSA9IHZlcnRleFByb2dyYW0udG9TdHJpbmcoKTsKICAgICAgICAgdGhpcy50cmF2ZXJzZXJSZXF1aXJlbWVudHMgPSB2ZXJ0ZXhQcm9ncmFtLmdldFRyYXZlcnNlclJlcXVpcmVtZW50cygpOwpAQCAtNTcsNyArNTYsNiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBWZXJ0ZXhQcm9ncmFtIGdlbmVyYXRlUHJvZ3JhbShmaW5hbCBHcmFwaCBncmFwaCwgZmluYWwgTWVtb3J5IG1lbW9yeSkgewogICAgICAgICBmaW5hbCBNYXBDb25maWd1cmF0aW9uIGJhc2UgPSBuZXcgTWFwQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pOwotICAgICAgICBiYXNlLnNldERlbGltaXRlclBhcnNpbmdEaXNhYmxlZCh0cnVlKTsKICAgICAgICAgUHVyZVRyYXZlcnNhbC5zdG9yZVN0YXRlKGJhc2UsIFJPT1RfVFJBVkVSU0FMLCBUcmF2ZXJzYWxIZWxwZXIuZ2V0Um9vdFRyYXZlcnNhbCh0aGlzLmdldFRyYXZlcnNhbCgpKS5jbG9uZSgpKTsKICAgICAgICAgYmFzZS5zZXRQcm9wZXJ0eShTVEVQX0lELCB0aGlzLmdldElkKCkpOwogICAgICAgICBpZiAobWVtb3J5LmV4aXN0cyhUcmF2ZXJzYWxWZXJ0ZXhQcm9ncmFtLkhBTFRFRF9UUkFWRVJTRVJTKSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RlcC9tYXAvVHJhdmVyc2FsVmVydGV4UHJvZ3JhbVN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RlcC9tYXAvVHJhdmVyc2FsVmVydGV4UHJvZ3JhbVN0ZXAuamF2YQppbmRleCAzMGNmZWU1Li4zZmEzNmE5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0ZXAvbWFwL1RyYXZlcnNhbFZlcnRleFByb2dyYW1TdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdGVwL21hcC9UcmF2ZXJzYWxWZXJ0ZXhQcm9ncmFtU3RlcC5qYXZhCkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBjb21wdXRlclNwZWNpZmljVHJhdmVyc2FsID0gdGhpcy5jb21wdXRlclRyYXZlcnNhbC5nZXRQdXJlKCk7CiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbFN0cmF0ZWdpZXMgY29tcHV0ZXJTcGVjaWZpY1N0cmF0ZWdpZXMgPSB0aGlzLmdldFRyYXZlcnNhbCgpLmdldFN0cmF0ZWdpZXMoKS5jbG9uZSgpOwogCi0gICAgICAgIEl0ZXJhdG9yVXRpbHMuZmlsdGVyKFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhncmFwaC5nZXRDbGFzcygpKS50b0xpc3QoKSwKKyAgICAgICAgSXRlcmF0b3JVdGlscy5maWx0ZXIoVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKGdyYXBoLmdldENsYXNzKCkpLAogICAgICAgICAgICAgICAgIHMgLT4gcyBpbnN0YW5jZW9mIFRyYXZlcnNhbFN0cmF0ZWd5LlByb3ZpZGVyT3B0aW1pemF0aW9uU3RyYXRlZ3kpLmZvckVhY2goY29tcHV0ZXJTcGVjaWZpY1N0cmF0ZWdpZXM6OmFkZFN0cmF0ZWdpZXMpOwogCiAgICAgICAgIGNvbXB1dGVyU3BlY2lmaWNUcmF2ZXJzYWwuc2V0U3RyYXRlZ2llcyhjb21wdXRlclNwZWNpZmljU3RyYXRlZ2llcyk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vVmVydGV4UHJvZ3JhbVN0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vVmVydGV4UHJvZ3JhbVN0cmF0ZWd5LmphdmEKaW5kZXggZmE2ZTIzZi4uOGMyZTI4YSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1ZlcnRleFByb2dyYW1TdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9WZXJ0ZXhQcm9ncmFtU3RyYXRlZ3kuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLlZlcnRleENvbXB1dGluZzsKQEAgLTM0LDcgKzM0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWdpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXzsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuUmVhZFdyaXRpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuQWJzdHJhY3RMYW1iZGFUcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5HcmFwaFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuRW1wdHlTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuQWJzdHJhY3RUcmF2ZXJzYWxTdHJhdGVneTsKQEAgLTcxLDcgKzcxLDkgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7CiAgICAgICAgIC8vIFZlcnRleFByb2dyYW1zIGNhbiBvbmx5IGV4ZWN1dGUgYXQgdGhlIHJvb3QgbGV2ZWwgb2YgYSBUcmF2ZXJzYWwgYW5kIHNob3VsZCBub3QgYmUgYXBwbGllZCBsb2NhbGx5IHByaW9yIHRvIFJlbW90ZVN0cmF0ZWd5Ci0gICAgICAgIGlmICghKHRyYXZlcnNhbC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEVtcHR5U3RlcCkgfHwgdHJhdmVyc2FsLmdldFN0cmF0ZWdpZXMoKS5nZXRTdHJhdGVneShSZW1vdGVTdHJhdGVneS5jbGFzcykuaXNQcmVzZW50KCkpCisgICAgICAgIGlmICghKHRyYXZlcnNhbC5pc1Jvb3QoKSkKKyAgICAgICAgICAgICAgICB8fCB0cmF2ZXJzYWwgaW5zdGFuY2VvZiBBYnN0cmFjdExhbWJkYVRyYXZlcnNhbAorICAgICAgICAgICAgICAgIHx8IHRyYXZlcnNhbC5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koUmVtb3RlU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpKQogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIC8vIGJhY2sgcHJvcGFnYXRlIGFzKCktbGFiZWxzIG9mZiBvZiB2ZXJ0ZXggY29tcHV0aW5nIHN0ZXBzCkBAIC0xNjAsOCArMTYyLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPENvbXB1dGVyPiBnZXRDb21wdXRlcihmaW5hbCBUcmF2ZXJzYWxTdHJhdGVnaWVzIHN0cmF0ZWdpZXMpIHsKLSAgICAgICAgZmluYWwgT3B0aW9uYWw8VHJhdmVyc2FsU3RyYXRlZ3k8Pz4+IG9wdGlvbmFsID0gc3RyYXRlZ2llcy50b0xpc3QoKS5zdHJlYW0oKS5maWx0ZXIoc3RyYXRlZ3kgLT4gc3RyYXRlZ3kgaW5zdGFuY2VvZiBWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3kpLmZpbmRBbnkoKTsKLSAgICAgICAgcmV0dXJuIG9wdGlvbmFsLmlzUHJlc2VudCgpID8gT3B0aW9uYWwub2YoKChWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3kpIG9wdGlvbmFsLmdldCgpKS5jb21wdXRlcikgOiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICBmaW5hbCBPcHRpb25hbDxWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3k+IG9wdGlvbmFsID0gc3RyYXRlZ2llcy5nZXRTdHJhdGVneShWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3kuY2xhc3MpOworICAgICAgICByZXR1cm4gb3B0aW9uYWwuaXNQcmVzZW50KCkgPyBPcHRpb25hbC5vZihvcHRpb25hbC5nZXQoKS5jb21wdXRlcikgOiBPcHRpb25hbC5lbXB0eSgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZEdyYXBoQ29tcHV0ZXJTdHJhdGVnaWVzKGZpbmFsIFRyYXZlcnNhbFNvdXJjZSB0cmF2ZXJzYWxTb3VyY2UpIHsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL01lc3NhZ2VQYXNzaW5nUmVkdWN0aW9uU3RyYXRlZ3kuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL01lc3NhZ2VQYXNzaW5nUmVkdWN0aW9uU3RyYXRlZ3kuamF2YQppbmRleCBjZmYxNTJlLi5mMzJkMzc2IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9NZXNzYWdlUGFzc2luZ1JlZHVjdGlvblN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vTWVzc2FnZVBhc3NpbmdSZWR1Y3Rpb25TdHJhdGVneS5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5UcmF2ZXJzYWxNYXBTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuVmVydGV4U3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JZGVudGl0eVN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuUHJvZmlsZVNpZGVFZmZlY3RTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlNpZGVFZmZlY3RTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkVtcHR5U3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LkFic3RyYWN0VHJhdmVyc2FsU3RyYXRlZ3k7CkBAIC05OCw3ICs5OSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIShjb21wdXRlclRyYXZlcnNhbC5nZXRTdGFydFN0ZXAoKS5nZXROZXh0U3RlcCgpIGluc3RhbmNlb2YgQmFycmllcikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhbEhlbHBlci5oYXNTdGVwT2ZBc3NpZ25hYmxlQ2xhc3NSZWN1cnNpdmVseShBcnJheXMuYXNMaXN0KFZlcnRleFN0ZXAuY2xhc3MsIEVkZ2VWZXJ0ZXhTdGVwLmNsYXNzKSwgY29tcHV0ZXJUcmF2ZXJzYWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuaXNMb2NhbFN0YXJHcmFwaChjb21wdXRlclRyYXZlcnNhbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RlcCBiYXJyaWVyID0gKFN0ZXApIFRyYXZlcnNhbEhlbHBlci5nZXRGaXJzdFN0ZXBPZkFzc2lnbmFibGVDbGFzcyhCYXJyaWVyLmNsYXNzLCBjb21wdXRlclRyYXZlcnNhbCkub3JFbHNlKG51bGwpOworICAgICAgICAgICAgICAgICAgICBTdGVwIGJhcnJpZXIgPSAoU3RlcCkgVHJhdmVyc2FsSGVscGVyLmdldEZpcnN0U3RlcE9mQXNzaWduYWJsZUNsYXNzKEJhcnJpZXIuY2xhc3MsIGNvbXB1dGVyVHJhdmVyc2FsKS5vckVsc2UobnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGJhcnJpZXIgaXNuJ3QgcHJlc2VudCBnb3R0YSBjaGVjayBmb3IgdW5jYXBwZWQgcHJvZmlsZSgpIHdoaWNoIGNhbiBoYXBwZW4gaWYgeW91IGRvCisgICAgICAgICAgICAgICAgICAgIC8vIHByb2ZpbGUoIm1ldHJpY3MiKSAtIHNlZSBiZWxvdyBmb3IgbW9yZSB3b3JyaWVzCisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGJhcnJpZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2ZpbGVTaWRlRWZmZWN0U3RlcCBwc2VzID0gVHJhdmVyc2FsSGVscGVyLmdldEZpcnN0U3RlcE9mQXNzaWduYWJsZUNsYXNzKFByb2ZpbGVTaWRlRWZmZWN0U3RlcC5jbGFzcywgY29tcHV0ZXJUcmF2ZXJzYWwpLm9yRWxzZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwc2VzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFycmllciA9IHBzZXMuZ2V0UHJldmlvdXNTdGVwKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYmFycmllciBpcyBhIHByb2ZpbGUoKSB0aGVuIHdlJ2xsIG1lc3Mgc3R1ZmYgdXAgaWYgd2Ugd3JhcCB0aGF0IGluIGEgbG9jYWwoKSBhcyBpbjoKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbG9jYWwoLi4uLCBQcm9maWxlU2lkZUVmZmVjdFN0ZXApCisgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdvbid0IGNvbXB1dGUgcmlnaHQgb24gT0xBUCAob3IgYW55dGhpbmc/PykuIEJ5IHN0ZXBwaW5nIGJhY2sgd2UgY3V0IHRoaW5ncyBvZmYgYXQKKyAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBiZWZvcmUgdGhlIFByb2ZpbGVTaWRlRWZmZWN0U3RlcCB0byBnbyBpbnNpZGUgdGhlIGxvY2FsKCkgc28gdGhhdCBQcm9maWxlU2lkZUVmZmVjdFN0ZXAKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvd3MgdXAganVzdCBhZnRlciBpdAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyB3aHkgZG9lcyB0aGlzIHN0cmF0ZWd5IG5lZWQgdG8ga25vdyBzbyBtdWNoIGFib3V0IHByb2ZpbGUhPyEKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhcnJpZXIgIT0gbnVsbCAmJiBiYXJyaWVyLmdldFByZXZpb3VzU3RlcCgpIGluc3RhbmNlb2YgUHJvZmlsZVNpZGVFZmZlY3RTdGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgYmFycmllciA9IGJhcnJpZXIuZ2V0UHJldmlvdXNTdGVwKCkuZ2V0UHJldmlvdXNTdGVwKCk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKE1lc3NhZ2VQYXNzaW5nUmVkdWN0aW9uU3RyYXRlZ3kuaW5zZXJ0RWxlbWVudElkKGJhcnJpZXIpKSAvLyBvdXQoKS5jb3VudCgpIC0+IG91dCgpLmlkKCkuY291bnQoKQogICAgICAgICAgICAgICAgICAgICAgICAgVHJhdmVyc2FsSGVscGVyLmluc2VydEJlZm9yZVN0ZXAobmV3IElkU3RlcChjb21wdXRlclRyYXZlcnNhbCksIGJhcnJpZXIsIGNvbXB1dGVyVHJhdmVyc2FsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCEoTWVzc2FnZVBhc3NpbmdSZWR1Y3Rpb25TdHJhdGVneS5lbmRzV2l0aEVsZW1lbnQobnVsbCA9PSBiYXJyaWVyID8gY29tcHV0ZXJUcmF2ZXJzYWwuZ2V0RW5kU3RlcCgpIDogYmFycmllcikpKSB7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9BYnN0cmFjdFZlcnRleFByb2dyYW1CdWlsZGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9BYnN0cmFjdFZlcnRleFByb2dyYW1CdWlsZGVyLmphdmEKaW5kZXggM2Q4Y2VkYy4uNjgwZGQ3OSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvQWJzdHJhY3RWZXJ0ZXhQcm9ncmFtQnVpbGRlci5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci91dGlsL0Fic3RyYWN0VmVydGV4UHJvZ3JhbUJ1aWxkZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci51dGlsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5WZXJ0ZXhQcm9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwogCkBAIC0yOSwyMSArMjksMTAgQEAKIAogICAgIHByb3RlY3RlZCBmaW5hbCBCYXNlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7CiAKLSAgICBwdWJsaWMgQWJzdHJhY3RWZXJ0ZXhQcm9ncmFtQnVpbGRlcigpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNldERlbGltaXRlclBhcnNpbmdEaXNhYmxlZCh0cnVlKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgQWJzdHJhY3RWZXJ0ZXhQcm9ncmFtQnVpbGRlcihmaW5hbCBDbGFzczw/IGV4dGVuZHMgVmVydGV4UHJvZ3JhbT4gdmVydGV4UHJvZ3JhbUNsYXNzKSB7Ci0gICAgICAgIHRoaXMoKTsKICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNldFByb3BlcnR5KFZlcnRleFByb2dyYW0uVkVSVEVYX1BST0dSQU0sIHZlcnRleFByb2dyYW1DbGFzcy5nZXROYW1lKCkpOwogICAgIH0KIAotICAgIC8qQE92ZXJyaWRlCi0gICAgcHVibGljIEIgZ3JhcGgoZmluYWwgR3JhcGggZ3JhcGgpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNldFByb3BlcnR5KEdyYXBoLkdSQVBILCBncmFwaC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiAoQikgdGhpczsKLSAgICB9Ki8KLQogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci91dGlsL0NvbXB1dGVyR3JhcGguamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci91dGlsL0NvbXB1dGVyR3JhcGguamF2YQppbmRleCAyZTQwODJjLi43NzQ1M2ZlIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9Db21wdXRlckdyYXBoLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvQ29tcHV0ZXJHcmFwaC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnV0aWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5WZXJ0ZXhDb21wdXRlS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5WZXJ0ZXhQcm9ncmFtOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvU3RhdGljTWFwUmVkdWNlLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9TdGF0aWNNYXBSZWR1Y2UuamF2YQppbmRleCBlZTkwYTUzLi4zMGYyNTkwIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9TdGF0aWNNYXBSZWR1Y2UuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9TdGF0aWNNYXBSZWR1Y2UuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci51dGlsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuTWFwUmVkdWNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvU3RhdGljVmVydGV4UHJvZ3JhbS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvU3RhdGljVmVydGV4UHJvZ3JhbS5qYXZhCmluZGV4IDg3Zjk3NWQuLmI0ZDA5N2EgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci91dGlsL1N0YXRpY1ZlcnRleFByb2dyYW0uamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9TdGF0aWNWZXJ0ZXhQcm9ncmFtLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnV0aWw7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuVmVydGV4UHJvZ3JhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogCiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvVmVydGV4UHJvZ3JhbUhlbHBlci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvVmVydGV4UHJvZ3JhbUhlbHBlci5qYXZhCmluZGV4IDIyOTdjOTAuLmVmNDk3ZmYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci91dGlsL1ZlcnRleFByb2dyYW1IZWxwZXIuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9WZXJ0ZXhQcm9ncmFtSGVscGVyLmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudXRpbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkFic3RyYWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5BYnN0cmFjdENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLlZlcnRleENvbXB1dGVLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5TdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwpAQCAtNjEsOCArNjEsNiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBmaW5hbCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uIGluc3RhbmNlb2YgQWJzdHJhY3RDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgKChBYnN0cmFjdENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24pLnNldERlbGltaXRlclBhcnNpbmdEaXNhYmxlZCh0cnVlKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoa2V5LCBCYXNlNjQuZ2V0RW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKFNlcmlhbGl6ZXIuc2VyaWFsaXplT2JqZWN0KG9iamVjdCkpKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS9SZW1vdGVDb25uZWN0aW9uLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL1JlbW90ZUNvbm5lY3Rpb24uamF2YQppbmRleCAwYzEyNGU3Li5jMGRhYWE3IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL1JlbW90ZUNvbm5lY3Rpb24uamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL1JlbW90ZUNvbm5lY3Rpb24uamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsLlJlbW90ZVRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkJ5dGVjb2RlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvQWJzdHJhY3RSZW1vdGVUcmF2ZXJzYWwuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL0Fic3RyYWN0UmVtb3RlVHJhdmVyc2FsLmphdmEKaW5kZXggYjIzM2EzMS4uMzYzZGU2ZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvQWJzdHJhY3RSZW1vdGVUcmF2ZXJzYWwuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL3RyYXZlcnNhbC9BYnN0cmFjdFJlbW90ZVRyYXZlcnNhbC5qYXZhCkBAIC01Myw2ICs1MywxMSBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzZXIuQWRtaW48RT4gbmV4dFRyYXZlcnNlcigpOwogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRyYXZlcnNhbFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ5dGVjb2RlIGdldEJ5dGVjb2RlKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvQWJzdHJhY3RSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvQWJzdHJhY3RSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU2ODQ4Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL0Fic3RyYWN0UmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS50cmF2ZXJzYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNpZGVFZmZlY3RzOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmluYXJ5T3BlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5VbmFyeU9wZXJhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCBkaXJlY3RseSByZXBsYWNlZCwgcHJlZmVyIHVzZSBvZiB7QGxpbmsgR3JhcGhUcmF2ZXJzYWwjY2FwKFN0cmluZywgU3RyaW5nLi4uKX0KLSAqIHRvIHJldHVybiB0aGUgcmVzdWx0IGFzIHBhcnQgb2YgdGhlIHRyYXZlcnNhbCBpdGVyYXRpb24uCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyBpbXBsZW1lbnRzIFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgdHJhdmVyc2FscyBkbyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8Vj4gdm9pZCByZWdpc3RlcihmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTdXBwbGllcjxWPiBpbml0aWFsVmFsdWUsIEJpbmFyeU9wZXJhdG9yPFY+IHJlZHVjZXIpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgdHJhdmVyc2FscyBkbyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8Vj4gdm9pZCByZWdpc3RlcklmQWJzZW50KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN1cHBsaWVyPFY+IGluaXRpYWxWYWx1ZSwgQmluYXJ5T3BlcmF0b3I8Vj4gcmVkdWNlcikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBCaW5hcnlPcGVyYXRvcjxWPiBnZXRSZWR1Y2VyKGZpbmFsIFN0cmluZyBrZXkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBTdXBwbGllcjxWPiBnZXRTdXBwbGllcihmaW5hbCBTdHJpbmcga2V5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgdHJhdmVyc2FscyBkbyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxTPiB2b2lkIHNldFNhY2soZmluYWwgU3VwcGxpZXI8Uz4gaW5pdGlhbFZhbHVlLCBVbmFyeU9wZXJhdG9yPFM+IHNwbGl0T3BlcmF0b3IsIGZpbmFsIEJpbmFyeU9wZXJhdG9yPFM+IG1lcmdlT3BlcmF0b3IpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgdHJhdmVyc2FscyBkbyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8Uz4gU3VwcGxpZXI8Uz4gZ2V0U2Fja0luaXRpYWxWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIC8vIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVtb3RlIHRyYXZlcnNhbHMgZG8gbm90IHN1cHBvcnQgdGhpcyBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFM+IFVuYXJ5T3BlcmF0b3I8Uz4gZ2V0U2Fja1NwbGl0dGVyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxTPiBCaW5hcnlPcGVyYXRvcjxTPiBnZXRTYWNrTWVyZ2VyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRyYXZlcnNhbFNpZGVFZmZlY3RzIGNsb25lKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSB0cmF2ZXJzYWxzIGRvIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbWVyZ2VJbnRvKGZpbmFsIFRyYXZlcnNhbFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVtb3RlIHRyYXZlcnNhbHMgZG8gbm90IHN1cHBvcnQgdGhpcyBtZXRob2QiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL3RyYXZlcnNhbC9FbWJlZGRlZFJlbW90ZVRyYXZlcnNhbC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvRW1iZWRkZWRSZW1vdGVUcmF2ZXJzYWwuamF2YQppbmRleCAxMGUyN2FlLi45ZGMzN2U3IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL3RyYXZlcnNhbC9FbWJlZGRlZFJlbW90ZVRyYXZlcnNhbC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL0VtYmVkZGVkUmVtb3RlVHJhdmVyc2FsLmphdmEKQEAgLTM5LDE1ICszOSw2IEBACiAgICAgICAgIHJldHVybiB0LmFzQWRtaW4oKS5uZXh0VHJhdmVyc2VyKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgYXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkLCBzZWUge0BsaW5rIEFkbWluI2dldFNpZGVFZmZlY3RzKCl9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzKCkgewotICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHModC5hc0FkbWluKCkuZ2V0U2lkZUVmZmVjdHMoKSk7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgcmV0dXJuIHQuaGFzTmV4dCgpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvRW1iZWRkZWRSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvRW1iZWRkZWRSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjgxNWZkLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL0VtYmVkZGVkUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU2lkZUVmZmVjdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEdlbmVyYXRlZCBieSB0aGUge0BsaW5rIEVtYmVkZGVkUmVtb3RlVHJhdmVyc2FsfSB0byBoZWxwIHNpbXVsYXRlIGEgcmVtb3RlIHRyYXZlcnNhbCBzaWRlLWVmZmVjdHMgd2l0aGluIHRoZSBzYW1lIEpWTS4KLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCi0gKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQsIHByZWZlciB1c2Ugb2Yge0BsaW5rIEdyYXBoVHJhdmVyc2FsI2NhcChTdHJpbmcsIFN0cmluZy4uLil9Ci0gKiB0byByZXR1cm4gdGhlIHJlc3VsdCBhcyBwYXJ0IG9mIHRoZSB0cmF2ZXJzYWwgaXRlcmF0aW9uLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIEVtYmVkZGVkUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIHsKLQotICAgIHByaXZhdGUgZmluYWwgVHJhdmVyc2FsU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHM7Ci0KLSAgICBwdWJsaWMgRW1iZWRkZWRSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhmaW5hbCBUcmF2ZXJzYWxTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cykgewotICAgICAgICB0aGlzLnNpZGVFZmZlY3RzID0gc2lkZUVmZmVjdHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBWIGdldChmaW5hbCBTdHJpbmcga2V5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHNpZGVFZmZlY3RzLmdldChrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlzKCkgewotICAgICAgICByZXR1cm4gc2lkZUVmZmVjdHMua2V5cygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL1JlbW90ZVRyYXZlcnNhbC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvUmVtb3RlVHJhdmVyc2FsLmphdmEKaW5kZXggZWQ0YjFlYi4uNjlkYjZjNSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvUmVtb3RlVHJhdmVyc2FsLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvUmVtb3RlVHJhdmVyc2FsLmphdmEKQEAgLTM3LDE0ICszNyw0IEBACiAgKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVtb3RlVHJhdmVyc2FsPFMsRT4gZXh0ZW5kcyBUcmF2ZXJzYWwuQWRtaW48UyxFPiB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHJlbW90ZSBzaWRlLWVmZmVjdHMgZ2VuZXJhdGVkIGJ5IHRoZSB0cmF2ZXJzYWwgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NpYmxlIHRvIHRoZSBjbGllbnQuIE5vdGUgdGhhdAotICAgICAqICJzaWRlLWVmZmVjdCIgcmVmZXJzIHRvIHRoZSB2YWx1ZSBpbiAiYSIgaW4gdGhlIHRyYXZlcnNhbCB7QGNvZGUgZy5WKCkuYWdncmVnYXRlKCdhJykudmFsdWVzKCduYW1lJyl9LgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgYXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkLCBzZWUge0BsaW5rIEFkbWluI2dldFNpZGVFZmZlY3RzKCl9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzKCk7CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL3RyYXZlcnNhbC9SZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxYTUxMC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL3RyYXZlcnNhbC9SZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTaWRlRWZmZWN0czsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuRGVmYXVsdFRyYXZlcnNhbFNpZGVFZmZlY3RzOwotCi0vKioKLSAqIFdoZW4gYSB0cmF2ZXJzYWwgaXMgZXhlY3V0ZWQgcmVtb3RlbHksIHRoZSBhYmlsaXR5IHRvIHJldHJpZXZlIHRob3NlIHNpZGUtZWZmZWN0cyAoaS5lLiB0aGUgdmFsdWUgaW4gImEiIGluIHRoZQotICogdHJhdmVyc2FsIHtAY29kZSBnLlYoKS5hZ2dyZWdhdGUoJ2EnKS52YWx1ZXMoJ25hbWUnKX0pIGNhbiBiZSBleHBvc2VkIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuIEFzIGFuIGV4YW1wbGUsCi0gKiB3aXRoIFRpbmtlclBvcCdzIHtAY29kZSBEcml2ZXJSZW1vdGVDb25uZWN0aW9ufSB0aGF0IGNvbm5lY3RzIHRvIEdyZW1saW4gU2VydmVyIGFzIGEgInJlbW90ZSIsIHRoZSBzaWRlLWVmZmVjdHMKLSAqIGFyZSBsZWZ0IG9uIHRoZSBzZXJ2ZXIuIFRoZSB7QGNvZGUgUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHN9IGltcGxlbWVudGF0aW9uLCBpbiB0aGF0IGNhc2UsIGxhemlseSBsb2FkcyB0aG9zZQotICogc2lkZS1lZmZlY3RzIHdoZW4gcmVxdWVzdGVkLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGF0dGVtcHQgdG8gbWF0Y2ggdGhlIGZlYXR1cmVzIG9mIHRoZSBsb2NhbGx5IHByb2Nlc3NlZAotICoge0BsaW5rIERlZmF1bHRUcmF2ZXJzYWxTaWRlRWZmZWN0c30gdG8ga2VlcCBjb25zaXN0ZW5jeS4KLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCi0gKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQsIHByZWZlciB1c2Ugb2Yge0BsaW5rIEdyYXBoVHJhdmVyc2FsI2NhcChTdHJpbmcsIFN0cmluZy4uLil9Ci0gKiB0byByZXR1cm4gdGhlIHJlc3VsdCBhcyBwYXJ0IG9mIHRoZSB0cmF2ZXJzYWwgaXRlcmF0aW9uLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGludGVyZmFjZSBSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyBleHRlbmRzIFRyYXZlcnNhbFNpZGVFZmZlY3RzLCBBdXRvQ2xvc2VhYmxlIHsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSAicmVtb3RlIiB0aGF0IGFjdHVhbGx5IGV4ZWN1dGVkIHRoZSB0cmF2ZXJzYWwgbWFpbnRhaW5lZCByZXNvdXJjZXMgdGhhdCBjYW4gYmUgcmVsZWFzZWQsIHdoZW4gdGhlIHVzZXIKLSAgICAgKiBpcyBkb25lIHdpdGggdGhlIHNpZGUtZWZmZWN0cywgdGhlbiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIHRoYXQgcmVsZWFzZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZGVmYXVsdCB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vICBkbyBub3RoaW5nCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvc3RlcC9tYXAvUmVtb3RlU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvc3RlcC9tYXAvUmVtb3RlU3RlcC5qYXZhCmluZGV4IGExMDNmNmEuLmJlNjIzY2QgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL3N0ZXAvbWFwL1JlbW90ZVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL3RyYXZlcnNhbC9zdGVwL21hcC9SZW1vdGVTdGVwLmphdmEKQEAgLTg4LDcgKzg4LDYgQEAKICAgICAgICAgICAgIGlmIChudWxsID09IHRyYXZlcnNhbEZ1dHVyZS5nZXQoKSkgewogICAgICAgICAgICAgICAgIHRyYXZlcnNhbEZ1dHVyZS5zZXQodGhpcy5yZW1vdGVDb25uZWN0aW9uLnN1Ym1pdEFzeW5jKHRoaXMudHJhdmVyc2FsLmdldEJ5dGVjb2RlKCkpLjxUcmF2ZXJzYWw8PywgRT4+dGhlbkFwcGx5KHQgLT4gewogICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW90ZVRyYXZlcnNhbCA9IChSZW1vdGVUcmF2ZXJzYWw8PywgRT4pIHQ7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhdmVyc2FsLnNldFNpZGVFZmZlY3RzKHRoaXMucmVtb3RlVHJhdmVyc2FsLmdldFNpZGVFZmZlY3RzKCkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhdmVyc2FsOwogICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vUmVtb3RlU3RyYXRlZ3kuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9yZW1vdGUvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vUmVtb3RlU3RyYXRlZ3kuamF2YQppbmRleCA3OTg1NWQwLi5mY2Q1MTRlIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvcmVtb3RlL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1JlbW90ZVN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3JlbW90ZS90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9SZW1vdGVTdHJhdGVneS5qYXZhCkBAIC04Miw3ICs4Miw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7Ci0gICAgICAgIGlmICghKHRyYXZlcnNhbC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEVtcHR5U3RlcCkpCisgICAgICAgIGlmICghKHRyYXZlcnNhbC5pc1Jvb3QoKSkpCiAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgLy8gcmVtb3RlIHN0ZXAgd3JhcHMgdGhlIHRyYXZlcnNhbCBhbmQgZW1pdHMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgcmVtb3RlIGNvbm5lY3Rpb24uCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL0Fub255bW91c1RyYXZlcnNhbFNvdXJjZS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9Bbm9ueW1vdXNUcmF2ZXJzYWxTb3VyY2UuamF2YQppbmRleCBiMGJlNDZmLi5mMDY3NDUxIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL0Fub255bW91c1RyYXZlcnNhbFNvdXJjZS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvQW5vbnltb3VzVHJhdmVyc2FsU291cmNlLmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuYnVpbGRlci5mbHVlbnQuQ29uZmlndXJhdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS5SZW1vdGVDb25uZWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwpAQCAtNjIsNyArNjIsOCBAQAogICAgICAqIEBwYXJhbSBjb25maWdGaWxlIGEgcGF0aCB0byBhIGZpbGUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBwcm92aWRlZCB0byBjb25maWd1cmUgYSB7QGxpbmsgUmVtb3RlQ29ubmVjdGlvbn0KICAgICAgKi8KICAgICBwdWJsaWMgVCB3aXRoUmVtb3RlKGZpbmFsIFN0cmluZyBjb25maWdGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHdpdGhSZW1vdGUobmV3IFByb3BlcnRpZXNDb25maWd1cmF0aW9uKGNvbmZpZ0ZpbGUpKTsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbnMgY29uZmlncyA9IG5ldyBDb25maWd1cmF0aW9ucygpOworICAgICAgICByZXR1cm4gd2l0aFJlbW90ZShjb25maWdzLnByb3BlcnRpZXMoKGNvbmZpZ0ZpbGUpKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL0J5dGVjb2RlLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL0J5dGVjb2RlLmphdmEKaW5kZXggYTQwNmM1Ny4uZmZlNjM5MCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9CeXRlY29kZS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvQnl0ZWNvZGUuamF2YQpAQCAtMTM3LDYgKzEzNywxMCBAQAogICAgICAgICByZXR1cm4gYmluZGluZ3NNYXA7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlSW5zdHJ1Y3Rpb25zLmlzRW1wdHkoKSAmJiB0aGlzLnN0ZXBJbnN0cnVjdGlvbnMuaXNFbXB0eSgpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWRkQXJndW1lbnRCaW5kaW5nKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYmluZGluZ3NNYXAsIGZpbmFsIE9iamVjdCBhcmd1bWVudCkgewogICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nKQogICAgICAgICAgICAgYmluZGluZ3NNYXAucHV0KCgoQmluZGluZykgYXJndW1lbnQpLmtleSwgKChCaW5kaW5nKSBhcmd1bWVudCkudmFsdWUpOwpAQCAtMjg3LDkgKzI5MSwxNCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmluZGluZzw+KHZhcmlhYmxlLCBjb252ZXJ0QXJndW1lbnQoYXJndW1lbnQsIGZhbHNlKSk7CiAgICAgICAgIH0KICAgICAgICAgLy8KLSAgICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgVHJhdmVyc2FsKQorICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBUcmF2ZXJzYWwpIHsKKyAgICAgICAgICAgIC8vIHByZXZlbnQgdXNlIG9mICJnIiB0byBzcGF3biBjaGlsZCB0cmF2ZXJzYWxzCisgICAgICAgICAgICBpZiAoKChUcmF2ZXJzYWwpIGFyZ3VtZW50KS5hc0FkbWluKCkuZ2V0VHJhdmVyc2FsU291cmNlKCkuaXNQcmVzZW50KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjaGlsZCB0cmF2ZXJzYWwgb2YgJXMgd2FzIG5vdCBzcGF3bmVkIGFub255bW91c2x5IC0gdXNlIHRoZSBfXyBjbGFzcyByYXRoZXIgdGhhbiBhIFRyYXZlcnNhbFNvdXJjZSB0byBjb25zdHJ1Y3QgdGhlIGNoaWxkIHRyYXZlcnNhbCIsIGFyZ3VtZW50KSk7CisKICAgICAgICAgICAgIHJldHVybiAoKFRyYXZlcnNhbCkgYXJndW1lbnQpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpOwotICAgICAgICBlbHNlIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgTWFwKSB7CiAgICAgICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKChNYXApIGFyZ3VtZW50KS5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8PywgPz4gZW50cnkgOiAoKE1hcDw/LCA/PikgYXJndW1lbnQpLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgICAgICBtYXAucHV0KGNvbnZlcnRBcmd1bWVudChlbnRyeS5nZXRLZXkoKSwgdHJ1ZSksIGNvbnZlcnRBcmd1bWVudChlbnRyeS5nZXRWYWx1ZSgpLCB0cnVlKSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL09yZGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL09yZGVyLmphdmEKaW5kZXggMmI1MGEwYy4uZDRkNTViMCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9PcmRlci5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvT3JkZXIuamF2YQpAQCAtMzIsNTIgKzMyLDE2IEBACiBwdWJsaWMgZW51bSBPcmRlciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8T2JqZWN0PiB7CiAKICAgICAvKioKLSAgICAgKiBPcmRlciBpbiBhc2NlbmRpbmcgZmFzaGlvbgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMC4wLWluY3ViYXRpbmcKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy40LCByZXBsYWNlZCBieSB7QGxpbmsgI2FzY30uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBpbmNyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBPYmplY3QgZmlyc3QsIGZpbmFsIE9iamVjdCBzZWNvbmQpIHsKLSAgICAgICAgICAgIHJldHVybiBhc2MuY29tcGFyZShmaXJzdCwgc2Vjb25kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT3JkZXIgcmV2ZXJzZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjcjsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBPcmRlciBpbiBkZXNjZW5kaW5nIGZhc2hpb24uCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wLjAtaW5jdWJhdGluZwotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjQsIHJlcGxhY2VkIGJ5IHtAbGluayAjZGVzY30uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBkZWNyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBPYmplY3QgZmlyc3QsIGZpbmFsIE9iamVjdCBzZWNvbmQpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNjLmNvbXBhcmUoZmlyc3QsIHNlY29uZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9yZGVyIHJldmVyc2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIGluY3I7Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogT3JkZXIgaW4gYSByYW5kb20gZmFzaGlvbi4KKyAgICAgKiBPcmRlciBpbiBhIHJhbmRvbSBmYXNoaW9uLiBXaGlsZSB0aGlzIGVudW0gaW1wbGVtZW50cyB7QGNvZGUgQ29tcGFyYXRvcn0sIHRoZSB7QGNvZGUgY29tcGFyZShhLGIpfSBtZXRob2QgaXMgbm90CisgICAgICogc3VwcG9ydGVkIGFzIGEgZGlyZWN0IGNhbGwuIFRoaXMgY2hhbmdlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgY29tcGFyZShhLGIpfSBvY2N1cnJlZCBhdCAzLjUuMCBidXQKKyAgICAgKiB0aGlzIGltcGxlbWVudGF0aW9uIHdhcyBuZXZlciB1c2VkIGRpcmVjdGx5IHdpdGhpbiB0aGUgVGlua2VyUG9wIGNvZGUgYmFzZS4KICAgICAgKgogICAgICAqIEBzaW5jZSAzLjAuMC1pbmN1YmF0aW5nCiAgICAgICovCiAgICAgc2h1ZmZsZSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgT2JqZWN0IGZpcnN0LCBmaW5hbCBPYmplY3Qgc2Vjb25kKSB7Ci0gICAgICAgICAgICByZXR1cm4gUkFORE9NLm5leHRCb29sZWFuKCkgPyAtMSA6IDE7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk9yZGVyLnNodWZmbGUgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGFuIGFjdHVhbCBDb21wYXJhdG9yIC0gaXQgaXMgYSBtYXJrZXIgb25seSIpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC04NywxMSArNTEsMTMgQEAKICAgICB9LAogCiAgICAgLyoqCi0gICAgICogT3JkZXIgaW4gYXNjZW5kaW5nIGZhc2hpb24KKyAgICAgKiBPcmRlciBpbiBhc2NlbmRpbmcgZmFzaGlvbi4KICAgICAgKgogICAgICAqIEBzaW5jZSAzLjMuNAogICAgICAqLwogICAgIGFzYyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxDb21wYXJhYmxlPiBhc2NlbmRpbmdDb21wYXJhdG9yID0gQ29tcGFyYXRvci5udWxsc0ZpcnN0KENvbXBhcmF0b3IuPENvbXBhcmFibGU+bmF0dXJhbE9yZGVyKCkpOworCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgT2JqZWN0IGZpcnN0LCBmaW5hbCBPYmplY3Qgc2Vjb25kKSB7CiAgICAgICAgICAgICAvLyBuZWVkIHRvIGNvbnZlcnQgZW51bSB0byBzdHJpbmcgcmVwcmVzZW50YXRpb25zIGZvciBjb21wYXJpc29uIG9yIGVsc2UgeW91IGNhbiBnZXQgY2FzdCBleGNlcHRpb25zLgpAQCAtMTAwLDcgKzY2LDcgQEAKICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBzID0gc2Vjb25kIGluc3RhbmNlb2YgRW51bTw/PiA/ICgoRW51bTw/Pikgc2Vjb25kKS5uYW1lKCkgOiBzZWNvbmQ7CiAgICAgICAgICAgICByZXR1cm4gZiBpbnN0YW5jZW9mIE51bWJlciAmJiBzIGluc3RhbmNlb2YgTnVtYmVyCiAgICAgICAgICAgICAgICAgICAgID8gTnVtYmVySGVscGVyLmNvbXBhcmUoKE51bWJlcikgZiwgKE51bWJlcikgcykKLSAgICAgICAgICAgICAgICAgICAgOiBDb21wYXJhdG9yLjxDb21wYXJhYmxlPm5hdHVyYWxPcmRlcigpLmNvbXBhcmUoKENvbXBhcmFibGUpIGYsIChDb21wYXJhYmxlKSBzKTsKKyAgICAgICAgICAgICAgICAgICAgOiBhc2NlbmRpbmdDb21wYXJhdG9yLmNvbXBhcmUoKENvbXBhcmFibGUpIGYsIChDb21wYXJhYmxlKSBzKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTE1LDYgKzgxLDggQEAKICAgICAgKiBAc2luY2UgMy4zLjQKICAgICAgKi8KICAgICBkZXNjIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPENvbXBhcmFibGU+IGRlc2NlbmRpbmdDb21wYXJhdG9yID0gQ29tcGFyYXRvci5udWxsc0xhc3QoQ29tcGFyYXRvci48Q29tcGFyYWJsZT5yZXZlcnNlT3JkZXIoKSk7CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBPYmplY3QgZmlyc3QsIGZpbmFsIE9iamVjdCBzZWNvbmQpIHsKICAgICAgICAgICAgIC8vIG5lZWQgdG8gY29udmVydCBlbnVtIHRvIHN0cmluZyByZXByZXNlbnRhdGlvbnMgZm9yIGNvbXBhcmlzb24gb3IgZWxzZSB5b3UgY2FuIGdldCBjYXN0IGV4Y2VwdGlvbnMuCkBAIC0xMjMsNyArOTEsNyBAQAogICAgICAgICAgICAgZmluYWwgT2JqZWN0IHMgPSBzZWNvbmQgaW5zdGFuY2VvZiBFbnVtPD8+ID8gKChFbnVtPD8+KSBzZWNvbmQpLm5hbWUoKSA6IHNlY29uZDsKICAgICAgICAgICAgIHJldHVybiBmIGluc3RhbmNlb2YgTnVtYmVyICYmIHMgaW5zdGFuY2VvZiBOdW1iZXIKICAgICAgICAgICAgICAgICAgICAgPyBOdW1iZXJIZWxwZXIuY29tcGFyZSgoTnVtYmVyKSBzLCAoTnVtYmVyKSBmKQotICAgICAgICAgICAgICAgICAgICA6IENvbXBhcmF0b3IuPENvbXBhcmFibGU+cmV2ZXJzZU9yZGVyKCkuY29tcGFyZSgoQ29tcGFyYWJsZSkgZiwgKENvbXBhcmFibGUpIHMpOworICAgICAgICAgICAgICAgICAgICA6IGRlc2NlbmRpbmdDb21wYXJhdG9yLmNvbXBhcmUoKENvbXBhcmFibGUpIGYsIChDb21wYXJhYmxlKSBzKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9TY3JpcHQuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvU2NyaXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMjdkZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvU2NyaXB0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKKy8qKgorICogR2VuZXJhbCByZXByZXNlbnRhdGlvbiBvZiBzY3JpcHQKKyAqCisgKiBAYXV0aG9yIFN0YXJrIEFyeWEgKHNhbmRzemhvdS56akBhbGliYWJhLWluYy5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTY3JpcHQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFRklYID0gIl9hcmdzXyI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyICBzY3JpcHRCdWlsZGVyOworICAgIHByaXZhdGUgZmluYWwgTWFwPE9iamVjdCwgU3RyaW5nPiBwYXJhbWV0ZXJzOworCisgICAgcHVibGljIFNjcmlwdCgpIHsKKyAgICAgICAgc2NyaXB0QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc2NyaXB0QnVpbGRlci5zZXRMZW5ndGgoMCk7CisgICAgICAgIHBhcmFtZXRlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NyaXB0IGFwcGVuZChmaW5hbCBTdHJpbmcgc2NyaXB0KSB7CisgICAgICAgc2NyaXB0QnVpbGRlci5hcHBlbmQoc2NyaXB0KTsKKyAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NyaXB0IHNldENoYXJBdEVuZChmaW5hbCBjaGFyIGNoKSB7CisgICAgICAgIHNjcmlwdEJ1aWxkZXIuc2V0Q2hhckF0KHNjcmlwdEJ1aWxkZXIubGVuZ3RoKCkgLSAxLCBjaCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyA8Vj4gU2NyaXB0IGdldEJvdW5kS2V5T3JBc3NpZ24oZmluYWwgYm9vbGVhbiB3aXRoUGFyYW1ldGVycywgZmluYWwgViB2YWx1ZSkgeworICAgICAgICBpZiAod2l0aFBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1ldGVycy5jb250YWluc0tleSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dCh2YWx1ZSwgZ2V0TmV4dEJvdW5kS2V5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwZW5kKHBhcmFtZXRlcnMuZ2V0KHZhbHVlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcHBlbmQodmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHQoKSB7CisgICAgICAgIHJldHVybiBzY3JpcHRCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIE9wdGlvbmFsPE1hcDxTdHJpbmcsT2JqZWN0Pj4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUocGFyYW1ldGVycy5pc0VtcHR5KCkgPyBudWxsIDogcGFyYW1ldGVycy5lbnRyeVNldCgpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChNYXAuRW50cnk6OmdldFZhbHVlLCBNYXAuRW50cnk6OmdldEtleSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuICBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBrZXkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXROZXh0Qm91bmRLZXkoKSB7CisgICAgICAgIHJldHVybiBLRVlfUFJFRklYICsgcGFyYW1ldGVycy5zaXplKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBTdHJlYW0ub2YobmV3IE9iamVjdFtde2dldFNjcmlwdCgpLCBnZXRQYXJhbWV0ZXJzKCl9KQorICAgICAgICAgICAgICAgIC5maWx0ZXIobyAtPiBudWxsICE9IG8pCisgICAgICAgICAgICAgICAgLmZpbHRlcihvIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKChNYXApIG8pLmlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhby50b1N0cmluZygpLmlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLm1hcChPYmplY3Q6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBpZiAoIXN0cmluZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnKCcpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmpvaW4oIiwiLCBzdHJpbmdzKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnKScpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiU2NyaXB0WyIgKyBidWlsZGVyLnRvU3RyaW5nKCkgKyAiXSI7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhbnNsYXRvci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmFuc2xhdG9yLmphdmEKaW5kZXggOGNkZDg0ZC4uNzk2ZjYzZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmFuc2xhdG9yLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmFuc2xhdG9yLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKICAqIFRoZSBwYXJhbWV0ZXJpemF0aW9uIG9mIFRyYW5zbGF0b3IgaXMgUyAodHJhdmVyc2FsIHNvdXJjZSkgYW5kIFQgKGZ1bGwgdHJhbnNsYXRpb24pLgogICoKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQorICogQGF1dGhvciBTdGFyayBBcnlhIChzYW5kc3pob3UuempAYWxpYmFiYS1pbmMuY29tKQogICovCiBwdWJsaWMgaW50ZXJmYWNlIFRyYW5zbGF0b3I8UywgVD4gewogCkBAIC01OCwxNSArNTksMTUgQEAKICAgICAvLy8KIAogICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgYnl0ZWNvZGUgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICogVHJhbnNsYXRlcyBieXRlY29kZSB0byBhIFNjcmlwdCByZXByZXNlbnRhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNjcmlwdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yPFN0cmluZywgU3RyaW5nPiB7CisgICAgcHVibGljIGludGVyZmFjZSBTY3JpcHRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcjxTdHJpbmcsIFNjcmlwdD4gewogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBQcm92aWRlcyBhIHdheSBmb3IgdGhlIHtAbGluayBTY3JpcHRUcmFuc2xhdG9yfSB0byBjb252ZXJ0IHZhcmlvdXMgZGF0YSB0eXBlcyB0byB0aGVpciBzdHJpbmcKICAgICAgICAgICogcmVwcmVzZW50YXRpb25zIGluIHRoZWlyIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgVHlwZVRyYW5zbGF0b3IgZXh0ZW5kcyBCaUZ1bmN0aW9uPFN0cmluZywgT2JqZWN0LCBPYmplY3Q+IHsgfQorICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIFR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgQmlGdW5jdGlvbjxTdHJpbmcsIE9iamVjdCwgU2NyaXB0PiB7IH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbC5qYXZhCmluZGV4IDExYzEyYzMuLmVmZWQ4N2IgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmF2ZXJzYWwuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsLnN0ZXAubWFwLlJlbW90ZVN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWw7CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAvKioKICAgICAgKiBTdGFydHMgYSBwcm9taXNlIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBvbiB0aGUgY3VycmVudCB7QGNvZGUgVHJhdmVyc2FsfSB0aGF0IHdpbGwgYmUgY29tcGxldGVkIGluIHRoZSBmdXR1cmUuCiAgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIHtAY29kZSBUcmF2ZXJzYWx9IGlzIGNvbnN0cnVjdGVkIHVzaW5nCi0gICAgICoge0BsaW5rIFRyYXZlcnNhbFNvdXJjZSN3aXRoUmVtb3RlKENvbmZpZ3VyYXRpb24pfS4gQ2FsbGluZyB0aGlzIG1ldGhvZCBvdGhlcndpc2Ugd2lsbCB5aWVsZCBhbgorICAgICAqIHtAbGluayBBbm9ueW1vdXNUcmF2ZXJzYWxTb3VyY2Ujd2l0aFJlbW90ZShDb25maWd1cmF0aW9uKX0uIENhbGxpbmcgdGhpcyBtZXRob2Qgb3RoZXJ3aXNlIHdpbGwgeWllbGQgYW4KICAgICAgKiB7QGNvZGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufS4KICAgICAgKi8KICAgICBwdWJsaWMgZGVmYXVsdCA8VD4gQ29tcGxldGFibGVGdXR1cmU8VD4gcHJvbWlzZShmaW5hbCBGdW5jdGlvbjxUcmF2ZXJzYWw8UywgRT4sIFQ+IHRyYXZlcnNhbEZ1bmN0aW9uKSB7CkBAIC00MTcsMTUgKzQxNywxNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogQXBwbHkgdGhlIHJlZ2lzdGVyZWQge0BsaW5rIFRyYXZlcnNhbFN0cmF0ZWdpZXN9IHRvIHRoZSB0cmF2ZXJzYWwuCiAgICAgICAgICAqIE9uY2UgdGhlIHN0cmF0ZWdpZXMgYXJlIGFwcGxpZWQsIHRoZSB0cmF2ZXJzYWwgaXMgImxvY2tlZCIgYW5kIGNhbiBubyBsb25nZXIgaGF2ZSBzdGVwcyBhZGRlZCB0byBpdC4KLSAgICAgICAgICogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgZm9yIHN0cmF0ZWd5IGFwcGxpY2F0aW9ucyBzaG91bGQgYmU6IGdsb2JhbGx5IGlkIHN0ZXBzLCBhcHBseSBzdHJhdGVnaWVzIHRvIHJvb3QgdHJhdmVyc2FsLCB0aGVuIHRvIG5lc3RlZCB0cmF2ZXJzYWxzLgorICAgICAgICAgKiBUaGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyBmb3Igc3RyYXRlZ3kgYXBwbGljYXRpb25zIHNob3VsZCBiZTogZ2xvYmFsbHkgaWQgc3RlcHMsIGFwcGx5IGVhY2ggc3RyYXRlZ3kgaW4gdHVybgorICAgICAgICAgKiB0byByb290IHRyYXZlcnNhbCwgdGhlbiByZWN1cnNpdmVseSB0byBuZXN0ZWQgdHJhdmVyc2Fscy4KICAgICAgICAgICoKICAgICAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHtAbGluayBUcmF2ZXJzYWxTdHJhdGVnaWVzfSBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBhcHBseVN0cmF0ZWdpZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHtAbGluayBUcmF2ZXJzZXJHZW5lcmF0b3J9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYXZlcnNhbC4gVGhlIHRyYXZlcnNhbCBnZW5lcmF0b3IgY3JlYXRlcwotICAgICAgICAgKiB7QGxpbmsgVHJhdmVyc2VyfSBpbnN0YW5jZXMgdGhhdCBhcmUgcmVzcGVjdGl2ZSBvZiB0aGUgdHJhdmVyc2FsJ3Mge0BsaW5rIFRyYXZlcnNlclJlcXVpcmVtZW50fS4KKyAgICAgICAgICogR2V0IHRoZSB7QGxpbmsgVHJhdmVyc2VyR2VuZXJhdG9yfSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmF2ZXJzYWwuCisgICAgICAgICAqIFRoZSB0cmF2ZXJzYWwgZ2VuZXJhdG9yIGNyZWF0ZXMge0BsaW5rIFRyYXZlcnNlcn0gaW5zdGFuY2VzIHRoYXQgYXJlIHJlc3BlY3RpdmUgb2YgdGhlIHRyYXZlcnNhbCdzCisgICAgICAgICAqIHtAbGluayBUcmF2ZXJzZXJSZXF1aXJlbWVudH0uCiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYXRvciBvZiB0cmF2ZXJzZXJzCiAgICAgICAgICAqLwpAQCAtNDg4LDIyICs0OTAsMzAgQEAKICAgICAgICAgcHVibGljIFRyYXZlcnNhbFN0cmF0ZWdpZXMgZ2V0U3RyYXRlZ2llcygpOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIHtAbGluayBUcmF2ZXJzYWxQYXJlbnR9IHtAbGluayBTdGVwfSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcyB0cmF2ZXJzYWwuCi0gICAgICAgICAqIFRyYXZlcnNhbHMgY2FuIGJlIG5lc3RlZCBhbmQgdGhpcyBpcyB0aGUgbWVhbnMgYnkgd2hpY2ggdGhlIHRyYXZlcnNhbCB0cmVlIGlzIGNvbm5lY3RlZC4KKyAgICAgICAgICogU2V0IHRoZSB7QGxpbmsgVHJhdmVyc2FsUGFyZW50fSB7QGxpbmsgU3RlcH0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgdHJhdmVyc2FsLiBUcmF2ZXJzYWxzIGNhbiBiZSBuZXN0ZWQKKyAgICAgICAgICogYW5kIHRoaXMgaXMgdGhlIG1lYW5zIGJ5IHdoaWNoIHRoZSB0cmF2ZXJzYWwgdHJlZSBpcyBjb25uZWN0ZWQuIElmIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhlbiBpdCBzaG91bGQgYmUgYQorICAgICAgICAgKiB7QGxpbmsgRW1wdHlTdGVwfS4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0ZXAgdGhlIHRyYXZlcnNhbCBob2xkZXIgcGFyZW50IHN0ZXAKKyAgICAgICAgICogQHBhcmFtIHN0ZXAgdGhlIHRyYXZlcnNhbCBob2xkZXIgcGFyZW50IHN0ZXAgb3Ige0BsaW5rIEVtcHR5U3RlcH0gaWYgaXQgaGFzIG5vIHBhcmVudAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KGZpbmFsIFRyYXZlcnNhbFBhcmVudCBzdGVwKTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSB7QGxpbmsgVHJhdmVyc2FsUGFyZW50fSB7QGxpbmsgU3RlcH0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgdHJhdmVyc2FsLgotICAgICAgICAgKiBUcmF2ZXJzYWxzIGNhbiBiZSBuZXN0ZWQgYW5kIHRoaXMgaXMgdGhlIG1lYW5zIGJ5IHdoaWNoIHRoZSB0cmF2ZXJzYWwgdHJlZSBpcyB3YWxrZWQuCisgICAgICAgICAqIEdldCB0aGUge0BsaW5rIFRyYXZlcnNhbFBhcmVudH0ge0BsaW5rIFN0ZXB9IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzIHRyYXZlcnNhbC4gVHJhdmVyc2FscyBjYW4gYmUgbmVzdGVkCisgICAgICAgICAqIGFuZCB0aGlzIGlzIHRoZSBtZWFucyBieSB3aGljaCB0aGUgdHJhdmVyc2FsIHRyZWUgaXMgd2Fsa2VkLgogICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSB0cmF2ZXJzYWwgaG9sZGVyIHBhcmVudCBzdGVwCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRyYXZlcnNhbCBob2xkZXIgcGFyZW50IHN0ZXAgb3Ige0BsaW5rIEVtcHR5U3RlcH0gaWYgaXQgaGFzIG5vIHBhcmVudC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBUcmF2ZXJzYWxQYXJlbnQgZ2V0UGFyZW50KCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIERldGVybWluZXMgaWYgdGhlIHRyYXZlcnNhbCBpcyBhdCB0aGUgcm9vdCBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBkZWZhdWx0IGJvb2xlYW4gaXNSb290KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpIGluc3RhbmNlb2YgRW1wdHlTdGVwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIENsb25pbmcgaXMgdXNlZCB0byBkdXBsaWNhdGUgdGhlIHRyYXZlcnNhbCB0eXBpY2FsbHkgaW4gT0xBUCBlbnZpcm9ubWVudHMuCiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gVGhlIGNsb25lZCB0cmF2ZXJzYWwKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsU291cmNlLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbFNvdXJjZS5qYXZhCmluZGV4IDA0ZmRmMDEuLmZhZmVmNmMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsU291cmNlLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmF2ZXJzYWxTb3VyY2UuamF2YQpAQCAtMTgsMjYgKzE4LDIwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uUHJvcGVydGllc0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkNvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5WZXJ0ZXhQcm9ncmFtU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS5SZW1vdGVDb25uZWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5PcHRpb25zU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlNhY2tTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU2lkZUVmZmVjdFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5mdW5jdGlvbi5Db25zdGFudFN1cHBsaWVyOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaW5hcnlPcGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlVuYXJ5T3BlcmF0b3I7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS5SZW1vdGVDb25uZWN0aW9uLkdSRU1MSU5fUkVNT1RFX0NPTk5FQ1RJT05fQ0xBU1M7Ci0KIC8qKgogICogQSB7QGNvZGUgVHJhdmVyc2FsU291cmNlfSBpcyB1c2VkIHRvIGNyZWF0ZSB7QGxpbmsgVHJhdmVyc2FsfSBpbnN0YW5jZXMuCiAgKiBBIHRyYXZlcnNhbCBzb3VyY2UgY2FuIGdlbmVyYXRlIGFueSBudW1iZXIgb2Yge0BsaW5rIFRyYXZlcnNhbH0gaW5zdGFuY2VzLgpAQCAtMzczLDUyICszNjcsNiBAQAogICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyB0aGUge0Bjb2RlIFRyYXZlcnNhbFNvdXJjZX0gYXMgYSAicmVtb3RlIiB0byBpc3N1ZSB0aGUge0BsaW5rIFRyYXZlcnNhbH0gZm9yIGV4ZWN1dGlvbiBlbHNld2hlcmUuCi0gICAgICogRXhwZWN0cyBrZXkgZm9yIHtAbGluayBSZW1vdGVDb25uZWN0aW9uI0dSRU1MSU5fUkVNT1RFX0NPTk5FQ1RJT05fQ0xBU1N9IGFzIHdlbGwgYXMgYW55IGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQgYnkKLSAgICAgKiB0aGUgdW5kZXJseWluZyB7QGxpbmsgUmVtb3RlQ29ubmVjdGlvbn0gd2hpY2ggd2lsbCBiZSBpbnN0YW50aWF0ZWQuIE5vdGUgdGhhdCB0aGUge0Bjb2RlIENvbmZpZ3VyYXRpb259IG9iamVjdAotICAgICAqIGlzIHBhc3NlZCBkb3duIHdpdGhvdXQgY2hhbmdlIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUge0BsaW5rIFJlbW90ZUNvbm5lY3Rpb259IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuNSwgcmVwbGFjZWQgYnkge0BsaW5rIEFub255bW91c1RyYXZlcnNhbFNvdXJjZSN3aXRoUmVtb3RlKENvbmZpZ3VyYXRpb24pfS4KLSAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIwNzgiPlRJTktFUlBPUC0yMDc4PC9hPgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIGRlZmF1bHQgVHJhdmVyc2FsU291cmNlIHdpdGhSZW1vdGUoZmluYWwgQ29uZmlndXJhdGlvbiBjb25mKSB7Ci0gICAgICAgIGlmICghY29uZi5jb250YWluc0tleShHUkVNTElOX1JFTU9URV9DT05ORUNUSU9OX0NMQVNTKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gbXVzdCBjb250YWluIHRoZSAnIiArIEdSRU1MSU5fUkVNT1RFX0NPTk5FQ1RJT05fQ0xBU1MgKyAiJyBrZXkiKTsKLSAgICAgICAgZmluYWwgUmVtb3RlQ29ubmVjdGlvbiByZW1vdGVDb25uZWN0aW9uOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFJlbW90ZUNvbm5lY3Rpb24+IGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjb25mLmdldFN0cmluZyhHUkVNTElOX1JFTU9URV9DT05ORUNUSU9OX0NMQVNTKSkuYXNTdWJjbGFzcyhSZW1vdGVDb25uZWN0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBSZW1vdGVDb25uZWN0aW9uPiBjdG9yID0gY2xhenouZ2V0Q29uc3RydWN0b3IoQ29uZmlndXJhdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICByZW1vdGVDb25uZWN0aW9uID0gY3Rvci5uZXdJbnN0YW5jZShjb25mKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2l0aFJlbW90ZShyZW1vdGVDb25uZWN0aW9uKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyB0aGUge0Bjb2RlIFRyYXZlcnNhbFNvdXJjZX0gYXMgYSAicmVtb3RlIiB0byBpc3N1ZSB0aGUge0BsaW5rIFRyYXZlcnNhbH0gZm9yIGV4ZWN1dGlvbiBlbHNld2hlcmUuCi0gICAgICogQ2FsbHMge0BsaW5rICN3aXRoUmVtb3RlKENvbmZpZ3VyYXRpb24pfSBhZnRlciByZWFkaW5nIHRoZSBwcm9wZXJ0aWVzIGZpbGUgc3BlY2lmaWVkLgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuNSwgcmVwbGFjZWQgYnkge0BsaW5rIEFub255bW91c1RyYXZlcnNhbFNvdXJjZSN3aXRoUmVtb3RlKFN0cmluZyl9LgotICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjA3OCI+VElOS0VSUE9QLTIwNzg8L2E+Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgZGVmYXVsdCBUcmF2ZXJzYWxTb3VyY2Ugd2l0aFJlbW90ZShmaW5hbCBTdHJpbmcgY29uZmlnRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB3aXRoUmVtb3RlKG5ldyBQcm9wZXJ0aWVzQ29uZmlndXJhdGlvbihjb25maWdGaWxlKSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZXMgdGhlIHtAY29kZSBUcmF2ZXJzYWxTb3VyY2V9IGFzIGEgInJlbW90ZSIgdG8gaXNzdWUgdGhlIHtAbGluayBUcmF2ZXJzYWx9IGZvciBleGVjdXRpb24gZWxzZXdoZXJlLgotICAgICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgdHJhY2sge0BsaW5rIFJlbW90ZUNvbm5lY3Rpb259IGluc3RhbmNlcyB0aGF0IGFyZSBjcmVhdGVkIGFuZCBjYWxsCi0gICAgICoge0BsaW5rIFJlbW90ZUNvbm5lY3Rpb24jY2xvc2UoKX0gb24gdGhlbSB3aGVuIHRoZSB7QGNvZGUgVHJhdmVyc2FsU291cmNlfSBpdHNlbGYgaXMgY2xvc2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIHtAbGluayBSZW1vdGVDb25uZWN0aW9ufSBpbnN0YW5jZSB0byB1c2UgdG8gc3VibWl0IHRoZSB7QGxpbmsgVHJhdmVyc2FsfS4KLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy41LCByZXBsYWNlZCBieSB7QGxpbmsgQW5vbnltb3VzVHJhdmVyc2FsU291cmNlI3dpdGhSZW1vdGUoUmVtb3RlQ29ubmVjdGlvbil9LgotICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjA3OCI+VElOS0VSUE9QLTIwNzg8L2E+Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgVHJhdmVyc2FsU291cmNlIHdpdGhSZW1vdGUoZmluYWwgUmVtb3RlQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKLQogICAgIHB1YmxpYyBkZWZhdWx0IE9wdGlvbmFsPENsYXNzPiBnZXRBbm9ueW1vdXNUcmF2ZXJzYWxDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmF2ZXJzYWxTdHJhdGVnaWVzLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbFN0cmF0ZWdpZXMuamF2YQppbmRleCA2YzJjMmYzLi42Mzg0MmIwIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbFN0cmF0ZWdpZXMuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbFN0cmF0ZWdpZXMuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkFkamFjZW50VG9JbmNpZGVudFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkNvdW50U3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uRWFybHlMaW1pdFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkJ5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uRmlsdGVyUmFua2luZ1N0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLklubGluZUZpbHRlclN0cmF0ZWd5OwpAQCAtNDEsNiArNDIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5EZWZhdWx0VHJhdmVyc2FsU3RyYXRlZ2llczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmVtcHR5LkVtcHR5R3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLnRvb2xzLk11bHRpTWFwOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CkBAIC00OSw2ICs1MSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtNjQsMTQgKzY3LDIyIEBACiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqIEBhdXRob3IgTWF0dGhpYXMgQnJvZWNoZWxlciAobWVAbWF0dGhpYXNiLmNvbSkKICAqLwotcHVibGljIGludGVyZmFjZSBUcmF2ZXJzYWxTdHJhdGVnaWVzIGV4dGVuZHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgeworcHVibGljIGludGVyZmFjZSBUcmF2ZXJzYWxTdHJhdGVnaWVzIGV4dGVuZHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIEl0ZXJhYmxlPFRyYXZlcnNhbFN0cmF0ZWd5PD8+PiB7CiAKICAgICBzdGF0aWMgTGlzdDxDbGFzczw/IGV4dGVuZHMgVHJhdmVyc2FsU3RyYXRlZ3k+PiBTVFJBVEVHWV9DQVRFR09SSUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFRyYXZlcnNhbFN0cmF0ZWd5LkRlY29yYXRpb25TdHJhdGVneS5jbGFzcywgVHJhdmVyc2FsU3RyYXRlZ3kuT3B0aW1pemF0aW9uU3RyYXRlZ3kuY2xhc3MsIFRyYXZlcnNhbFN0cmF0ZWd5LlByb3ZpZGVyT3B0aW1pemF0aW9uU3RyYXRlZ3kuY2xhc3MsIFRyYXZlcnNhbFN0cmF0ZWd5LkZpbmFsaXphdGlvblN0cmF0ZWd5LmNsYXNzLCBUcmF2ZXJzYWxTdHJhdGVneS5WZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcykpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCB0aGUge0BsaW5rIFRyYXZlcnNhbFN0cmF0ZWd5fSBzaW5nbGV0b24gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBUcmF2ZXJzYWxTdHJhdGVnaWVzfS4KKyAgICAgKiBSZXR1cm4gYW4gaW1tdXRhYmxlIGxpc3Qgb2YgdGhlIHtAbGluayBUcmF2ZXJzYWxTdHJhdGVneX0gaW5zdGFuY2VzLgogICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFRyYXZlcnNhbFN0cmF0ZWd5PD8+PiB0b0xpc3QoKTsKKyAgICBwdWJsaWMgZGVmYXVsdCBMaXN0PFRyYXZlcnNhbFN0cmF0ZWd5PD8+PiB0b0xpc3QoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEl0ZXJhdG9yVXRpbHMubGlzdChpdGVyYXRvcigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIHtAY29kZSBJdGVyYXRvcn0gb2YgdGhlIHtAbGluayBUcmF2ZXJzYWxTdHJhdGVneX0gaW5zdGFuY2VzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYXRvcjxUcmF2ZXJzYWxTdHJhdGVneTw/Pj4gaXRlcmF0b3IoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUge0BsaW5rIFRyYXZlcnNhbFN0cmF0ZWd5fSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGNsYXNzLgpAQCAtODEsMjEgKzkyLDExIEBACiAgICAgICogQHJldHVybiBhbiBvcHRpb25hbCBjb250YWluaW5nIHRoZSBzdHJhdGVneSBpbnN0YW5jZSBvciBub3QKICAgICAgKi8KICAgICBwdWJsaWMgZGVmYXVsdCA8VCBleHRlbmRzIFRyYXZlcnNhbFN0cmF0ZWd5PiBPcHRpb25hbDxUPiBnZXRTdHJhdGVneShmaW5hbCBDbGFzczxUPiB0cmF2ZXJzYWxTdHJhdGVneUNsYXNzKSB7Ci0gICAgICAgIHJldHVybiAoT3B0aW9uYWwpIHRvTGlzdCgpLnN0cmVhbSgpLmZpbHRlcihzIC0+IHRyYXZlcnNhbFN0cmF0ZWd5Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzLmdldENsYXNzKCkpKS5maW5kQW55KCk7CisgICAgICAgIHJldHVybiAoT3B0aW9uYWw8VD4pIEl0ZXJhdG9yVXRpbHMuc3RyZWFtKGl0ZXJhdG9yKCkpLgorICAgICAgICAgICAgICAgIGZpbHRlcihzIC0+IHRyYXZlcnNhbFN0cmF0ZWd5Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzLmdldENsYXNzKCkpKS5maW5kQW55KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwbHkgYWxsIHRoZSB7QGxpbmsgVHJhdmVyc2FsU3RyYXRlZ3l9IG9wdGltaXplcnMgdG8gdGhlIHtAbGluayBUcmF2ZXJzYWx9LiBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZQotICAgICAqIHN0cmF0ZWdpZXMgYXJlIHNvcnRlZCBwcmlvciB0byBhcHBsaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmF2ZXJzYWwgdGhlIHRyYXZlcnNhbCB0byBhcHBseSB0aGUgc3RyYXRlZ2llcyB0bwotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjEwLCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgYXMgdGhpcyBtb2RlIG9mIHN0cmF0ZWd5IGFwcGxpY2F0aW9uIGhhcyBub3QgYmVlbgotICAgICAqIHV0aWxpemVkIHNpbmNlIGVhcmx5IGRheXMgb2YgMy54Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBhcHBseVN0cmF0ZWdpZXMoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCk7Ci0KLSAgICAvKioKICAgICAgKiBBZGQgYWxsIHRoZSBwcm92aWRlZCB7QGxpbmsgVHJhdmVyc2FsU3RyYXRlZ3l9IGluc3RhbmNlcyB0byB0aGUgY3VycmVudCBjb2xsZWN0aW9uLgogICAgICAqIFdoZW4gYWxsIHRoZSBwcm92aWRlZCBzdHJhdGVnaWVzIGhhdmUgYmVlbiBhZGRlZCwgdGhlIGNvbGxlY3Rpb24gaXMgcmVzb3J0ZWQuCiAgICAgICoKQEAgLTIyMSw2ICsyMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICBJbmxpbmVGaWx0ZXJTdHJhdGVneS5pbnN0YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICBJbmNpZGVudFRvQWRqYWNlbnRTdHJhdGVneS5pbnN0YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICBBZGphY2VudFRvSW5jaWRlbnRTdHJhdGVneS5pbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5Lmluc3RhbmNlKCksCiAgICAgICAgICAgICAgICAgICAgIEZpbHRlclJhbmtpbmdTdHJhdGVneS5pbnN0YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICBNYXRjaFByZWRpY2F0ZVN0cmF0ZWd5Lmluc3RhbmNlKCksCiAgICAgICAgICAgICAgICAgICAgIFJlcGVhdFVucm9sbFN0cmF0ZWd5Lmluc3RhbmNlKCksCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbFN0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbFN0cmF0ZWd5LmphdmEKaW5kZXggMDNjMzFhYi4uOTg2MGMzNiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmF2ZXJzYWxTdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsU3RyYXRlZ3kuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uUGFydGl0aW9uU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5maW5hbGl6YXRpb24uUHJvZmlsZVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkNvdW50U3RyYXRlZ3k7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNlci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9UcmF2ZXJzZXIuamF2YQppbmRleCBlMDdiZWMxLi5mYzU4YzYyIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNlci5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2VyLmphdmEKQEAgLTE4LDkgKzE4LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbDsKIAoraW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuTG9vcHNTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuQXR0YWNoYWJsZTsKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwogCkBAIC0xMzQsNyArMTM2LDEyIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGRlZmF1bHQgaW50IGNvbXBhcmVUbyhmaW5hbCBUcmF2ZXJzZXI8VD4gb3RoZXIpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSB0aGlzLmdldCgpKS5jb21wYXJlVG8ob3RoZXIuZ2V0KCkpOworICAgICAgICBmaW5hbCBPYmplY3QgdGhpc09iaiA9IHRoaXMuZ2V0KCk7CisgICAgICAgIGZpbmFsIE9iamVjdCBvdGhlck9iaiA9IG90aGVyLmdldCgpOworICAgICAgICBpZiAodGhpc09iaiA9PSBvdGhlck9iaikgcmV0dXJuIDA7CisgICAgICAgIGlmIChudWxsID09IHRoaXNPYmopIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG51bGwgPT0gb3RoZXJPYmopIHJldHVybiAxOworICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSB0aGlzT2JqKS5jb21wYXJlVG8ob3RoZXJPYmopOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvZ3JhcGgvR3JhcGhUcmF2ZXJzYWwuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvZHNsL2dyYXBoL0dyYXBoVHJhdmVyc2FsLmphdmEKaW5kZXggNDgyYTlhYy4uNTZlM2QzMyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvZ3JhcGgvR3JhcGhUcmF2ZXJzYWwuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2RzbC9ncmFwaC9HcmFwaFRyYXZlcnNhbC5qYXZhCkBAIC0xMjQsNyArMTI0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLlVuZm9sZFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5WZXJ0ZXhTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LkFkZFByb3BlcnR5U3RlcDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5BZ2dyZWdhdGVTdGVwOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LkFnZ3JlZ2F0ZUdsb2JhbFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuR3JvdXBDb3VudFNpZGVFZmZlY3RTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0Lkdyb3VwU2lkZUVmZmVjdFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuSWRlbnRpdHlTdGVwOwpAQCAtMTM1LDEyICsxMzUsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5TYWNrVmFsdWVTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlNpZGVFZmZlY3RDYXBTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlN0YXJ0U3RlcDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5TdG9yZVN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuQWdncmVnYXRlTG9jYWxTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlN1YmdyYXBoU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5UcmF2ZXJzYWxTaWRlRWZmZWN0U3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5UcmVlU2lkZUVmZmVjdFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuSGFzQ29udGFpbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLlRyZWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuV2l0aE9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIudXRpbC5UcmF2ZXJzZXJTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLlRyYXZlcnNhbEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsTWV0cmljczsKQEAgLTE1NCw3ICsxNTUsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleFByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZW1wdHkuRW1wdHlHcmFwaDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uQ29uc3RhbnRTdXBwbGllcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC01NTAsNyArNTUwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgZGVmYXVsdCA8RTI+IEdyYXBoVHJhdmVyc2FsPFMsIE1hcDxTdHJpbmcsIEUyPj4gcHJvcGVydHlNYXAoZmluYWwgU3RyaW5nLi4uIHByb3BlcnR5S2V5cykgewogICAgICAgICB0aGlzLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpLmFkZFN0ZXAoU3ltYm9scy5wcm9wZXJ0eU1hcCwgcHJvcGVydHlLZXlzKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXNBZG1pbigpLmFkZFN0ZXAobmV3IFByb3BlcnR5TWFwU3RlcDw+KHRoaXMuYXNBZG1pbigpLCBmYWxzZSwgUHJvcGVydHlUeXBlLlBST1BFUlRZLCBwcm9wZXJ0eUtleXMpKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXNBZG1pbigpLmFkZFN0ZXAobmV3IFByb3BlcnR5TWFwU3RlcDw+KHRoaXMuYXNBZG1pbigpLCBXaXRoT3B0aW9ucy5ub25lLCBQcm9wZXJ0eVR5cGUuUFJPUEVSVFksIHByb3BlcnR5S2V5cykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTg0LDcgKzU4NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIGRlZmF1bHQgPEUyPiBHcmFwaFRyYXZlcnNhbDxTLCBNYXA8T2JqZWN0LCBFMj4+IHZhbHVlTWFwKGZpbmFsIFN0cmluZy4uLiBwcm9wZXJ0eUtleXMpIHsKICAgICAgICAgdGhpcy5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKS5hZGRTdGVwKFN5bWJvbHMudmFsdWVNYXAsIHByb3BlcnR5S2V5cyk7Ci0gICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKG5ldyBQcm9wZXJ0eU1hcFN0ZXA8Pih0aGlzLmFzQWRtaW4oKSwgZmFsc2UsIFByb3BlcnR5VHlwZS5WQUxVRSwgcHJvcGVydHlLZXlzKSk7CisgICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKG5ldyBQcm9wZXJ0eU1hcFN0ZXA8Pih0aGlzLmFzQWRtaW4oKSwgV2l0aE9wdGlvbnMubm9uZSwgUHJvcGVydHlUeXBlLlZBTFVFLCBwcm9wZXJ0eUtleXMpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYwMyw3ICs2MDMsNyBAQAogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGRlZmF1bHQgPEUyPiBHcmFwaFRyYXZlcnNhbDxTLCBNYXA8T2JqZWN0LCBFMj4+IHZhbHVlTWFwKGZpbmFsIGJvb2xlYW4gaW5jbHVkZVRva2VucywgZmluYWwgU3RyaW5nLi4uIHByb3BlcnR5S2V5cykgewogICAgICAgICB0aGlzLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpLmFkZFN0ZXAoU3ltYm9scy52YWx1ZU1hcCwgaW5jbHVkZVRva2VucywgcHJvcGVydHlLZXlzKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXNBZG1pbigpLmFkZFN0ZXAobmV3IFByb3BlcnR5TWFwU3RlcDw+KHRoaXMuYXNBZG1pbigpLCBpbmNsdWRlVG9rZW5zLCBQcm9wZXJ0eVR5cGUuVkFMVUUsIHByb3BlcnR5S2V5cykpOworICAgICAgICByZXR1cm4gdGhpcy5hc0FkbWluKCkuYWRkU3RlcChuZXcgUHJvcGVydHlNYXBTdGVwPD4odGhpcy5hc0FkbWluKCksIFdpdGhPcHRpb25zLmFsbCwgUHJvcGVydHlUeXBlLlZBTFVFLCBwcm9wZXJ0eUtleXMpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIGRlZmF1bHQgR3JhcGhUcmF2ZXJzYWw8UywgVmVydGV4PiBhZGRWKGZpbmFsIFRyYXZlcnNhbDw/LCBTdHJpbmc+IHZlcnRleExhYmVsVHJhdmVyc2FsKSB7CiAgICAgICAgIHRoaXMuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkuYWRkU3RlcChTeW1ib2xzLmFkZFYsIHZlcnRleExhYmVsVHJhdmVyc2FsKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXNBZG1pbigpLmFkZFN0ZXAobmV3IEFkZFZlcnRleFN0ZXA8Pih0aGlzLmFzQWRtaW4oKSwgdmVydGV4TGFiZWxUcmF2ZXJzYWwuYXNBZG1pbigpKSk7CisgICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKG5ldyBBZGRWZXJ0ZXhTdGVwPD4odGhpcy5hc0FkbWluKCksIG51bGwgPT0gdmVydGV4TGFiZWxUcmF2ZXJzYWwgPyBudWxsIDogdmVydGV4TGFiZWxUcmF2ZXJzYWwuYXNBZG1pbigpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDgzLDcgKzEwODMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBkZWZhdWx0IEdyYXBoVHJhdmVyc2FsPFMsIEVkZ2U+IGFkZEUoZmluYWwgVHJhdmVyc2FsPD8sIFN0cmluZz4gZWRnZUxhYmVsVHJhdmVyc2FsKSB7CiAgICAgICAgIHRoaXMuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkuYWRkU3RlcChTeW1ib2xzLmFkZEUsIGVkZ2VMYWJlbFRyYXZlcnNhbCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKG5ldyBBZGRFZGdlU3RlcDw+KHRoaXMuYXNBZG1pbigpLCBlZGdlTGFiZWxUcmF2ZXJzYWwuYXNBZG1pbigpKSk7CisgICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKG5ldyBBZGRFZGdlU3RlcDw+KHRoaXMuYXNBZG1pbigpLCBudWxsID09IGVkZ2VMYWJlbFRyYXZlcnNhbCA/IG51bGwgOiBlZGdlTGFiZWxUcmF2ZXJzYWwuYXNBZG1pbigpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDA3LDEzICsyMDA3LDEzIEBACiAgICAgICogd2l0aCBhIHtAbGluayBTY29wZSNsb2NhbH0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gc2lkZUVmZmVjdEtleSB0aGUgbmFtZSBvZiB0aGUgc2lkZS1lZmZlY3Qga2V5IHRoYXQgd2lsbCBob2xkIHRoZSBhZ2dyZWdhdGVkIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmF2ZXJzYWwgd2l0aCBhbiBhcHBlbmRlZCB7QGxpbmsgQWdncmVnYXRlU3RlcH0KKyAgICAgKiBAcmV0dXJuIHRoZSB0cmF2ZXJzYWwgd2l0aCBhbiBhcHBlbmRlZCB7QGxpbmsgQWdncmVnYXRlR2xvYmFsU3RlcH0KICAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzLyR7cHJvamVjdC52ZXJzaW9ufS9yZWZlcmVuY2UvI2FnZ3JlZ2F0ZS1zdGVwIiB0YXJnZXQ9Il9ibGFuayI+UmVmZXJlbmNlIERvY3VtZW50YXRpb24gLSBBZ2dyZWdhdGUgU3RlcDwvYT4KICAgICAgKiBAc2luY2UgMy4wLjAtaW5jdWJhdGluZwogICAgICAqLwogICAgIHB1YmxpYyBkZWZhdWx0IEdyYXBoVHJhdmVyc2FsPFMsIEU+IGFnZ3JlZ2F0ZShmaW5hbCBTdHJpbmcgc2lkZUVmZmVjdEtleSkgewogICAgICAgICB0aGlzLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpLmFkZFN0ZXAoU3ltYm9scy5hZ2dyZWdhdGUsIHNpZGVFZmZlY3RLZXkpOwotICAgICAgICByZXR1cm4gdGhpcy5hc0FkbWluKCkuYWRkU3RlcChuZXcgQWdncmVnYXRlU3RlcDw+KHRoaXMuYXNBZG1pbigpLCBzaWRlRWZmZWN0S2V5KSk7CisgICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKG5ldyBBZ2dyZWdhdGVHbG9iYWxTdGVwPD4odGhpcy5hc0FkbWluKCksIHNpZGVFZmZlY3RLZXkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMjEsMTQgKzIwMjEsMTQgQEAKICAgICAgKiB7QGxpbmsgU2NvcGUjbG9jYWx9IG9yIGVhZ2VyICh7QGxpbmsgU2NvcGUjZ2xvYmFsfSB3aGlsZSBnYXRoZXJpbmcgdGhvc2Ugb2JqZWN0cy4KICAgICAgKgogICAgICAqIEBwYXJhbSBzaWRlRWZmZWN0S2V5IHRoZSBuYW1lIG9mIHRoZSBzaWRlLWVmZmVjdCBrZXkgdGhhdCB3aWxsIGhvbGQgdGhlIGFnZ3JlZ2F0ZWQgb2JqZWN0cwotICAgICAqIEByZXR1cm4gdGhlIHRyYXZlcnNhbCB3aXRoIGFuIGFwcGVuZGVkIHtAbGluayBBZ2dyZWdhdGVTdGVwfQorICAgICAqIEByZXR1cm4gdGhlIHRyYXZlcnNhbCB3aXRoIGFuIGFwcGVuZGVkIHtAbGluayBBZ2dyZWdhdGVHbG9iYWxTdGVwfQogICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvJHtwcm9qZWN0LnZlcnNpb259L3JlZmVyZW5jZS8jYWdncmVnYXRlLXN0ZXAiIHRhcmdldD0iX2JsYW5rIj5SZWZlcmVuY2UgRG9jdW1lbnRhdGlvbiAtIEFnZ3JlZ2F0ZSBTdGVwPC9hPgogICAgICAqIEBzaW5jZSAzLjQuMwogICAgICAqLwogICAgIHB1YmxpYyBkZWZhdWx0IEdyYXBoVHJhdmVyc2FsPFMsIEU+IGFnZ3JlZ2F0ZShmaW5hbCBTY29wZSBzY29wZSwgZmluYWwgU3RyaW5nIHNpZGVFZmZlY3RLZXkpIHsKICAgICAgICAgdGhpcy5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKS5hZGRTdGVwKFN5bWJvbHMuYWdncmVnYXRlLCBzY29wZSwgc2lkZUVmZmVjdEtleSk7CiAgICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKHNjb3BlID09IFNjb3BlLmdsb2JhbCA/Ci0gICAgICAgICAgICAgICAgbmV3IEFnZ3JlZ2F0ZVN0ZXA8Pih0aGlzLmFzQWRtaW4oKSwgc2lkZUVmZmVjdEtleSkgOiBuZXcgU3RvcmVTdGVwPD4odGhpcy5hc0FkbWluKCksIHNpZGVFZmZlY3RLZXkpKTsKKyAgICAgICAgICAgICAgICBuZXcgQWdncmVnYXRlR2xvYmFsU3RlcDw+KHRoaXMuYXNBZG1pbigpLCBzaWRlRWZmZWN0S2V5KSA6IG5ldyBBZ2dyZWdhdGVMb2NhbFN0ZXA8Pih0aGlzLmFzQWRtaW4oKSwgc2lkZUVmZmVjdEtleSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjA4OSwxNCArMjA4OSwxNCBAQAogICAgICAqIExhemlseSBhZ2dyZWdhdGVzIG9iamVjdHMgaW4gdGhlIHN0cmVhbSBpbnRvIGEgc2lkZS1lZmZlY3QgY29sbGVjdGlvbi4KICAgICAgKgogICAgICAqIEBwYXJhbSBzaWRlRWZmZWN0S2V5IHRoZSBuYW1lIG9mIHRoZSBzaWRlLWVmZmVjdCBrZXkgdGhhdCB3aWxsIGhvbGQgdGhlIGFnZ3JlZ2F0ZQotICAgICAqIEByZXR1cm4gdGhlIHRyYXZlcnNhbCB3aXRoIGFuIGFwcGVuZGVkIHtAbGluayBTdG9yZVN0ZXB9CisgICAgICogQHJldHVybiB0aGUgdHJhdmVyc2FsIHdpdGggYW4gYXBwZW5kZWQge0BsaW5rIEFnZ3JlZ2F0ZUxvY2FsU3RlcH0KICAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzLyR7cHJvamVjdC52ZXJzaW9ufS9yZWZlcmVuY2UvI3N0b3JlLXN0ZXAiIHRhcmdldD0iX2JsYW5rIj5SZWZlcmVuY2UgRG9jdW1lbnRhdGlvbiAtIFN0b3JlIFN0ZXA8L2E+CiAgICAgICogQHNpbmNlIDMuMC4wLWluY3ViYXRpbmcKICAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuNC4zLCByZXBsYWNlZCBieSB7QGxpbmsgI2FnZ3JlZ2F0ZShTY29wZSwgU3RyaW5nKX0gdXNpbmcge0BsaW5rIFNjb3BlI2xvY2FsfS4KICAgICAgKi8KICAgICBwdWJsaWMgZGVmYXVsdCBHcmFwaFRyYXZlcnNhbDxTLCBFPiBzdG9yZShmaW5hbCBTdHJpbmcgc2lkZUVmZmVjdEtleSkgewogICAgICAgICB0aGlzLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpLmFkZFN0ZXAoU3ltYm9scy5zdG9yZSwgc2lkZUVmZmVjdEtleSk7Ci0gICAgICAgIHJldHVybiB0aGlzLmFzQWRtaW4oKS5hZGRTdGVwKG5ldyBTdG9yZVN0ZXA8Pih0aGlzLmFzQWRtaW4oKSwgc2lkZUVmZmVjdEtleSkpOworICAgICAgICByZXR1cm4gdGhpcy5hc0FkbWluKCkuYWRkU3RlcChuZXcgQWdncmVnYXRlTG9jYWxTdGVwPD4odGhpcy5hc0FkbWluKCksIHNpZGVFZmZlY3RLZXkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMDIsOCArMjIwMiw3IEBACiAgICAgICoge0BsaW5rIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5fSBpcyBkZWZhdWx0ZWQgdG8ge0Bjb2RlIG51bGx9IHdoaWNoICBtZWFucyB0aGF0IHRoZSBkZWZhdWx0IGNhcmRpbmFsaXR5IGZvcgogICAgICAqIHRoZSB7QGxpbmsgR3JhcGh9IHdpbGwgYmUgdXNlZC4KICAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgZWZmZWN0aXZlbHkgY2FsbHMKLSAgICAgKiB7QGxpbmsgI3Byb3BlcnR5KG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0Li4uKX0KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBlZmZlY3RpdmVseSBjYWxscyB7QGxpbmsgI3Byb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0Li4uKX0KICAgICAgKiBhcyB7QGNvZGUgcHJvcGVydHkobnVsbCwga2V5LCB2YWx1ZSwga2V5VmFsdWVzfS4KICAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgICAgICAgdGhlIGtleSBmb3IgdGhlIHByb3BlcnR5CkBAIC0yMjE1LDggKzIyMTQsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBkZWZhdWx0IEdyYXBoVHJhdmVyc2FsPFMsIEU+IHByb3BlcnR5KGZpbmFsIE9iamVjdCBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgT2JqZWN0Li4uIGtleVZhbHVlcykgewogICAgICAgICByZXR1cm4ga2V5IGluc3RhbmNlb2YgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkgPwotICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHkoKFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5KSBrZXksIHZhbHVlLCBrZXlWYWx1ZXNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZXMubGVuZ3RoID4gMSA/CisgICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eSgoVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkpIGtleSwgdmFsdWUsIG51bGwgPT0ga2V5VmFsdWVzID8gbnVsbCA6IGtleVZhbHVlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlcyAhPSBudWxsICYmIGtleVZhbHVlcy5sZW5ndGggPiAxID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZlJhbmdlKGtleVZhbHVlcywgMSwga2V5VmFsdWVzLmxlbmd0aCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117fSkgOgogICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHkobnVsbCwga2V5LCB2YWx1ZSwga2V5VmFsdWVzKTsKQEAgLTI2NDUsMTMgKzI2NDQsMTMgQEAKICAgICAgKiBJbmRleGVzIGFsbCBpdGVtcyBvZiB0aGUgY3VycmVudCBjb2xsZWN0aW9uLiBUaGUgaW5kZXhpbmcgZm9ybWF0IGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSB7QGxpbmsgR3JhcGhUcmF2ZXJzYWwjd2l0aChTdHJpbmcsIE9iamVjdCl9CiAgICAgICogYW5kIHtAbGluayBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5XaXRoT3B0aW9ucyNpbmRleGVyfS4KICAgICAgKgotICAgICAqIEluZGV4ZWQgYXMgbGlzdDogWyJhIiwiYiIsImMiXSA9PiBbWyJhIiwwXSxbImIiLDFdLFsiYyIsMl1dCi0gICAgICogSW5kZXhlZCBhcyBtYXA6ICBbImEiLCJiIiwiYyJdID0+IHswOiJhIiwxOiJiIiwyOiJjIn0KKyAgICAgKiBJbmRleGVkIGFzIGxpc3Q6IFsiYSIsImIiLCJjIl0gPSZndDsgW1siYSIsMF0sWyJiIiwxXSxbImMiLDJdXQorICAgICAqIEluZGV4ZWQgYXMgbWFwOiAgWyJhIiwiYiIsImMiXSA9Jmd0OyB7MDoiYSIsMToiYiIsMjoiYyJ9CiAgICAgICoKICAgICAgKiBJZiB0aGUgY3VycmVudCBvYmplY3QgaXMgbm90IGEgY29sbGVjdGlvbiwgdGhpcyBzdGVwIHdpbGwgbWFwIHRoZSBvYmplY3QgdG8gYSBzaW5nbGUgaXRlbSBjb2xsZWN0aW9uL21hcDoKICAgICAgKgotICAgICAqIEluZGV4ZWQgYXMgbGlzdDogImEiID0+IFsiYSIsMF0KLSAgICAgKiBJbmRleGVkIGFzIG1hcDogICJhIiA9PiB7MDoiYSJ9CisgICAgICogSW5kZXhlZCBhcyBsaXN0OiAiYSIgPSZndDsgWyJhIiwwXQorICAgICAqIEluZGV4ZWQgYXMgbWFwOiAgImEiID0mZ3Q7IHswOiJhIn0KICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHRyYXZlcnNhbCB3aXRoIGFuIGFwcGVuZGVkIHtAbGluayBJbmRleFN0ZXB9CiAgICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy8ke3Byb2plY3QudmVyc2lvbn0vcmVmZXJlbmNlLyNpbmRleC1zdGVwIiB0YXJnZXQ9Il9ibGFuayI+UmVmZXJlbmNlIERvY3VtZW50YXRpb24gLSBJbmRleCBTdGVwPC9hPgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvZ3JhcGgvR3JhcGhUcmF2ZXJzYWxTb3VyY2UuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvZHNsL2dyYXBoL0dyYXBoVHJhdmVyc2FsU291cmNlLmphdmEKaW5kZXggZjVjNWMwOS4uMDExYmFlNyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvZ3JhcGgvR3JhcGhUcmF2ZXJzYWxTb3VyY2UuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2RzbC9ncmFwaC9HcmFwaFRyYXZlcnNhbFNvdXJjZS5qYXZhCkBAIC0xOCwxMiArMTgsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkNvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUuUmVtb3RlQ29ubmVjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlJlbW90ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQW5vbnltb3VzVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQnl0ZWNvZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTb3VyY2U7CkBAIC0yOTUsNTQgKzI5MywxMiBAQAogICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuNSwgcmVwbGFjZWQgYnkge0BsaW5rIEFub255bW91c1RyYXZlcnNhbFNvdXJjZSN3aXRoUmVtb3RlKENvbmZpZ3VyYXRpb24pfS4KLSAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIwNzgiPlRJTktFUlBPUC0yMDc4PC9hPgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIEdyYXBoVHJhdmVyc2FsU291cmNlIHdpdGhSZW1vdGUoZmluYWwgQ29uZmlndXJhdGlvbiBjb25mKSB7Ci0gICAgICAgIHJldHVybiAoR3JhcGhUcmF2ZXJzYWxTb3VyY2UpIFRyYXZlcnNhbFNvdXJjZS5zdXBlci53aXRoUmVtb3RlKGNvbmYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjUsIHJlcGxhY2VkIGJ5IHtAbGluayBBbm9ueW1vdXNUcmF2ZXJzYWxTb3VyY2Ujd2l0aFJlbW90ZShTdHJpbmcpfS4KLSAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElOS0VSUE9QLTIwNzgiPlRJTktFUlBPUC0yMDc4PC9hPgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIEdyYXBoVHJhdmVyc2FsU291cmNlIHdpdGhSZW1vdGUoZmluYWwgU3RyaW5nIGNvbmZpZ0ZpbGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKEdyYXBoVHJhdmVyc2FsU291cmNlKSBUcmF2ZXJzYWxTb3VyY2Uuc3VwZXIud2l0aFJlbW90ZShjb25maWdGaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy41LCByZXBsYWNlZCBieSB7QGxpbmsgQW5vbnltb3VzVHJhdmVyc2FsU291cmNlI3dpdGhSZW1vdGUoUmVtb3RlQ29ubmVjdGlvbil9LgotICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AtMjA3OCI+VElOS0VSUE9QLTIwNzg8L2E+Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWxTb3VyY2Ugd2l0aFJlbW90ZShmaW5hbCBSZW1vdGVDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgLy8gY2hlY2sgaWYgc29tZW9uZSBjYWxsZWQgd2l0aFJlbW90ZSgpIG1vcmUgdGhhbiBvbmNlLCBzbyBqdXN0IHJlbGVhc2UgcmVzb3VyY2VzIG9uIHRoZSBpbml0aWFsCi0gICAgICAgIC8vIGNvbm5lY3Rpb24gYXMgeW91IGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZS4gbWF5YmUgYmV0dGVyIHRvIHRvc3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uPz8KLSAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJUcmF2ZXJzYWxTb3VyY2UgYWxyZWFkeSBjb25maWd1cmVkIHdpdGggYSBSZW1vdGVDb25uZWN0aW9uIFslc10iLCBjb25uZWN0aW9uKSk7Ci0gICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGNsb25lID0gdGhpcy5jbG9uZSgpOwotICAgICAgICBjbG9uZS5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgY2xvbmUuZ2V0U3RyYXRlZ2llcygpLmFkZFN0cmF0ZWdpZXMobmV3IFJlbW90ZVN0cmF0ZWd5KGNvbm5lY3Rpb24pKTsKLSAgICAgICAgcmV0dXJuIGNsb25lOwotICAgIH0KLQogICAgIC8vLy8gU1BBV05TCiAKIAogICAgIC8qKgotICAgICAqIFNwYXducyBhIHtAbGluayBHcmFwaFRyYXZlcnNhbH0gYnkgYWRkaW5nIGEgdmVydGV4IHdpdGggdGhlIHNwZWNpZmllZCBsYWJlbC4KKyAgICAgKiBTcGF3bnMgYSB7QGxpbmsgR3JhcGhUcmF2ZXJzYWx9IGJ5IGFkZGluZyBhIHZlcnRleCB3aXRoIHRoZSBzcGVjaWZpZWQgbGFiZWwuIElmIHRoZSB7QGNvZGUgbGFiZWx9IGlzCisgICAgICoge0Bjb2RlIG51bGx9IHRoZW4gaXQgd2lsbCBkZWZhdWx0IHRvIHtAbGluayBWZXJ0ZXgjREVGQVVMVF9MQUJFTH0uCiAgICAgICovCiAgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBhZGRWKGZpbmFsIFN0cmluZyBsYWJlbCkgewogICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBjbG9uZSA9IHRoaXMuY2xvbmUoKTsKQEAgLTM1Miw3ICszMDgsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNwYXducyBhIHtAbGluayBHcmFwaFRyYXZlcnNhbH0gYnkgYWRkaW5nIGEgdmVydGV4IHdpdGggdGhlIGxhYmVsIGFzIGRldGVybWluZWQgYnkgYSB7QGxpbmsgVHJhdmVyc2FsfS4KKyAgICAgKiBTcGF3bnMgYSB7QGxpbmsgR3JhcGhUcmF2ZXJzYWx9IGJ5IGFkZGluZyBhIHZlcnRleCB3aXRoIHRoZSBsYWJlbCBhcyBkZXRlcm1pbmVkIGJ5IGEge0BsaW5rIFRyYXZlcnNhbH0uIElmIHRoZQorICAgICAqIHtAY29kZSB2ZXJ0ZXhMYWJlbFRyYXZlcnNhbH0gaXMge0Bjb2RlIG51bGx9IHRoZW4gaXQgd2lsbCBkZWZhdWx0IHRvIHtAbGluayBWZXJ0ZXgjREVGQVVMVF9MQUJFTH0uCiAgICAgICovCiAgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBhZGRWKGZpbmFsIFRyYXZlcnNhbDw/LCBTdHJpbmc+IHZlcnRleExhYmVsVHJhdmVyc2FsKSB7CiAgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGNsb25lID0gdGhpcy5jbG9uZSgpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9sYW1iZGEvRWxlbWVudFZhbHVlVHJhdmVyc2FsLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9FbGVtZW50VmFsdWVUcmF2ZXJzYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmNzNhNi4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9FbGVtZW50VmFsdWVUcmF2ZXJzYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5UcmF2ZXJzYWxVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi0vKioKLSAqIE1vcmUgZWZmaWNpZW50bHkgZXh0cmFjdHMgYSB2YWx1ZSBmcm9tIGFuIHtAbGluayBFbGVtZW50fSBvciB7QGNvZGUgTWFwfSB0byBhdm9pZCBzdHJhdGVneSBhcHBsaWNhdGlvbiBjb3N0cy4gTm90ZQotICogdGhhdCBhcyBvZiAzLjQuNSB0aGlzIGNsYXNzIGlzIG5vdyBwb29ybHkgbmFtZWQgYXMgaXQgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgdG8gd29yayB3aXRoIHtAbGluayBFbGVtZW50fSBvbmx5LgotICogSW4gZnV0dXJlIDMuNS4wIHRoaXMgY2xhc3Mgd2lsbCBsaWtlbHkgYmUgcmVuYW1lZCBidXQgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IHRoaXMgcmV2aXNlZCBmdW5jdGlvbmFsaXR5IGZvcgotICoge0Bjb2RlIE1hcH0gd2l0aG91dCBpbnRyb2R1Y2luZyBhIGJyZWFraW5nIGNoYW5nZSB0aGlzIG5hbWUgd2lsbCByZW1haW4gdGhlIHNhbWUuCi0gKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbGVtZW50VmFsdWVUcmF2ZXJzYWw8Vj4gZXh0ZW5kcyBBYnN0cmFjdExhbWJkYVRyYXZlcnNhbDxFbGVtZW50LCBWPiB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUtleTsKLSAgICBwcml2YXRlIFYgdmFsdWU7Ci0KLSAgICBwdWJsaWMgRWxlbWVudFZhbHVlVHJhdmVyc2FsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eUtleSkgewotICAgICAgICB0aGlzLnByb3BlcnR5S2V5ID0gcHJvcGVydHlLZXk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFYgbmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkU3RhcnQoZmluYWwgVHJhdmVyc2VyLkFkbWluPEVsZW1lbnQ+IHN0YXJ0KSB7Ci0gICAgICAgIGlmIChudWxsID09IHRoaXMuYnlwYXNzVHJhdmVyc2FsKSB7Ci0gICAgICAgICAgICAvLyBwbGF5aW5nIGEgZ2FtZSBvZiB0eXBlIGVyYXN1cmUgaGVyZS4uLi4udGVjaG5pY2FsbHkgd2UgY2FuIHByb2Nlc3MgZWl0aGVyIE1hcCBvciBFbGVtZW50IGhlcmUgaW4gdGhpcwotICAgICAgICAgICAgLy8gY2FzZSBhZnRlciAzLjQuNS4gYW5kIG9idmlvdXNseSB1c2VycyBnZXQgd2VpcmQgZXJyb3JzIGFsb25nIHRob3NlIGxpbmVzIGhlcmUgYW55d2F5LiB3aWxsIGZpeCB1cCB0aGUKLSAgICAgICAgICAgIC8vIGdlbmVyaWNzIGluIDMuNS4wIHdoZW4gd2UgY2FuIHRha2Ugc29tZSBicmVha2luZyBjaGFuZ2VzLiBzZWVtZWQgbGlrZSB0aGlzIGZlYXR1cmUgd291bGQgbWFrZSBHcmVtbGluCi0gICAgICAgICAgICAvLyBhIGxvdCBuaWNlciBhbmQgZ2l2ZW4gdGhlIHNtYWxsIGZvb3RwcmludCBvZiB0aGUgY2hhbmdlIHRoaXMgc2VlbWVkIGxpa2UgYSBnb29kIGhhY2sgdG8gdGFrZS4KLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvID0gc3RhcnQuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICgoRWxlbWVudCkgbykudmFsdWUocHJvcGVydHlLZXkpOwotICAgICAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIE1hcCkKLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gKFYpICgoTWFwKSBvKS5nZXQocHJvcGVydHlLZXkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYnkoXCIlc1wiKSBtb2R1bGF0b3IgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIHRyYXZlcnNlciB0aGF0IGlzIGFuIEVsZW1lbnQgb3IgYSBNYXAgLSBpdCBpcyBiZWluZyBhcHBsaWVkIHRvIFslc10gYSAlcyBjbGFzcyBpbnN0ZWFkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LCBvLCBvLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gVHJhdmVyc2FsVXRpbC5hcHBseShzdGFydCwgdGhpcy5ieXBhc3NUcmF2ZXJzYWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUtleSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlLZXk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJ2YWx1ZSgiICsgKG51bGwgPT0gdGhpcy5ieXBhc3NUcmF2ZXJzYWwgPyB0aGlzLnByb3BlcnR5S2V5IDogdGhpcy5ieXBhc3NUcmF2ZXJzYWwpICsgJyknOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpIF4gdGhpcy5wcm9wZXJ0eUtleS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgRWxlbWVudFZhbHVlVHJhdmVyc2FsCi0gICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMoKChFbGVtZW50VmFsdWVUcmF2ZXJzYWwpIG90aGVyKS5wcm9wZXJ0eUtleSwgdGhpcy5wcm9wZXJ0eUtleSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvbGFtYmRhL1Rva2VuVHJhdmVyc2FsLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9Ub2tlblRyYXZlcnNhbC5qYXZhCmluZGV4IGQ0MWM0MDIuLmUyNzJjY2YgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvbGFtYmRhL1Rva2VuVHJhdmVyc2FsLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9sYW1iZGEvVG9rZW5UcmF2ZXJzYWwuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UOwogCiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CkBAIC0yNyw3ICsyOCw3IEBACiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVG9rZW5UcmF2ZXJzYWw8UyBleHRlbmRzIEVsZW1lbnQsIEU+IGV4dGVuZHMgQWJzdHJhY3RMYW1iZGFUcmF2ZXJzYWw8UywgRT4geworcHVibGljIGZpbmFsIGNsYXNzIFRva2VuVHJhdmVyc2FsPFMsIEU+IGV4dGVuZHMgQWJzdHJhY3RMYW1iZGFUcmF2ZXJzYWw8UywgRT4gewogCiAgICAgcHJpdmF0ZSBFIGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBUIHQ7CkBAIC00Myw3ICs0NCwyMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkU3RhcnQoZmluYWwgVHJhdmVyc2VyLkFkbWluPFM+IHN0YXJ0KSB7Ci0gICAgICAgIHRoaXMuZSA9IChFKSB0aGlzLnQuYXBwbHkoc3RhcnQuZ2V0KCkpOworICAgICAgICBmaW5hbCBTIHMgPSBzdGFydC5nZXQoKTsKKyAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBFbGVtZW50KQorICAgICAgICAgICAgdGhpcy5lID0gKEUpIHRoaXMudC5hcHBseSgoRWxlbWVudCkgc3RhcnQuZ2V0KCkpOworICAgICAgICBlbHNlIGlmIChzIGluc3RhbmNlb2YgUHJvcGVydHkpIHsKKyAgICAgICAgICAgIC8vIFQuYXBwbHkoKSBkb2Vzbid0IHdvcmsgb24gUHJvcGVydHkgYmVjYXVzZSB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGRvZXNuJ3QgbWFrZSBpdCBhbiBFbGVtZW50LiBoYXZlCisgICAgICAgICAgICAvLyB0byBzcGVjaWFsIGNhc2UgaXQgaGVyZS4gb25seSBULmtleS92YWx1ZSBtYWtlIGFueSBzZW5zZSBmb3IgaXQuCisgICAgICAgICAgICBpZiAodCA9PSBULmtleSkKKyAgICAgICAgICAgICAgICB0aGlzLmUgPSAoRSkgKChQcm9wZXJ0eSkgcykua2V5KCk7CisgICAgICAgICAgICBlbHNlIGlmICh0ID09IFQudmFsdWUpCisgICAgICAgICAgICAgICAgdGhpcy5lID0gKChQcm9wZXJ0eTxFPikgcykudmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlRva2VuVHJhdmVyc2FsIHN1cHBvcnQgb2YgUHJvcGVydHkgZG9lcyBub3QgYWxsb3cgc2VsZWN0aW9uIGJ5ICVzIiwgdCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVG9rZW5UcmF2ZXJzYWwgc3VwcG9ydCBvZiAlcyBkb2VzIG5vdCBhbGxvdyBzZWxlY3Rpb24gYnkgJXMiLCBzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB0KSk7CisKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvbGFtYmRhL1ZhbHVlVHJhdmVyc2FsLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9WYWx1ZVRyYXZlcnNhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWQ5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9WYWx1ZVRyYXZlcnNhbC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5UcmF2ZXJzYWxVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5kZXRhY2hlZC5EZXRhY2hlZFByb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZW1wdHkuRW1wdHlQcm9wZXJ0eTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogTW9yZSBlZmZpY2llbnRseSBleHRyYWN0cyBhIHZhbHVlIGZyb20gYW4ge0BsaW5rIEVsZW1lbnR9IG9yIHtAY29kZSBNYXB9IHRvIGF2b2lkIHN0cmF0ZWd5IGFwcGxpY2F0aW9uIGNvc3RzLgorICoKKyAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQorICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmFsdWVUcmF2ZXJzYWw8VCwgVj4gZXh0ZW5kcyBBYnN0cmFjdExhbWJkYVRyYXZlcnNhbDxULCBWPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUtleTsKKyAgICBwcml2YXRlIFYgdmFsdWU7CisKKyAgICBwdWJsaWMgVmFsdWVUcmF2ZXJzYWwoZmluYWwgU3RyaW5nIHByb3BlcnR5S2V5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHlLZXkgPSBwcm9wZXJ0eUtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBuZXh0KCkgeworICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRTdGFydChmaW5hbCBUcmF2ZXJzZXIuQWRtaW48VD4gc3RhcnQpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5ieXBhc3NUcmF2ZXJzYWwpIHsKKyAgICAgICAgICAgIGZpbmFsIFQgbyA9IHN0YXJ0LmdldCgpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBFbGVtZW50KQorICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAoVikoKEVsZW1lbnQpIG8pLnByb3BlcnR5KHByb3BlcnR5S2V5KS5vckVsc2UobnVsbCk7CisgICAgICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgTWFwKQorICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAoVikgKChNYXApIG8pLmdldChwcm9wZXJ0eUtleSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBieShcIiVzXCIpIG1vZHVsYXRvciBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgdHJhdmVyc2VyIHRoYXQgaXMgYW4gRWxlbWVudCBvciBhIE1hcCAtIGl0IGlzIGJlaW5nIGFwcGxpZWQgdG8gWyVzXSBhICVzIGNsYXNzIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlLZXksIG8sIG8uZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBUcmF2ZXJzYWxVdGlsLmFwcGx5KHN0YXJ0LCB0aGlzLmJ5cGFzc1RyYXZlcnNhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5S2V5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gInZhbHVlKCIgKyAobnVsbCA9PSB0aGlzLmJ5cGFzc1RyYXZlcnNhbCA/IHRoaXMucHJvcGVydHlLZXkgOiB0aGlzLmJ5cGFzc1RyYXZlcnNhbCkgKyAnKSc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkgXiB0aGlzLnByb3BlcnR5S2V5Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvdGhlcikgeworICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBWYWx1ZVRyYXZlcnNhbAorICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKCgoVmFsdWVUcmF2ZXJzYWwpIG90aGVyKS5wcm9wZXJ0eUtleSwgdGhpcy5wcm9wZXJ0eUtleSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9CeU1vZHVsYXRpbmcuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9CeU1vZHVsYXRpbmcuamF2YQppbmRleCAwMTg0MWZhLi5iODA4YmY2IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvQnlNb2R1bGF0aW5nLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL0J5TW9kdWxhdGluZy5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuQ29sdW1uVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLkVsZW1lbnRWYWx1ZVRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5WYWx1ZVRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5GdW5jdGlvblRyYXZlcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5JZGVudGl0eVRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5Ub2tlblRyYXZlcnNhbDsKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgZGVmYXVsdCB2b2lkIG1vZHVsYXRlQnkoZmluYWwgU3RyaW5nIHN0cmluZykgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tb2R1bGF0ZUJ5KG5ldyBFbGVtZW50VmFsdWVUcmF2ZXJzYWwoc3RyaW5nKSk7CisgICAgICAgIHRoaXMubW9kdWxhdGVCeShuZXcgVmFsdWVUcmF2ZXJzYWwoc3RyaW5nKSk7CiAgICAgfQogCiAgICAgcHVibGljIGRlZmF1bHQgdm9pZCBtb2R1bGF0ZUJ5KGZpbmFsIFQgdG9rZW4pIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CkBAIC03NCw3ICs3NCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIGRlZmF1bHQgdm9pZCBtb2R1bGF0ZUJ5KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgICAgICB0aGlzLm1vZHVsYXRlQnkobmV3IEVsZW1lbnRWYWx1ZVRyYXZlcnNhbDw+KGtleSksIGNvbXBhcmF0b3IpOworICAgICAgICB0aGlzLm1vZHVsYXRlQnkobmV3IFZhbHVlVHJhdmVyc2FsPD4oa2V5KSwgY29tcGFyYXRvcik7CiAgICAgfQogCiAgICAgcHVibGljIGRlZmF1bHQgdm9pZCBtb2R1bGF0ZUJ5KGZpbmFsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgewpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL0dyb3VwaW5nLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvR3JvdXBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTE1NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL0dyb3VwaW5nLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuQ29sdW1uVHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLkZ1bmN0aW9uVHJhdmVyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLklkZW50aXR5VHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLlRva2VuVHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLlZhbHVlVHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuR3JvdXBTdGVwOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuTGFtYmRhTWFwU3RlcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5Hcm91cFNpZGVFZmZlY3RTdGVwOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLlByb2ZpbGVTdGVwOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgZm9yIGNvbW1vbiBmdW5jdGlvbmFsaXR5IG9mIHtAbGluayBHcm91cFN0ZXB9IGFuZCB7QGxpbmsgR3JvdXBTaWRlRWZmZWN0U3RlcH0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR3JvdXBpbmc8UywgSywgVj4geworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvdmlkZWQgdHJhdmVyc2FsIGlzIGVxdWFsIHRvIHRoZSBrZXkgdHJhdmVyc2FsIHRoYXQgdGhlIHtAY29kZSBHcm91cGluZ30gaGFzLgorICAgICAqLworICAgIHB1YmxpYyBUcmF2ZXJzYWwuQWRtaW48UywgSz4gZ2V0S2V5VHJhdmVyc2FsKCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm92aWRlZCB0cmF2ZXJzYWwgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIHRyYXZlcnNhbCB0aGF0IHRoZSB7QGNvZGUgR3JvdXBpbmd9IGhhcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHJhdmVyc2FsLkFkbWluPFMsIFY+IGdldFZhbHVlVHJhdmVyc2FsKCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBmaXJzdCAobm9uLWxvY2FsKSBiYXJyaWVyIHN0ZXAgaW4gdGhlIHByb3ZpZGVkIHRyYXZlcnNhbC4gVGhpcyBtZXRob2QgaXMgdXNlZCBieSB7QGxpbmsgR3JvdXBTdGVwfQorICAgICAqIGFuZCB7QGxpbmsgR3JvdXBTaWRlRWZmZWN0U3RlcH0gdG8gdWx0aW1hdGVseSBkZXRlcm1pbmUgdGhlIHJlZHVjaW5nIGJpLW9wZXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYXZlcnNhbCBUaGUgdHJhdmVyc2FsIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybiBUaGUgZmlyc3Qgbm9uLWxvY2FsIGJhcnJpZXIgc3RlcCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gc3VjaCBzdGVwIHdhcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBCYXJyaWVyIGRldGVybWluZUJhcnJpZXJTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjxTLCBWPiB0cmF2ZXJzYWwpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdGVwPiBzdGVwcyA9IHRyYXZlcnNhbC5nZXRTdGVwcygpOworICAgICAgICBmb3IgKGludCBpeCA9IDA7IGl4IDwgc3RlcHMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdGVwIHN0ZXAgPSBzdGVwcy5nZXQoaXgpOworICAgICAgICAgICAgaWYgKHN0ZXAgaW5zdGFuY2VvZiBCYXJyaWVyICYmICEoc3RlcCBpbnN0YW5jZW9mIExvY2FsQmFycmllcikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBCYXJyaWVyIGIgPSAoQmFycmllcikgc3RlcDsKKworICAgICAgICAgICAgICAgIC8vIHdoZW4gcHJvZmlsZSgpIGlzIGVuYWJsZWQgdGhlIHN0ZXAgbmVlZHMgdG8gYmUgd3JhcHBlZCB1cCB3aXRoIHRoZSBiYXJyaWVyIHNvIHRoYXQgdGhlIHRpbWVyIG9uCisgICAgICAgICAgICAgICAgLy8gdGhlIFByb2ZpbGVTdGVwIGlzIHByb3Blcmx5IHRyaWdnZXJlZAorICAgICAgICAgICAgICAgIGlmIChpeCA8IHN0ZXBzLnNpemUoKSAtIDEgJiYgc3RlcHMuZ2V0KGl4ICsgMSkgaW5zdGFuY2VvZiBQcm9maWxlU3RlcCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9maWxpbmdBd2FyZS5Qcm9maWxlZEJhcnJpZXIoYiwgKFByb2ZpbGVTdGVwKSBzdGVwcy5nZXQoaXggKyAxKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZGVmYXVsdCBUcmF2ZXJzYWwuQWRtaW48UywgVj4gY29udmVydFZhbHVlVHJhdmVyc2FsKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjxTLCBWPiB2YWx1ZVRyYXZlcnNhbCkgeworICAgICAgICBpZiAodmFsdWVUcmF2ZXJzYWwgaW5zdGFuY2VvZiBWYWx1ZVRyYXZlcnNhbCB8fAorICAgICAgICAgICAgICAgIHZhbHVlVHJhdmVyc2FsIGluc3RhbmNlb2YgVG9rZW5UcmF2ZXJzYWwgfHwKKyAgICAgICAgICAgICAgICB2YWx1ZVRyYXZlcnNhbCBpbnN0YW5jZW9mIElkZW50aXR5VHJhdmVyc2FsIHx8CisgICAgICAgICAgICAgICAgdmFsdWVUcmF2ZXJzYWwgaW5zdGFuY2VvZiBDb2x1bW5UcmF2ZXJzYWwgfHwKKyAgICAgICAgICAgICAgICB2YWx1ZVRyYXZlcnNhbC5nZXRTdGFydFN0ZXAoKSBpbnN0YW5jZW9mIExhbWJkYU1hcFN0ZXAgJiYgKChMYW1iZGFNYXBTdGVwKSB2YWx1ZVRyYXZlcnNhbC5nZXRTdGFydFN0ZXAoKSkuZ2V0TWFwRnVuY3Rpb24oKSBpbnN0YW5jZW9mIEZ1bmN0aW9uVHJhdmVyc2VyKSB7CisgICAgICAgICAgICByZXR1cm4gKFRyYXZlcnNhbC5BZG1pbjxTLCBWPikgX18ubWFwKHZhbHVlVHJhdmVyc2FsKS5mb2xkKCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlVHJhdmVyc2FsOworICAgIH0KKworICAgIHB1YmxpYyBkZWZhdWx0IE1hcDxLLCBWPiBkb0ZpbmFsUmVkdWN0aW9uKGZpbmFsIE1hcDxLLCBPYmplY3Q+IG1hcCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPFMsIFY+IHZhbHVlVHJhdmVyc2FsKSB7CisgICAgICAgIGZpbmFsIEJhcnJpZXIgYmFycmllclN0ZXAgPSBkZXRlcm1pbmVCYXJyaWVyU3RlcCh2YWx1ZVRyYXZlcnNhbCk7CisgICAgICAgIGlmIChiYXJyaWVyU3RlcCAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEsga2V5IDogbWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgdmFsdWVUcmF2ZXJzYWwucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBiYXJyaWVyU3RlcC5hZGRCYXJyaWVyKG1hcC5nZXQoa2V5KSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlVHJhdmVyc2FsLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlVHJhdmVyc2FsLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChNYXA8SywgVj4pIG1hcDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvUGF0aFByb2Nlc3Nvci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL1BhdGhQcm9jZXNzb3IuamF2YQppbmRleCA4YTU4NDNhLi5mMGI3ZTIwIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvUGF0aFByb2Nlc3Nvci5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9QYXRoUHJvY2Vzc29yLmphdmEKQEAgLTIwLDcgKzIwLDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLkVsZW1lbnRWYWx1ZVRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5WYWx1ZVRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5JZGVudGl0eVRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5Ub2tlblRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UOwpAQCAtNDksNyArNDksNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhdmVyc2FsIGluc3RhbmNlb2YgVG9rZW5UcmF2ZXJzYWwgJiYgKChUb2tlblRyYXZlcnNhbCkgdHJhdmVyc2FsKS5nZXRUb2tlbigpLmVxdWFscyhULmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobWF4LmNvbXBhcmVUbyhFbGVtZW50UmVxdWlyZW1lbnQuTEFCRUwpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IEVsZW1lbnRSZXF1aXJlbWVudC5MQUJFTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYXZlcnNhbCBpbnN0YW5jZW9mIEVsZW1lbnRWYWx1ZVRyYXZlcnNhbCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhdmVyc2FsIGluc3RhbmNlb2YgVmFsdWVUcmF2ZXJzYWwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1heC5jb21wYXJlVG8oRWxlbWVudFJlcXVpcmVtZW50LlBST1BFUlRJRVMpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IEVsZW1lbnRSZXF1aXJlbWVudC5QUk9QRVJUSUVTOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvU2NvcGluZy5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL1Njb3BpbmcuamF2YQppbmRleCAzNmU3NDkzLi5lMmMwZTE3IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvU2NvcGluZy5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9TY29waW5nLmphdmEKQEAgLTEwOSwyNiArMTA5LDU0IEBACiAKICAgICBwdWJsaWMgZW51bSBWYXJpYWJsZSB7U1RBUlQsIEVORH0KIAotICAgIHB1YmxpYyBkZWZhdWx0IDxTPiBTIGdldFNjb3BlVmFsdWUoZmluYWwgUG9wIHBvcCwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgVHJhdmVyc2VyLkFkbWluPD8+IHRyYXZlcnNlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFMgbyA9IGdldE51bGxhYmxlU2NvcGVWYWx1ZShwb3AsIGtleSwgdHJhdmVyc2VyKTsKLSAgICAgICAgaWYgKG51bGwgPT0gbykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgdGhlIHNpZGVFZmZlY3RzLCBtYXAsIG5vciBwYXRoIGhhcyBhICIgKyBrZXkgKyAiLWtleTogIiArIHRoaXMpOwotICAgICAgICByZXR1cm4gbzsKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZm9yIHRoZSBjdXJyZW50IHRyYXZlcnNlciBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUga2V5IGNhbm5vdAorICAgICAqIGJlIGZvdW5kLgorICAgICAqCisgICAgICogQHRocm93cyBLZXlOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIGRlZmF1bHQgPFM+IFMgZ2V0U2NvcGVWYWx1ZShmaW5hbCBQb3AgcG9wLCBmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Pz4gdHJhdmVyc2VyKSB0aHJvd3MgS2V5Tm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPYmplY3Qgb2JqZWN0ID0gdHJhdmVyc2VyLmdldCgpOworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwICYmICgoTWFwKSBvYmplY3QpLmNvbnRhaW5zS2V5KGtleSkpCisgICAgICAgICAgICByZXR1cm4gKFMpICgoTWFwKSBvYmplY3QpLmdldChrZXkpOworCisgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrID0gKFN0cmluZykga2V5OworICAgICAgICAgICAgaWYgKHRyYXZlcnNlci5nZXRTaWRlRWZmZWN0cygpLmV4aXN0cyhrKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhdmVyc2VyLmdldFNpZGVFZmZlY3RzKCkuZ2V0KGspOworCisgICAgICAgICAgICBmaW5hbCBQYXRoIHBhdGggPSB0cmF2ZXJzZXIucGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGguaGFzTGFiZWwoaykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gcG9wID8gcGF0aC5nZXQoaykgOiBwYXRoLmdldChwb3AsIGspOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEtleU5vdEZvdW5kRXhjZXB0aW9uKGtleSwgdGhpcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rICNnZXRTY29wZVZhbHVlKFBvcCwgT2JqZWN0LCBUcmF2ZXJzZXIuQWRtaW4pfSBidXQgdGhyb3dzIGFuIHVuY2hlY2tlZCB7QGNvZGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufQorICAgICAqIGlmIHRoZSBrZXkgY2Fubm90IGJlIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBkZWZhdWx0IDxTPiBTIGdldFNhZmVTY29wZVZhbHVlKGZpbmFsIFBvcCBwb3AsIGZpbmFsIE9iamVjdCBrZXksIGZpbmFsIFRyYXZlcnNlci5BZG1pbjw/PiB0cmF2ZXJzZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTY29wZVZhbHVlKHBvcCwga2V5LCB0cmF2ZXJzZXIpOworICAgICAgICB9IGNhdGNoIChLZXlOb3RGb3VuZEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obmZlLmdldE1lc3NhZ2UoKSwgbmZlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjZ2V0U2NvcGVWYWx1ZShQb3AsIE9iamVjdCwgVHJhdmVyc2VyLkFkbWluKX0gYW5kIHJldHVybnMge0Bjb2RlIG51bGx9IGlmIHRoZSBrZXkgaXMgbm90IGZvdW5kLgorICAgICAqIFVzZSB0aGlzIG1ldGhvZCB3aXRoIGNhdXRpb24gYXMge0Bjb2RlIG51bGx9IGhhcyBvbmUgb2YgdHdvIG1lYW5pbmdzIGFzIGEgcmV0dXJuIHZhbHVlLiBJdCBjb3VsZCBiZSB0aGF0IHRoZQorICAgICAqIGtleSB3YXMgZm91bmQgYW5kIGl0cyB2YWx1ZSB3YXMge0Bjb2RlIG51bGx9IG9yIGl0IG1pZ2h0IG1lYW4gdGhhdCB0aGUga2V5IHdhcyBub3QgZm91bmQgYW5kIHtAY29kZSBudWxsfSB3YXMKKyAgICAgKiBzaW1wbHkgcmV0dXJuZWQuCisgICAgICovCiAgICAgcHVibGljIGRlZmF1bHQgPFM+IFMgZ2V0TnVsbGFibGVTY29wZVZhbHVlKGZpbmFsIFBvcCBwb3AsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFRyYXZlcnNlci5BZG1pbjw/PiB0cmF2ZXJzZXIpIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IG9iamVjdCA9IHRyYXZlcnNlci5nZXQoKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcDxTdHJpbmcsIFM+KSBvYmplY3QpLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgICAgICByZXR1cm4gKChNYXA8U3RyaW5nLCBTPikgb2JqZWN0KS5nZXQoa2V5KTsKLQotICAgICAgICBpZiAodHJhdmVyc2VyLmdldFNpZGVFZmZlY3RzKCkuZXhpc3RzKGtleSkpCi0gICAgICAgICAgICByZXR1cm4gdHJhdmVyc2VyLmdldFNpZGVFZmZlY3RzKCkuZ2V0KGtleSk7Ci0KLSAgICAgICAgZmluYWwgUGF0aCBwYXRoID0gdHJhdmVyc2VyLnBhdGgoKTsKLSAgICAgICAgaWYgKHBhdGguaGFzTGFiZWwoa2V5KSkKLSAgICAgICAgICAgIHJldHVybiBwYXRoLmdldChwb3AsIGtleSk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2NvcGVWYWx1ZShwb3AsIGtleSwgdHJhdmVyc2VyKTsKKyAgICAgICAgfSBjYXRjaCAoS2V5Tm90Rm91bmRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTM3LDQgKzE2NSwyNCBAQAogICAgICAqIEByZXR1cm4gdGhlIGFjY2Vzc2VkIGxhYmVscyBvZiB0aGUgc2NvcGluZyBzdGVwCiAgICAgICovCiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFNjb3BlS2V5cygpOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXlOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qga2V5OworICAgICAgICBwcml2YXRlIGZpbmFsIFNjb3Bpbmcgc3RlcDsKKworICAgICAgICBwdWJsaWMgS2V5Tm90Rm91bmRFeGNlcHRpb24oZmluYWwgT2JqZWN0IGtleSwgZmluYWwgU2NvcGluZyBjdXJyZW50KSB7CisgICAgICAgICAgICBzdXBlcigiTmVpdGhlciB0aGUgbWFwLCBzaWRlRWZmZWN0cywgbm9yIHBhdGggaGFzIGEgIiArIGtleSArICIta2V5OiAiICsgY3VycmVudCk7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMuc3RlcCA9IGN1cnJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2NvcGluZyBnZXRTdGVwKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZXA7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvU2VlZGFibGUuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9TZWVkYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDFjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvU2VlZGFibGUuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwOworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlNlZWRTdHJhdGVneTsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgc3RlcHMgdGhhdCBoYXZlIHNvbWUgZm9ybSBvZiB7QGNvZGUgUmFuZG9tfSB1c2FnZSB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGJ5IHdheSBvZiBhCisgKiB7QGNvZGUgc2VlZH0gdG8gYWxsb3cgZm9yIGRldGVybWluaXN0aWMgYmVoYXZpb3Igb2YgdGhlIHN0ZXAuCisgKgorICogQHNlZSBTZWVkU3RyYXRlZ3kKKyAqLworcHVibGljIGludGVyZmFjZSBTZWVkYWJsZSB7CisKKyAgICBwdWJsaWMgdm9pZCByZXNldFNlZWQoZmluYWwgbG9uZyBzZWVkKTsKK30KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9UcmF2ZXJzYWxQYXJlbnQuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9UcmF2ZXJzYWxQYXJlbnQuamF2YQppbmRleCAxMGRmOTUwLi42OTVkMjk3IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvVHJhdmVyc2FsUGFyZW50LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL1RyYXZlcnNhbFBhcmVudC5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuRW1wdHlTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudHJhdmVyc2VyLlRyYXZlcnNlclJlcXVpcmVtZW50OwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNTcsNiArNTYsMTAgQEAKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyB0cmF2ZXJzYWwgcGFyZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlbW92YWwgb2YgZ2xvYmFsIHRyYXZlcnNhbHM6ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgZGVmYXVsdCB2b2lkIHJlcGxhY2VMb2NhbENoaWxkKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBvbGRUcmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBuZXdUcmF2ZXJzYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyB0cmF2ZXJzYWwgcGFyZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcGxhY2VtZW50IG9mIGxvY2FsIHRyYXZlcnNhbHM6ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgZGVmYXVsdCBTZXQ8VHJhdmVyc2VyUmVxdWlyZW1lbnQ+IGdldFNlbGZBbmRDaGlsZFJlcXVpcmVtZW50cyhmaW5hbCBUcmF2ZXJzZXJSZXF1aXJlbWVudC4uLiBzZWxmUmVxdWlyZW1lbnRzKSB7CiAgICAgICAgIGZpbmFsIFNldDxUcmF2ZXJzZXJSZXF1aXJlbWVudD4gcmVxdWlyZW1lbnRzID0gRW51bVNldC5ub25lT2YoVHJhdmVyc2VyUmVxdWlyZW1lbnQuY2xhc3MpOwogICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwocmVxdWlyZW1lbnRzLCBzZWxmUmVxdWlyZW1lbnRzKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvQ29pblN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvQ29pblN0ZXAuamF2YQppbmRleCBkYjI0ODBkLi5hN2Q4NmNiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL0NvaW5TdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9Db2luU3RlcC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuU2VlZGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIuVHJhdmVyc2VyUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5TdHJpbmdGYWN0b3J5OwogCkBAIC0zMCw5ICszMSw5IEBACiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29pblN0ZXA8Uz4gZXh0ZW5kcyBGaWx0ZXJTdGVwPFM+IHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb2luU3RlcDxTPiBleHRlbmRzIEZpbHRlclN0ZXA8Uz4gaW1wbGVtZW50cyBTZWVkYWJsZSB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORE9NID0gbmV3IFJhbmRvbSgpOworICAgIHByaXZhdGUgZmluYWwgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKICAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBwcm9iYWJpbGl0eTsKIAogICAgIHB1YmxpYyBDb2luU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsLCBmaW5hbCBkb3VibGUgcHJvYmFiaWxpdHkpIHsKQEAgLTQxLDE5ICs0MiwxOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0U2VlZChmaW5hbCBsb25nIHNlZWQpIHsKKyAgICAgICAgcmFuZG9tLnNldFNlZWQoc2VlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsdGVyKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpIHsKICAgICAgICAgbG9uZyBuZXdCdWxrID0gMGw7CiAgICAgICAgIGlmICh0cmF2ZXJzZXIuYnVsaygpIDwgMTAwKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYXZlcnNlci5idWxrKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2JhYmlsaXR5ID49IFJBTkRPTS5uZXh0RG91YmxlKCkpCisgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvYmFiaWxpdHkgPj0gcmFuZG9tLm5leHREb3VibGUoKSkKICAgICAgICAgICAgICAgICAgICAgbmV3QnVsaysrOwogICAgICAgICAgICAgfQotICAgICAgICAvKn0gZWxzZSBpZiAodHJhdmVyc2VyLmJ1bGsoKSA8IDEwMDAwMDApIHsKLSAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBjdW11bGF0aXZlID0gUkFORE9NLm5leHREb3VibGUoKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudCA9IERvdWJsZS52YWx1ZU9mKHRyYXZlcnNlci5idWxrKCkgLyAyLjBkKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBuZXh0ID0gY2hvb3NlKHRyYXZlcnNlci5idWxrKCksIGN1cnJlbnQpICogTWF0aC5wb3codGhpcy5wcm9iYWJpbGl0eSxjdXJyZW50KSAqIE1hdGgucG93KDEuMGQgLSB0aGlzLnByb2JhYmlsaXR5LHRyYXZlcnNlci5idWxrKCkgLSBjdXJyZW50KTsKLSAgICAgICAgICAgIGlmKCkKLSAgICAgICAgICAgICovCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdCdWxrID0gTWF0aC5yb3VuZCh0aGlzLnByb2JhYmlsaXR5ICogdHJhdmVyc2VyLmJ1bGsoKSk7CiAgICAgICAgIH0KQEAgLTc2LDIyICs3Niw0IEBACiAgICAgcHVibGljIFNldDxUcmF2ZXJzZXJSZXF1aXJlbWVudD4gZ2V0UmVxdWlyZW1lbnRzKCkgewogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFRyYXZlcnNlclJlcXVpcmVtZW50LkJVTEspOwogICAgIH0KLQotICAgIC8vLy8vLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGNob29zZShsb25nIHgsIGxvbmcgeSkgewotICAgICAgICBpZiAoeSA8IDAgfHwgeSA+IHgpIHJldHVybiAwOwotICAgICAgICBpZiAoeSA+IHggLyAyKSB7Ci0gICAgICAgICAgICAvLyBjaG9vc2UobixrKSA9PSBjaG9vc2UobixuLWspLAotICAgICAgICAgICAgLy8gc28gdGhpcyBjb3VsZCBzYXZlIGEgbGl0dGxlIGVmZm9ydAotICAgICAgICAgICAgeSA9IHggLSB5OwotICAgICAgICB9Ci0KLSAgICAgICAgZG91YmxlIGRlbm9taW5hdG9yID0gMS4wLCBudW1lcmF0b3IgPSAxLjA7Ci0gICAgICAgIGZvciAobG9uZyBpID0gMTsgaSA8PSB5OyBpKyspIHsKLSAgICAgICAgICAgIGRlbm9taW5hdG9yICo9IGk7Ci0gICAgICAgICAgICBudW1lcmF0b3IgKj0gKHggKyAxIC0gaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bWVyYXRvciAvIGRlbm9taW5hdG9yOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvRGVkdXBHbG9iYWxTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL0RlZHVwR2xvYmFsU3RlcC5qYXZhCmluZGV4IGI0ZjcwZDkuLmJiZGUyOTYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvRGVkdXBHbG9iYWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9EZWR1cEdsb2JhbFN0ZXAuamF2YQpAQCAtMzIsOCArMzIsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuRmFzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLlRyYXZlcnNhbFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5TdHJpbmdGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZGV0YWNoZWQuRGV0YWNoZWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwucmVmZXJlbmNlLlJlZmVyZW5jZUZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC03NCw3ICs3Niw3IEBACiAgICAgICAgICAgICByZXR1cm4gdGhpcy5kdXBsaWNhdGVTZXQuYWRkKFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZSh0cmF2ZXJzZXIsIHRoaXMuZGVkdXBUcmF2ZXJzYWwpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBvYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KHRoaXMuZGVkdXBMYWJlbHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHRoaXMuZGVkdXBMYWJlbHMuZm9yRWFjaChsYWJlbCAtPiBvYmplY3RzLmFkZChUcmF2ZXJzYWxVdGlsLmFwcGx5TnVsbGFibGUoKFMpIHRoaXMuZ2V0U2NvcGVWYWx1ZShQb3AubGFzdCwgbGFiZWwsIHRyYXZlcnNlciksIHRoaXMuZGVkdXBUcmF2ZXJzYWwpKSk7CisgICAgICAgICAgICB0aGlzLmRlZHVwTGFiZWxzLmZvckVhY2gobGFiZWwgLT4gb2JqZWN0cy5hZGQoVHJhdmVyc2FsVXRpbC5hcHBseU51bGxhYmxlKChTKSB0aGlzLmdldFNhZmVTY29wZVZhbHVlKFBvcC5sYXN0LCBsYWJlbCwgdHJhdmVyc2VyKSwgdGhpcy5kZWR1cFRyYXZlcnNhbCkpKTsKICAgICAgICAgICAgIHJldHVybiB0aGlzLmR1cGxpY2F0ZVNldC5hZGQob2JqZWN0cyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTYsNiArMTE4LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUxvY2FsQ2hpbGQoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICBpZiAobnVsbCAhPSB0aGlzLmRlZHVwVHJhdmVyc2FsICYmIHRoaXMuZGVkdXBUcmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpCisgICAgICAgICAgICB0aGlzLmRlZHVwVHJhdmVyc2FsID0gdGhpcy5pbnRlZ3JhdGVDaGlsZChuZXdUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEZWR1cEdsb2JhbFN0ZXA8Uz4gY2xvbmUoKSB7CiAgICAgICAgIGZpbmFsIERlZHVwR2xvYmFsU3RlcDxTPiBjbG9uZSA9IChEZWR1cEdsb2JhbFN0ZXA8Uz4pIHN1cGVyLmNsb25lKCk7CiAgICAgICAgIGNsb25lLmR1cGxpY2F0ZVNldCA9IG5ldyBIYXNoU2V0PD4oKTsKQEAgLTE4OSwxNSArMTk3LDI2IEBACiAgICAgICAgICAgICBpZiAobnVsbCAhPSB0aGlzLmRlZHVwTGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IEFycmF5TGlzdDw+KHRoaXMuZGVkdXBMYWJlbHMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBsYWJlbCA6IHRoaXMuZGVkdXBMYWJlbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgKChMaXN0KSBvYmplY3QpLmFkZChUcmF2ZXJzYWxVdGlsLmFwcGx5TnVsbGFibGUoKFMpIHRoaXMuZ2V0U2NvcGVWYWx1ZShQb3AubGFzdCwgbGFiZWwsIHRyYXZlcnNlciksIHRoaXMuZGVkdXBUcmF2ZXJzYWwpKTsKKyAgICAgICAgICAgICAgICAgICAgKChMaXN0KSBvYmplY3QpLmFkZChUcmF2ZXJzYWxVdGlsLmFwcGx5TnVsbGFibGUoKFMpIHRoaXMuZ2V0U2FmZVNjb3BlVmFsdWUoUG9wLmxhc3QsIGxhYmVsLCB0cmF2ZXJzZXIpLCB0aGlzLmRlZHVwVHJhdmVyc2FsKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvYmplY3QgPSBUcmF2ZXJzYWxVdGlsLmFwcGx5TnVsbGFibGUodHJhdmVyc2VyLCB0aGlzLmRlZHVwVHJhdmVyc2FsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbWFwLmNvbnRhaW5zS2V5KG9iamVjdCkpIHsKICAgICAgICAgICAgICAgICB0cmF2ZXJzZXIuc2V0QnVsaygxTCk7Ci0gICAgICAgICAgICAgICAgLy8gdHJhdmVyc2VyLmRldGFjaCgpOwotICAgICAgICAgICAgICAgIHRyYXZlcnNlci5zZXQoRGV0YWNoZWRGYWN0b3J5LmRldGFjaCh0cmF2ZXJzZXIuZ2V0KCksIHRydWUpKTsgLy8gVE9ETzogZGV0ZWN0IHJlcXVpcmVkIGRldGFjaG1lbnQgYWNjb3JkaW5nbHkKKworICAgICAgICAgICAgICAgIC8vIERldGFjaGVkUHJvcGVydHkgYW5kIERldGFjaGVkVmVydGV4UHJvcGVydHkgYm90aCBoYXZlIGEgdHJhbnNpZW50IGZvciB0aGUgSG9zdCBlbGVtZW50LiB0aGF0IGNhdXNlcworICAgICAgICAgICAgICAgIC8vIHRyb3VibGUgZm9yIG9sYXAgd2hpY2ggZW5kcyB1cCByZXF1aXJpbmcgdGhlIEhvc3QgbGF0ZXIuIGNhbid0IGNoYW5nZSB0aGUgdHJhbnNpZW50IHdpdGhvdXQgc29tZQorICAgICAgICAgICAgICAgIC8vIGNvbnNlcXVlbmNlczogKDEpIHdlIGJyZWFrIGdyeW8gZm9ybWF0dGluZyBhbmQgaW8gdGVzdHMgc3RhcnQgZmFpbGluZyAoMikgc3RvcmluZyB0aGUgZWxlbWVudCB3aXRoCisgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGhhcyB0aGUgcG90ZW50aWFsIHRvIGJsb2F0IGRldGFjaGVkIEVsZW1lbnQgaW5zdGFuY2VzIGFzIGl0IGJhc2ljYWxseSBzdG9yZXMgdGhhdCBkYXRhCisgICAgICAgICAgICAgICAgLy8gdHdpY2UuIE5vdCBzdXJlIGlmIGl0J3Mgc21hcnQgdG8gY2hhbmdlIHRoYXQgYXQgbGVhc3QgaW4gMy40LnggYW5kIG5vdCB3aXRob3V0IHNvbWUgY29uc2lkZXJhYmxlCisgICAgICAgICAgICAgICAgLy8gdGhvdWdodCBhcyB0byB3aGF0IG1pZ2h0IGJlIG1ham9yIGNoYW5nZXMuIFRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtIHdlIHdpbGwgZGV0YWNoIHByb3BlcnRpZXMgYXMKKyAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHNvIHRoYXQgdGhlIHBhcmVudCBlbGVtZW50IGdvZXMgd2l0aCBpdC4gQWxzbywgZ2l2ZW4gVElOS0VSUE9QLTIzMTggcHJvcGVydHkgY29tcGFyaXNvbnMKKyAgICAgICAgICAgICAgICAvLyBoYXZlIGNoYW5nZWQgaW4gc3VjaCBhIHdheSB0aGF0IGFsbG93cyB0aGlzIHRvIHdvcmsgcHJvcGVybHkKKyAgICAgICAgICAgICAgICBpZiAodHJhdmVyc2VyLmdldCgpIGluc3RhbmNlb2YgUHJvcGVydHkpCisgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlci5zZXQoUmVmZXJlbmNlRmFjdG9yeS5kZXRhY2godHJhdmVyc2VyLmdldCgpKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZXIuc2V0KERldGFjaGVkRmFjdG9yeS5kZXRhY2godHJhdmVyc2VyLmdldCgpLCB0cnVlKSk7CiAgICAgICAgICAgICAgICAgbWFwLnB1dChvYmplY3QsIHRyYXZlcnNlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvUGF0aEZpbHRlclN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvUGF0aEZpbHRlclN0ZXAuamF2YQppbmRleCAxNmUzZjBmLi42Yjc3YTM2IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL1BhdGhGaWx0ZXJTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9QYXRoRmlsdGVyU3RlcC5qYXZhCkBAIC0xMDksNiArMTA5LDEzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUxvY2FsQ2hpbGQoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICB0aGlzLnRyYXZlcnNhbFJpbmcucmVwbGFjZVRyYXZlcnNhbCgKKyAgICAgICAgICAgICAgICAoVHJhdmVyc2FsLkFkbWluPE9iamVjdCwgT2JqZWN0Pikgb2xkVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgIChUcmF2ZXJzYWwuQWRtaW48T2JqZWN0LCBPYmplY3Q+KSBuZXdUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgICAgICBzdXBlci5yZXNldCgpOwogICAgICAgICB0aGlzLnRyYXZlcnNhbFJpbmcucmVzZXQoKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvU2FtcGxlR2xvYmFsU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9TYW1wbGVHbG9iYWxTdGVwLmphdmEKaW5kZXggZTRjYTQzMC4uYjM0MjEwMCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9TYW1wbGVHbG9iYWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9TYW1wbGVHbG9iYWxTdGVwLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5Db25zdGFudFRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuQnlNb2R1bGF0aW5nOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5TZWVkYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkNvbGxlY3RpbmdCYXJyaWVyU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5Qcm9qZWN0ZWRUcmF2ZXJzZXI7CkBAIC0zOCwxMSArMzksMTEgQEAKIC8qKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTYW1wbGVHbG9iYWxTdGVwPFM+IGV4dGVuZHMgQ29sbGVjdGluZ0JhcnJpZXJTdGVwPFM+IGltcGxlbWVudHMgVHJhdmVyc2FsUGFyZW50LCBCeU1vZHVsYXRpbmcgeworcHVibGljIGZpbmFsIGNsYXNzIFNhbXBsZUdsb2JhbFN0ZXA8Uz4gZXh0ZW5kcyBDb2xsZWN0aW5nQmFycmllclN0ZXA8Uz4gaW1wbGVtZW50cyBUcmF2ZXJzYWxQYXJlbnQsIEJ5TW9kdWxhdGluZywgU2VlZGFibGUgewogCiAgICAgcHJpdmF0ZSBUcmF2ZXJzYWwuQWRtaW48UywgTnVtYmVyPiBwcm9iYWJpbGl0eVRyYXZlcnNhbCA9IG5ldyBDb25zdGFudFRyYXZlcnNhbDw+KDEuMGQpOwogICAgIHByaXZhdGUgZmluYWwgaW50IGFtb3VudFRvU2FtcGxlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET00gPSBuZXcgUmFuZG9tKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwogCiAgICAgcHVibGljIFNhbXBsZUdsb2JhbFN0ZXAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbCwgZmluYWwgaW50IGFtb3VudFRvU2FtcGxlKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CkBAIC01MCw2ICs1MSwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0U2VlZChmaW5hbCBsb25nIHNlZWQpIHsKKyAgICAgICAgcmFuZG9tLnNldFNlZWQoc2VlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpc3Q8VHJhdmVyc2FsLkFkbWluPFMsIE51bWJlcj4+IGdldExvY2FsQ2hpbGRyZW4oKSB7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRoaXMucHJvYmFiaWxpdHlUcmF2ZXJzYWwpOwogICAgIH0KQEAgLTYwLDYgKzY2LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUxvY2FsQ2hpbGQoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICBpZiAobnVsbCAhPSB0aGlzLnByb2JhYmlsaXR5VHJhdmVyc2FsICYmIHRoaXMucHJvYmFiaWxpdHlUcmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpCisgICAgICAgICAgICB0aGlzLnByb2JhYmlsaXR5VHJhdmVyc2FsID0gdGhpcy5pbnRlZ3JhdGVDaGlsZChuZXdUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBTdHJpbmdGYWN0b3J5LnN0ZXBTdHJpbmcodGhpcywgdGhpcy5hbW91bnRUb1NhbXBsZSwgdGhpcy5wcm9iYWJpbGl0eVRyYXZlcnNhbCk7CiAgICAgfQpAQCAtOTIsNyArMTA0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlQnVsayA8IHMuYnVsaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBjdXJyZW50V2VpZ2h0ID0gKChQcm9qZWN0ZWRUcmF2ZXJzZXI8UywgTnVtYmVyPikgcykuZ2V0UHJvamVjdGlvbnMoKS5nZXQoMCkuZG91YmxlVmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAocy5idWxrKCkgLSBzYW1wbGVCdWxrKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkFORE9NLm5leHREb3VibGUoKSA8PSAoKGN1cnJlbnRXZWlnaHQgLyBydW5uaW5nVG90YWxXZWlnaHQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmRvbS5uZXh0RG91YmxlKCkgPD0gKChjdXJyZW50V2VpZ2h0IC8gcnVubmluZ1RvdGFsV2VpZ2h0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gc3BsaXQgPSBzLnNwbGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXQuc2V0QnVsaygxTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFNldC5hZGQoc3BsaXQpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9XaGVyZVByZWRpY2F0ZVN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvV2hlcmVQcmVkaWNhdGVTdGVwLmphdmEKaW5kZXggMjQwYTRjYy4uMzA2ZmIyNSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9XaGVyZVByZWRpY2F0ZVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL1doZXJlUHJlZGljYXRlU3RlcC5qYXZhCkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuQ29ubmVjdGl2ZVA7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLlRyYXZlcnNhbEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsUmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLlN0cmluZ0ZhY3Rvcnk7CkBAIC03OSw3ICs3OCw3IEBACiAgICAgICAgIGlmIChwcmVkaWNhdGUgaW5zdGFuY2VvZiBDb25uZWN0aXZlUCkKICAgICAgICAgICAgICgoQ29ubmVjdGl2ZVA8T2JqZWN0PikgcHJlZGljYXRlKS5nZXRQcmVkaWNhdGVzKCkuZm9yRWFjaChwIC0+IHRoaXMuc2V0UHJlZGljYXRlVmFsdWVzKHAsIHRyYXZlcnNlciwgc2VsZWN0S2V5c0l0ZXJhdG9yKSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZWRpY2F0ZS5zZXRWYWx1ZShUcmF2ZXJzYWxVdGlsLmFwcGx5TnVsbGFibGUoKFMpIHRoaXMuZ2V0U2NvcGVWYWx1ZShQb3AubGFzdCwgc2VsZWN0S2V5c0l0ZXJhdG9yLm5leHQoKSwgdHJhdmVyc2VyKSwgdGhpcy50cmF2ZXJzYWxSaW5nLm5leHQoKSkpOworICAgICAgICAgICAgcHJlZGljYXRlLnNldFZhbHVlKFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZSgoUykgdGhpcy5nZXRTYWZlU2NvcGVWYWx1ZShQb3AubGFzdCwgc2VsZWN0S2V5c0l0ZXJhdG9yLm5leHQoKSwgdHJhdmVyc2VyKSwgdGhpcy50cmF2ZXJzYWxSaW5nLm5leHQoKSkpOwogICAgIH0KIAogICAgIHB1YmxpYyBPcHRpb25hbDxQPD8+PiBnZXRQcmVkaWNhdGUoKSB7CkBAIC05OSw3ICs5OCw3IEBACiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsdGVyKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpIHsKICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gbnVsbCA9PSB0aGlzLnN0YXJ0S2V5ID8KICAgICAgICAgICAgICAgICBUcmF2ZXJzYWxVdGlsLmFwcGx5TnVsbGFibGUodHJhdmVyc2VyLCB0aGlzLnRyYXZlcnNhbFJpbmcubmV4dCgpKSA6Ci0gICAgICAgICAgICAgICAgVHJhdmVyc2FsVXRpbC5hcHBseU51bGxhYmxlKChTKSB0aGlzLmdldFNjb3BlVmFsdWUoUG9wLmxhc3QsIHRoaXMuc3RhcnRLZXksIHRyYXZlcnNlciksIHRoaXMudHJhdmVyc2FsUmluZy5uZXh0KCkpOworICAgICAgICAgICAgICAgIFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZSgoUykgdGhpcy5nZXRTYWZlU2NvcGVWYWx1ZShQb3AubGFzdCwgdGhpcy5zdGFydEtleSwgdHJhdmVyc2VyKSwgdGhpcy50cmF2ZXJzYWxSaW5nLm5leHQoKSk7CiAgICAgICAgIHRoaXMuc2V0UHJlZGljYXRlVmFsdWVzKHRoaXMucHJlZGljYXRlLCB0cmF2ZXJzZXIsIHRoaXMuc2VsZWN0S2V5cy5pdGVyYXRvcigpKTsKICAgICAgICAgdGhpcy50cmF2ZXJzYWxSaW5nLnJlc2V0KCk7CiAgICAgICAgIHJldHVybiB0aGlzLnByZWRpY2F0ZS50ZXN0KHZhbHVlKTsKQEAgLTE2NCw0ICsxNjMsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBtb2R1bGF0ZUJ5KGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiB0cmF2ZXJzYWwpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMudHJhdmVyc2FsUmluZy5hZGRUcmF2ZXJzYWwodGhpcy5pbnRlZ3JhdGVDaGlsZCh0cmF2ZXJzYWwpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTG9jYWxDaGlsZChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gb2xkVHJhdmVyc2FsLCBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gbmV3VHJhdmVyc2FsKSB7CisgICAgICAgIHRoaXMudHJhdmVyc2FsUmluZy5yZXBsYWNlVHJhdmVyc2FsKAorICAgICAgICAgICAgICAgIChUcmF2ZXJzYWwuQWRtaW4pIG9sZFRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAoVHJhdmVyc2FsLkFkbWluKSBuZXdUcmF2ZXJzYWwpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvV2hlcmVUcmF2ZXJzYWxTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL1doZXJlVHJhdmVyc2FsU3RlcC5qYXZhCmluZGV4IDM4NGJiY2UuLjI2NDU3NWQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvV2hlcmVUcmF2ZXJzYWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9XaGVyZVRyYXZlcnNhbFN0ZXAuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5QYXRoUHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5TY29waW5nOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5UcmF2ZXJzYWxQYXJlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5NYXBTdGVwOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuU2NhbGFyTWFwU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5TdGFydFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuUHJvZmlsZVN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLkNvbm5lY3RpdmVTdHJhdGVneTsKQEAgLTE0OSw3ICsxNDksNyBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdoZXJlU3RhcnRTdGVwPFM+IGV4dGVuZHMgTWFwU3RlcDxTLCBPYmplY3Q+IGltcGxlbWVudHMgU2NvcGluZyB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaGVyZVN0YXJ0U3RlcDxTPiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgT2JqZWN0PiBpbXBsZW1lbnRzIFNjb3BpbmcgewogCiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHNlbGVjdEtleTsKIApAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgICAgICAgICAgKChXaGVyZUVuZFN0ZXApIHRoaXMuZ2V0VHJhdmVyc2FsKCkuZ2V0RW5kU3RlcCgpKS5wcm9jZXNzU3RhcnRUcmF2ZXJzZXIodHJhdmVyc2VyKTsKICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZ2V0VHJhdmVyc2FsKCkuZ2V0RW5kU3RlcCgpIGluc3RhbmNlb2YgUHJvZmlsZVN0ZXAgJiYgdGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRFbmRTdGVwKCkuZ2V0UHJldmlvdXNTdGVwKCkgaW5zdGFuY2VvZiBXaGVyZUVuZFN0ZXApICAgICAvLyBUT1RBTCBTVUNLWSBIQUNLIQogICAgICAgICAgICAgICAgICgoV2hlcmVFbmRTdGVwKSB0aGlzLmdldFRyYXZlcnNhbCgpLmdldEVuZFN0ZXAoKS5nZXRQcmV2aW91c1N0ZXAoKSkucHJvY2Vzc1N0YXJ0VHJhdmVyc2VyKHRyYXZlcnNlcik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSB0aGlzLnNlbGVjdEtleSA/IHRyYXZlcnNlci5nZXQoKSA6IHRoaXMuZ2V0U2NvcGVWYWx1ZShQb3AubGFzdCwgdGhpcy5zZWxlY3RLZXksIHRyYXZlcnNlcik7CisgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSB0aGlzLnNlbGVjdEtleSA/IHRyYXZlcnNlci5nZXQoKSA6IHRoaXMuZ2V0U2FmZVNjb3BlVmFsdWUoUG9wLmxhc3QsIHRoaXMuc2VsZWN0S2V5LCB0cmF2ZXJzZXIpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0xOTksNyArMTk5LDcgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzU3RhcnRUcmF2ZXJzZXIoZmluYWwgVHJhdmVyc2VyLkFkbWluIHRyYXZlcnNlcikgewogICAgICAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5tYXRjaEtleSkKLSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoVmFsdWUgPSB0aGlzLmdldFNjb3BlVmFsdWUoUG9wLmxhc3QsIHRoaXMubWF0Y2hLZXksIHRyYXZlcnNlcik7CisgICAgICAgICAgICAgICAgdGhpcy5tYXRjaFZhbHVlID0gdGhpcy5nZXRTYWZlU2NvcGVWYWx1ZShQb3AubGFzdCwgdGhpcy5tYXRjaEtleSwgdHJhdmVyc2VyKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRFZGdlU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRFZGdlU3RlcC5qYXZhCmluZGV4IDU1ZDA4NjYuLjE0ZmFhMmMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkRWRnZVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0FkZEVkZ2VTdGVwLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQogICovCi1wdWJsaWMgY2xhc3MgQWRkRWRnZVN0ZXA8Uz4gZXh0ZW5kcyBNYXBTdGVwPFMsIEVkZ2U+CitwdWJsaWMgY2xhc3MgQWRkRWRnZVN0ZXA8Uz4gZXh0ZW5kcyBTY2FsYXJNYXBTdGVwPFMsIEVkZ2U+CiAgICAgICAgIGltcGxlbWVudHMgTXV0YXRpbmc8RXZlbnQuRWRnZUFkZGVkRXZlbnQ+LCBUcmF2ZXJzYWxQYXJlbnQsIFNjb3BpbmcsIEZyb21Ub01vZHVsYXRpbmcgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZST00gPSBHcmFwaC5IaWRkZW4uaGlkZSgiZnJvbSIpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRWZXJ0ZXhTdGFydFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkVmVydGV4U3RhcnRTdGVwLmphdmEKaW5kZXggMjE4MjkyMS4uNTRjZTk2MiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRWZXJ0ZXhTdGFydFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0FkZFZlcnRleFN0YXJ0U3RlcC5qYXZhCkBAIC01MywxMiArNTMsMTIgQEAKIAogICAgIHB1YmxpYyBBZGRWZXJ0ZXhTdGFydFN0ZXAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbCwgZmluYWwgU3RyaW5nIGxhYmVsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQodGhpcywgVC5sYWJlbCwgbGFiZWwpOworICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHRoaXMsIFQubGFiZWwsIG51bGwgPT0gbGFiZWwgPyBWZXJ0ZXguREVGQVVMVF9MQUJFTCA6IGxhYmVsKTsKICAgICB9CiAKICAgICBwdWJsaWMgQWRkVmVydGV4U3RhcnRTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbDw/LCBTdHJpbmc+IHZlcnRleExhYmVsVHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQodGhpcywgVC5sYWJlbCwgdmVydGV4TGFiZWxUcmF2ZXJzYWwpOworICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHRoaXMsIFQubGFiZWwsIG51bGwgPT0gdmVydGV4TGFiZWxUcmF2ZXJzYWwgPyBWZXJ0ZXguREVGQVVMVF9MQUJFTCA6IHZlcnRleExhYmVsVHJhdmVyc2FsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTc4LDcgKzc4LDIwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgT2JqZWN0Li4uIGtleVZhbHVlcykgewotICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHRoaXMsIGtleVZhbHVlcyk7CisgICAgICAgIGlmIChrZXlWYWx1ZXNbMF0gPT0gVC5sYWJlbCAmJiB0aGlzLnBhcmFtZXRlcnMuY29udGFpbnMoVC5sYWJlbCkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtZXRlcnMuY29udGFpbnMoVC5sYWJlbCwgVmVydGV4LkRFRkFVTFRfTEFCRUwpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnJlbW92ZShULmxhYmVsKTsKKyAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHRoaXMsIGtleVZhbHVlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVmVydGV4IFQubGFiZWwgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gWyVzXSBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4gd2l0aCBbJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5nZXRSYXcoKS5nZXQoVC5sYWJlbCkuZ2V0KDApLCBrZXlWYWx1ZXNbMV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChrZXlWYWx1ZXNbMF0gPT0gVC5pZCAmJiB0aGlzLnBhcmFtZXRlcnMuY29udGFpbnMoVC5pZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVmVydGV4IFQuaWQgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gWyVzXSBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4gd2l0aCBbJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLmdldFJhdygpLmdldChULmlkKS5nZXQoMCksIGtleVZhbHVlc1sxXSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldCh0aGlzLCBrZXlWYWx1ZXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0FkZFZlcnRleFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkVmVydGV4U3RlcC5qYXZhCmluZGV4IGE2MDk0MjIuLjM0M2M0NGIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkVmVydGV4U3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkVmVydGV4U3RlcC5qYXZhCkBAIC00MCw3ICs0MCw3IEBACiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKICAqLwotcHVibGljIGNsYXNzIEFkZFZlcnRleFN0ZXA8Uz4gZXh0ZW5kcyBNYXBTdGVwPFMsIFZlcnRleD4KK3B1YmxpYyBjbGFzcyBBZGRWZXJ0ZXhTdGVwPFM+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxTLCBWZXJ0ZXg+CiAgICAgICAgIGltcGxlbWVudHMgTXV0YXRpbmc8RXZlbnQuVmVydGV4QWRkZWRFdmVudD4sIFRyYXZlcnNhbFBhcmVudCwgU2NvcGluZyB7CiAKICAgICBwcml2YXRlIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCk7CkBAIC00OCwxMiArNDgsMTIgQEAKIAogICAgIHB1YmxpYyBBZGRWZXJ0ZXhTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwsIGZpbmFsIFN0cmluZyBsYWJlbCkgewogICAgICAgICBzdXBlcih0cmF2ZXJzYWwpOwotICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHRoaXMsIFQubGFiZWwsIGxhYmVsKTsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldCh0aGlzLCBULmxhYmVsLCBudWxsID09IGxhYmVsID8gVmVydGV4LkRFRkFVTFRfTEFCRUwgOiBsYWJlbCk7CiAgICAgfQogCiAgICAgcHVibGljIEFkZFZlcnRleFN0ZXAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPFMsU3RyaW5nPiB2ZXJ0ZXhMYWJlbFRyYXZlcnNhbCkgewogICAgICAgICBzdXBlcih0cmF2ZXJzYWwpOwotICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHRoaXMsIFQubGFiZWwsIHZlcnRleExhYmVsVHJhdmVyc2FsKTsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldCh0aGlzLCBULmxhYmVsLCBudWxsID09IHZlcnRleExhYmVsVHJhdmVyc2FsID8gVmVydGV4LkRFRkFVTFRfTEFCRUwgOiB2ZXJ0ZXhMYWJlbFRyYXZlcnNhbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC03Myw3ICs3MywyMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIE9iamVjdC4uLiBrZXlWYWx1ZXMpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldCh0aGlzLCBrZXlWYWx1ZXMpOworICAgICAgICBpZiAoa2V5VmFsdWVzWzBdID09IFQubGFiZWwgJiYgdGhpcy5wYXJhbWV0ZXJzLmNvbnRhaW5zKFQubGFiZWwpKSB7CisgICAgICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzLmNvbnRhaW5zKFQubGFiZWwsIFZlcnRleC5ERUZBVUxUX0xBQkVMKSkgeworICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5yZW1vdmUoVC5sYWJlbCk7CisgICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldCh0aGlzLCBrZXlWYWx1ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlZlcnRleCBULmxhYmVsIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvIFslc10gYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuIHdpdGggWyVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuZ2V0UmF3KCkuZ2V0KFQubGFiZWwpLmdldCgwKSwga2V5VmFsdWVzWzFdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoa2V5VmFsdWVzWzBdID09IFQuaWQgJiYgdGhpcy5wYXJhbWV0ZXJzLmNvbnRhaW5zKFQuaWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlZlcnRleCBULmlkIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvIFslc10gYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuIHdpdGggWyVzXSIsCisgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5nZXRSYXcoKS5nZXQoVC5pZCkuZ2V0KDApLCBrZXlWYWx1ZXNbMV0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQodGhpcywga2V5VmFsdWVzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Db25zdGFudFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQ29uc3RhbnRTdGVwLmphdmEKaW5kZXggNzQ5ZGUzMS4uOTQzNGNjMyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Db25zdGFudFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0NvbnN0YW50U3RlcC5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotcHVibGljIGNsYXNzIENvbnN0YW50U3RlcDxTLCBFPiBleHRlbmRzIE1hcFN0ZXA8UywgRT4geworcHVibGljIGNsYXNzIENvbnN0YW50U3RlcDxTLCBFPiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgRT4gewogCiAgICAgcHJpdmF0ZSBmaW5hbCBFIGNvbnN0YW50OwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0NvdW50TG9jYWxTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0NvdW50TG9jYWxTdGVwLmphdmEKaW5kZXggODdiNjk5ZC4uMjVlNzVlNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Db3VudExvY2FsU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQ291bnRMb2NhbFN0ZXAuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKiBAYXV0aG9yIERhbmllbCBLdXBwaXR6IChodHRwOi8vZ3JlbWxpbi5ndXJ1KQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ291bnRMb2NhbFN0ZXA8Uz4gZXh0ZW5kcyBNYXBTdGVwPFMsIExvbmc+IHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb3VudExvY2FsU3RlcDxTPiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgTG9uZz4gewogCiAgICAgcHVibGljIENvdW50TG9jYWxTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwpIHsKICAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvRGVkdXBMb2NhbFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvRGVkdXBMb2NhbFN0ZXAuamF2YQppbmRleCA1OWM2NmM3Li40ZDc1MjcwIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0RlZHVwTG9jYWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9EZWR1cExvY2FsU3RlcC5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAvKioKICAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWR1cExvY2FsU3RlcDxFLCBTIGV4dGVuZHMgSXRlcmFibGU8RT4+IGV4dGVuZHMgTWFwU3RlcDxTLCBTZXQ8RT4+IHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWR1cExvY2FsU3RlcDxFLCBTIGV4dGVuZHMgSXRlcmFibGU8RT4+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxTLCBTZXQ8RT4+IHsKIAogICAgIHB1YmxpYyBEZWR1cExvY2FsU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0VkZ2VPdGhlclZlcnRleFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvRWRnZU90aGVyVmVydGV4U3RlcC5qYXZhCmluZGV4IGE1M2RkNTAuLjBkMTUxZDAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvRWRnZU90aGVyVmVydGV4U3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvRWRnZU90aGVyVmVydGV4U3RlcC5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgY2xhc3MgRWRnZU90aGVyVmVydGV4U3RlcCBleHRlbmRzIE1hcFN0ZXA8RWRnZSwgVmVydGV4PiBpbXBsZW1lbnRzIENvbmZpZ3VyaW5nIHsKK3B1YmxpYyBjbGFzcyBFZGdlT3RoZXJWZXJ0ZXhTdGVwIGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxFZGdlLCBWZXJ0ZXg+IGltcGxlbWVudHMgQ29uZmlndXJpbmcgewogICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVycygpOwogCiAgICAgcHVibGljIEVkZ2VPdGhlclZlcnRleFN0ZXAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbCkgewpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9FbGVtZW50TWFwU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9FbGVtZW50TWFwU3RlcC5qYXZhCmluZGV4IDJmMWRiNDMuLjE2NTRhYTEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvRWxlbWVudE1hcFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0VsZW1lbnRNYXBTdGVwLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCiAgKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCiAgKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TWFwU3RlcDxLLEU+IGV4dGVuZHMgTWFwU3RlcDxFbGVtZW50LCBNYXA8SywgRT4+IGltcGxlbWVudHMgVHJhdmVyc2FsUGFyZW50LCBHcmFwaENvbXB1dGluZyB7CitwdWJsaWMgY2xhc3MgRWxlbWVudE1hcFN0ZXA8SyxFPiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8RWxlbWVudCwgTWFwPEssIEU+PiBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgR3JhcGhDb21wdXRpbmcgewogCiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHByb3BlcnR5S2V5czsKICAgICBwcml2YXRlIGJvb2xlYW4gb25HcmFwaENvbXB1dGVyID0gZmFsc2U7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0dyb3VwQ291bnRTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0dyb3VwQ291bnRTdGVwLmphdmEKaW5kZXggYTBjMDJmZC4uZTY3OTI0MCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Hcm91cENvdW50U3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvR3JvdXBDb3VudFN0ZXAuamF2YQpAQCAtNzksNiArNzksMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTG9jYWxDaGlsZChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gb2xkVHJhdmVyc2FsLCBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gbmV3VHJhdmVyc2FsKSB7CisgICAgICAgIGlmIChudWxsICE9IHRoaXMua2V5VHJhdmVyc2FsICYmIHRoaXMua2V5VHJhdmVyc2FsLmVxdWFscyhvbGRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgdGhpcy5rZXlUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKG5ld1RyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEdyb3VwQ291bnRTdGVwPFMsIEU+IGNsb25lKCkgewogICAgICAgICBmaW5hbCBHcm91cENvdW50U3RlcDxTLCBFPiBjbG9uZSA9IChHcm91cENvdW50U3RlcDxTLCBFPikgc3VwZXIuY2xvbmUoKTsKICAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5rZXlUcmF2ZXJzYWwpCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0dyb3VwU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Hcm91cFN0ZXAuamF2YQppbmRleCBmYjBiZjNhLi4yMjEzYjJlIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0dyb3VwU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvR3JvdXBTdGVwLmphdmEKQEAgLTIwLDIxICsyMCwxNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5PcGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuQ29sdW1uVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLkVsZW1lbnRWYWx1ZVRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5GdW5jdGlvblRyYXZlcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5JZGVudGl0eVRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5Ub2tlblRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuR3JvdXBpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlByb2ZpbGluZ0F3YXJlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CeU1vZHVsYXRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLkxvY2FsQmFycmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CYXJyaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0Lkdyb3VwU2lkZUVmZmVjdFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuUHJvZmlsZVN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuUmVkdWNpbmdCYXJyaWVyU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKQEAgLTUzLDcgKzQ2LDggQEAKIC8qKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcm91cFN0ZXA8UywgSywgVj4gZXh0ZW5kcyBSZWR1Y2luZ0JhcnJpZXJTdGVwPFMsIE1hcDxLLCBWPj4gaW1wbGVtZW50cyBCeU1vZHVsYXRpbmcsIFRyYXZlcnNhbFBhcmVudCwgUHJvZmlsaW5nQXdhcmUgeworcHVibGljIGZpbmFsIGNsYXNzIEdyb3VwU3RlcDxTLCBLLCBWPiBleHRlbmRzIFJlZHVjaW5nQmFycmllclN0ZXA8UywgTWFwPEssIFY+PgorICAgICAgICBpbXBsZW1lbnRzIEJ5TW9kdWxhdGluZywgVHJhdmVyc2FsUGFyZW50LCBQcm9maWxpbmdBd2FyZSwgR3JvdXBpbmc8UywgSywgVj4gewogCiAgICAgcHJpdmF0ZSBjaGFyIHN0YXRlID0gJ2snOwogICAgIHByaXZhdGUgVHJhdmVyc2FsLkFkbWluPFMsIEs+IGtleVRyYXZlcnNhbDsKQEAgLTcwLDMxICs2NCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB0aGUgZmlyc3QgKG5vbi1sb2NhbCkgYmFycmllciBzdGVwIGluIHRoZSBwcm92aWRlZCB0cmF2ZXJzYWwuIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkge0BsaW5rIEdyb3VwU3RlcH0KLSAgICAgKiBhbmQge0BsaW5rIEdyb3VwU2lkZUVmZmVjdFN0ZXB9IHRvIHVsdGltYXRlbHkgZGV0ZXJtaW5lIHRoZSByZWR1Y2luZyBiaS1vcGVyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmF2ZXJzYWwgVGhlIHRyYXZlcnNhbCB0byBpbnNwZWN0LgotICAgICAqIEByZXR1cm4gVGhlIGZpcnN0IG5vbi1sb2NhbCBiYXJyaWVyIHN0ZXAgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHN1Y2ggc3RlcCB3YXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8UywgVj4gQmFycmllciBkZXRlcm1pbmVCYXJyaWVyU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48UywgVj4gdHJhdmVyc2FsKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RlcD4gc3RlcHMgPSB0cmF2ZXJzYWwuZ2V0U3RlcHMoKTsKLSAgICAgICAgZm9yIChpbnQgaXggPSAwOyBpeCA8IHN0ZXBzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgZmluYWwgU3RlcCBzdGVwID0gc3RlcHMuZ2V0KGl4KTsKLSAgICAgICAgICAgIGlmIChzdGVwIGluc3RhbmNlb2YgQmFycmllciAmJiAhKHN0ZXAgaW5zdGFuY2VvZiBMb2NhbEJhcnJpZXIpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQmFycmllciBiID0gKEJhcnJpZXIpIHN0ZXA7Ci0KLSAgICAgICAgICAgICAgICAvLyB3aGVuIHByb2ZpbGUoKSBpcyBlbmFibGVkIHRoZSBzdGVwIG5lZWRzIHRvIGJlIHdyYXBwZWQgdXAgd2l0aCB0aGUgYmFycmllciBzbyB0aGF0IHRoZSB0aW1lciBvbgotICAgICAgICAgICAgICAgIC8vIHRoZSBQcm9maWxlU3RlcCBpcyBwcm9wZXJseSB0cmlnZ2VyZWQKLSAgICAgICAgICAgICAgICBpZiAoaXggPCBzdGVwcy5zaXplKCkgLSAxICYmIHN0ZXBzLmdldChpeCArIDEpIGluc3RhbmNlb2YgUHJvZmlsZVN0ZXApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvZmlsaW5nQXdhcmUuUHJvZmlsZWRCYXJyaWVyKGIsIChQcm9maWxlU3RlcCkgc3RlcHMuZ2V0KGl4ICsgMSkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmVzZXQgdGhlIHtAbGluayBCYXJyaWVyfSBvbiB0aGUgc3RlcCB0byBiZSB3cmFwcGVkIGluIGEge0BsaW5rIFByb2ZpbGVkQmFycmllcn0gd2hpY2ggY2FuIHByb3Blcmx5IHN0YXJ0L3N0b3AKICAgICAgKiB0aGUgdGltZXIgb24gdGhlIGFzc29jaWF0ZWQge0BsaW5rIFByb2ZpbGVTdGVwfS4KICAgICAgKi8KQEAgLTEwNCwxNCArNzMsMjggQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHJhdmVyc2FsLkFkbWluPFMsIEs+IGdldEtleVRyYXZlcnNhbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMua2V5VHJhdmVyc2FsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUcmF2ZXJzYWwuQWRtaW48UywgVj4gZ2V0VmFsdWVUcmF2ZXJzYWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnZhbHVlVHJhdmVyc2FsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZVRyYXZlcnNhbChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4ga3ZUcmF2ZXJzYWwpIHsKKyAgICAgICAgdGhpcy52YWx1ZVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQoY29udmVydFZhbHVlVHJhdmVyc2FsKGt2VHJhdmVyc2FsKSk7CisgICAgICAgIHRoaXMuYmFycmllclN0ZXAgPSBkZXRlcm1pbmVCYXJyaWVyU3RlcCh0aGlzLnZhbHVlVHJhdmVyc2FsKTsKKyAgICAgICAgdGhpcy5zZXRSZWR1Y2luZ0JpT3BlcmF0b3IobmV3IEdyb3VwQmlPcGVyYXRvcjw+KG51bGwgPT0gdGhpcy5iYXJyaWVyU3RlcCA/IE9wZXJhdG9yLmFzc2lnbiA6IHRoaXMuYmFycmllclN0ZXAuZ2V0TWVtb3J5Q29tcHV0ZUtleSgpLmdldFJlZHVjZXIoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1vZHVsYXRlQnkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IGt2VHJhdmVyc2FsKSB7CiAgICAgICAgIGlmICgnaycgPT0gdGhpcy5zdGF0ZSkgewogICAgICAgICAgICAgdGhpcy5rZXlUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKGt2VHJhdmVyc2FsKTsKICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAndic7CiAgICAgICAgIH0gZWxzZSBpZiAoJ3YnID09IHRoaXMuc3RhdGUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWVUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKGNvbnZlcnRWYWx1ZVRyYXZlcnNhbChrdlRyYXZlcnNhbCkpOwotICAgICAgICAgICAgdGhpcy5iYXJyaWVyU3RlcCA9IGRldGVybWluZUJhcnJpZXJTdGVwKHRoaXMudmFsdWVUcmF2ZXJzYWwpOwotICAgICAgICAgICAgdGhpcy5zZXRSZWR1Y2luZ0JpT3BlcmF0b3IobmV3IEdyb3VwQmlPcGVyYXRvcjw+KG51bGwgPT0gdGhpcy5iYXJyaWVyU3RlcCA/IE9wZXJhdG9yLmFzc2lnbiA6IHRoaXMuYmFycmllclN0ZXAuZ2V0TWVtb3J5Q29tcHV0ZUtleSgpLmdldFJlZHVjZXIoKSkpOworICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZVRyYXZlcnNhbChrdlRyYXZlcnNhbCk7CiAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ3gnOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGtleSBhbmQgdmFsdWUgdHJhdmVyc2FscyBmb3IgZ3JvdXAoKS1zdGVwIGhhdmUgYWxyZWFkeSBiZWVuIHNldDogIiArIHRoaXMpOwpAQCAtMTE5LDYgKzEwMiwxNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VMb2NhbENoaWxkKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBvbGRUcmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBuZXdUcmF2ZXJzYWwpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5rZXlUcmF2ZXJzYWwgJiYgdGhpcy5rZXlUcmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpCisgICAgICAgICAgICB0aGlzLmtleVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQobmV3VHJhdmVyc2FsKTsKKyAgICAgICAgZWxzZSBpZiAobnVsbCAhPSB0aGlzLnZhbHVlVHJhdmVyc2FsICYmIHRoaXMudmFsdWVUcmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpCisgICAgICAgICAgICB0aGlzLnNldFZhbHVlVHJhdmVyc2FsKG5ld1RyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1hcDxLLCBWPiBwcm9qZWN0VHJhdmVyc2VyKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpIHsKICAgICAgICAgZmluYWwgTWFwPEssIFY+IG1hcCA9IG5ldyBIYXNoTWFwPD4oMSk7CiAgICAgICAgIHRoaXMudmFsdWVUcmF2ZXJzYWwucmVzZXQoKTsKQEAgLTE4Nyw3ICsxNzgsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1hcDxLLCBWPiBnZW5lcmF0ZUZpbmFsUmVzdWx0KGZpbmFsIE1hcDxLLCBWPiBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIEdyb3VwU3RlcC5kb0ZpbmFsUmVkdWN0aW9uKChNYXA8SywgT2JqZWN0Pikgb2JqZWN0LCB0aGlzLnZhbHVlVHJhdmVyc2FsKTsKKyAgICAgICAgcmV0dXJuIGRvRmluYWxSZWR1Y3Rpb24oKE1hcDxLLCBPYmplY3Q+KSBvYmplY3QsIHRoaXMudmFsdWVUcmF2ZXJzYWwpOwogICAgIH0KIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yMTgsMzEgKzIwOSw0IEBACiAgICAgICAgICAgICByZXR1cm4gbWFwQTsKICAgICAgICAgfQogICAgIH0KLQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgPFMsIEU+IFRyYXZlcnNhbC5BZG1pbjxTLCBFPiBjb252ZXJ0VmFsdWVUcmF2ZXJzYWwoZmluYWwgVHJhdmVyc2FsLkFkbWluPFMsIEU+IHZhbHVlVHJhdmVyc2FsKSB7Ci0gICAgICAgIGlmICh2YWx1ZVRyYXZlcnNhbCBpbnN0YW5jZW9mIEVsZW1lbnRWYWx1ZVRyYXZlcnNhbCB8fAotICAgICAgICAgICAgICAgIHZhbHVlVHJhdmVyc2FsIGluc3RhbmNlb2YgVG9rZW5UcmF2ZXJzYWwgfHwKLSAgICAgICAgICAgICAgICB2YWx1ZVRyYXZlcnNhbCBpbnN0YW5jZW9mIElkZW50aXR5VHJhdmVyc2FsIHx8Ci0gICAgICAgICAgICAgICAgdmFsdWVUcmF2ZXJzYWwgaW5zdGFuY2VvZiBDb2x1bW5UcmF2ZXJzYWwgfHwKLSAgICAgICAgICAgICAgICB2YWx1ZVRyYXZlcnNhbC5nZXRTdGFydFN0ZXAoKSBpbnN0YW5jZW9mIExhbWJkYU1hcFN0ZXAgJiYgKChMYW1iZGFNYXBTdGVwKSB2YWx1ZVRyYXZlcnNhbC5nZXRTdGFydFN0ZXAoKSkuZ2V0TWFwRnVuY3Rpb24oKSBpbnN0YW5jZW9mIEZ1bmN0aW9uVHJhdmVyc2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRyYXZlcnNhbC5BZG1pbjxTLCBFPikgX18ubWFwKHZhbHVlVHJhdmVyc2FsKS5mb2xkKCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlVHJhdmVyc2FsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBkb0ZpbmFsUmVkdWN0aW9uKGZpbmFsIE1hcDxLLCBPYmplY3Q+IG1hcCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sIFY+IHZhbHVlVHJhdmVyc2FsKSB7Ci0gICAgICAgIGZpbmFsIEJhcnJpZXIgYmFycmllclN0ZXAgPSBkZXRlcm1pbmVCYXJyaWVyU3RlcCh2YWx1ZVRyYXZlcnNhbCk7Ci0gICAgICAgIGlmIChiYXJyaWVyU3RlcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIEsga2V5IDogbWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVUcmF2ZXJzYWwucmVzZXQoKTsKLSAgICAgICAgICAgICAgICBiYXJyaWVyU3RlcC5hZGRCYXJyaWVyKG1hcC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlVHJhdmVyc2FsLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlVHJhdmVyc2FsLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChNYXA8SywgVj4pIG1hcDsKLSAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9JZFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvSWRTdGVwLmphdmEKaW5kZXggMDE4YzkxZS4uYzVlYjdjNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9JZFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0lkU3RlcC5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSWRTdGVwPFMgZXh0ZW5kcyBFbGVtZW50PiBleHRlbmRzIE1hcFN0ZXA8UywgT2JqZWN0PiB7CitwdWJsaWMgZmluYWwgY2xhc3MgSWRTdGVwPFMgZXh0ZW5kcyBFbGVtZW50PiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgT2JqZWN0PiB7CiAKICAgICBwdWJsaWMgSWRTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwpIHsKICAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvSW5kZXhTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0luZGV4U3RlcC5qYXZhCmluZGV4IGI5MDNjMTUuLjMxNGU3NTEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvSW5kZXhTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9JbmRleFN0ZXAuamF2YQpAQCAtNDAsNyArNDAsNyBAQAogLyoqCiAgKiBAYXV0aG9yIERhbmllbCBLdXBwaXR6IChodHRwOi8vZ3JlbWxpbi5ndXJ1KQogICovCi1wdWJsaWMgY2xhc3MgSW5kZXhTdGVwPFMsIEU+IGV4dGVuZHMgTWFwU3RlcDxTLCBFPiBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgQ29uZmlndXJpbmcgeworcHVibGljIGNsYXNzIEluZGV4U3RlcDxTLCBFPiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgRT4gaW1wbGVtZW50cyBUcmF2ZXJzYWxQYXJlbnQsIENvbmZpZ3VyaW5nIHsKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJTlZBTElEX0NPTkZJR1VSQVRJT05fRVhDRVBUSU9OID0KICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldpdGhPcHRpb25zLmluZGV4ZXIgcmVxdWlyZXMgYSBzaW5nbGUgSW50ZWdlciBhcmd1bWVudCAocG9zc2libGUgIiArICIiICsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTGFiZWxTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0xhYmVsU3RlcC5qYXZhCmluZGV4IDJiMjMxM2YuLjA2MGRjNjggMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTGFiZWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9MYWJlbFN0ZXAuamF2YQpAQCAtMjksNyArMjksNyBAQAogLyoqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsU3RlcDxTIGV4dGVuZHMgRWxlbWVudD4gZXh0ZW5kcyBNYXBTdGVwPFMsIFN0cmluZz4geworcHVibGljIGZpbmFsIGNsYXNzIExhYmVsU3RlcDxTIGV4dGVuZHMgRWxlbWVudD4gZXh0ZW5kcyBTY2FsYXJNYXBTdGVwPFMsIFN0cmluZz4gewogCiAgICAgcHVibGljIExhYmVsU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0xhbWJkYU1hcFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTGFtYmRhTWFwU3RlcC5qYXZhCmluZGV4IGIyMDI0ZjguLmNlNmExYmQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTGFtYmRhTWFwU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTGFtYmRhTWFwU3RlcC5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFtYmRhTWFwU3RlcDxTLCBFPiBleHRlbmRzIE1hcFN0ZXA8UywgRT4gaW1wbGVtZW50cyBMYW1iZGFIb2xkZXIgeworcHVibGljIGZpbmFsIGNsYXNzIExhbWJkYU1hcFN0ZXA8UywgRT4gZXh0ZW5kcyBTY2FsYXJNYXBTdGVwPFMsIEU+IGltcGxlbWVudHMgTGFtYmRhSG9sZGVyIHsKIAogICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248VHJhdmVyc2VyPFM+LCBFPiBmdW5jdGlvbjsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Mb29wc1N0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTG9vcHNTdGVwLmphdmEKaW5kZXggMTFkODcyOS4uYzNkMmFjOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Mb29wc1N0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0xvb3BzU3RlcC5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiAvKioKICAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMb29wc1N0ZXA8Uz4gZXh0ZW5kcyBNYXBTdGVwPFMsIEludGVnZXI+IHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBMb29wc1N0ZXA8Uz4gZXh0ZW5kcyBTY2FsYXJNYXBTdGVwPFMsIEludGVnZXI+IHsKIAogICAgIHByaXZhdGUgU3RyaW5nIGxvb3BOYW1lOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01hcFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWFwU3RlcC5qYXZhCmluZGV4IDAzZTU0NGUuLjVkNTEwM2MgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWFwU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWFwU3RlcC5qYXZhCkBAIC0xOCwyNiArMTgsMjMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5TdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkFic3RyYWN0U3RlcDsKIAogLyoqCisgKiBBIG1hcmtlciBiYXNlIGNsYXNzIHRoYXQgZGVzaWduYXRlcyBhbiBleHRlbmRpbmcge0BsaW5rIFN0ZXB9IGFzIGEgIk1hcCIgc3RlcCB3aGljaCB3aWxsIHRyYW5zZm9ybSB0aGUgb2JqZWN0IG9mIG9uZQorICoge0BsaW5rIFRyYXZlcnNlcn0gaW50byBhbm90aGVyLiBJbiBtYW55IGNhc2VzLCBpdCBtYXkgYmUgZWFzaWVyIHRvIHNpbXBseSBleHRlbmQgZnJvbSB7QGxpbmsgU2NhbGFyTWFwU3RlcH0gd2hpY2gKKyAqIGhhcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBwYXR0ZXJuLgorICoKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQorICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwU3RlcDxTLCBFPiBleHRlbmRzIEFic3RyYWN0U3RlcDxTLCBFPiB7CiAKICAgICBwdWJsaWMgTWFwU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFRyYXZlcnNlci5BZG1pbjxFPiBwcm9jZXNzTmV4dFN0YXJ0KCkgewotICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyID0gdGhpcy5zdGFydHMubmV4dCgpOwotICAgICAgICByZXR1cm4gdHJhdmVyc2VyLnNwbGl0KHRoaXMubWFwKHRyYXZlcnNlciksIHRoaXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFIG1hcChmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyKTsKLQogfQogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01hdGhTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01hdGhTdGVwLmphdmEKaW5kZXggN2E0ODNhMS4uMTQ5ZjY3YSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9NYXRoU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWF0aFN0ZXAuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogLyoqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hdGhTdGVwPFM+IGV4dGVuZHMgTWFwU3RlcDxTLCBEb3VibGU+IGltcGxlbWVudHMgQnlNb2R1bGF0aW5nLCBUcmF2ZXJzYWxQYXJlbnQsIFNjb3BpbmcsIFBhdGhQcm9jZXNzb3IgeworcHVibGljIGZpbmFsIGNsYXNzIE1hdGhTdGVwPFM+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxTLCBEb3VibGU+IGltcGxlbWVudHMgQnlNb2R1bGF0aW5nLCBUcmF2ZXJzYWxQYXJlbnQsIFNjb3BpbmcsIFBhdGhQcm9jZXNzb3IgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlQgPSAiXyI7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXF1YXRpb247CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01heExvY2FsU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9NYXhMb2NhbFN0ZXAuamF2YQppbmRleCAzYWQzMjZmLi4xODdhZDM5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01heExvY2FsU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWF4TG9jYWxTdGVwLmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1heExvY2FsU3RlcDxFIGV4dGVuZHMgQ29tcGFyYWJsZSwgUyBleHRlbmRzIEl0ZXJhYmxlPEU+PiBleHRlbmRzIE1hcFN0ZXA8UywgRT4geworcHVibGljIGZpbmFsIGNsYXNzIE1heExvY2FsU3RlcDxFIGV4dGVuZHMgQ29tcGFyYWJsZSwgUyBleHRlbmRzIEl0ZXJhYmxlPEU+PiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgRT4gewogCiAgICAgcHVibGljIE1heExvY2FsU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01lYW5Mb2NhbFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWVhbkxvY2FsU3RlcC5qYXZhCmluZGV4IDkxNDQ3ZmQuLjVmZmIxYTYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWVhbkxvY2FsU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWVhbkxvY2FsU3RlcC5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWFuTG9jYWxTdGVwPEUgZXh0ZW5kcyBOdW1iZXIsIFMgZXh0ZW5kcyBJdGVyYWJsZTxFPj4gZXh0ZW5kcyBNYXBTdGVwPFMsIE51bWJlcj4geworcHVibGljIGZpbmFsIGNsYXNzIE1lYW5Mb2NhbFN0ZXA8RSBleHRlbmRzIE51bWJlciwgUyBleHRlbmRzIEl0ZXJhYmxlPEU+PiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgTnVtYmVyPiB7CiAKICAgICBwdWJsaWMgTWVhbkxvY2FsU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01pbkxvY2FsU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9NaW5Mb2NhbFN0ZXAuamF2YQppbmRleCA0MTM5YTdkLi4zYmRiOTY5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01pbkxvY2FsU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvTWluTG9jYWxTdGVwLmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1pbkxvY2FsU3RlcDxFIGV4dGVuZHMgQ29tcGFyYWJsZSwgUyBleHRlbmRzIEl0ZXJhYmxlPEU+PiBleHRlbmRzIE1hcFN0ZXA8UywgRT4geworcHVibGljIGZpbmFsIGNsYXNzIE1pbkxvY2FsU3RlcDxFIGV4dGVuZHMgQ29tcGFyYWJsZSwgUyBleHRlbmRzIEl0ZXJhYmxlPEU+PiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgRT4gewogCiAgICAgcHVibGljIE1pbkxvY2FsU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyR2xvYmFsU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9PcmRlckdsb2JhbFN0ZXAuamF2YQppbmRleCBjYzdjZWM2Li5hN2Y3ODkyIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyR2xvYmFsU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvT3JkZXJHbG9iYWxTdGVwLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5JZGVudGl0eVRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuQnlNb2R1bGF0aW5nOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5Db21wYXJhdG9ySG9sZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5TZWVkYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkNvbGxlY3RpbmdCYXJyaWVyU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5Qcm9qZWN0ZWRUcmF2ZXJzZXI7CkBAIC00MSw2ICs0Miw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmluYXJ5T3BlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwpAQCAtNDgsMjIgKzUwLDI4IEBACiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3JkZXJHbG9iYWxTdGVwPFMsIEMgZXh0ZW5kcyBDb21wYXJhYmxlPiBleHRlbmRzIENvbGxlY3RpbmdCYXJyaWVyU3RlcDxTPiBpbXBsZW1lbnRzIENvbXBhcmF0b3JIb2xkZXI8UywgQz4sIFRyYXZlcnNhbFBhcmVudCwgQnlNb2R1bGF0aW5nIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBPcmRlckdsb2JhbFN0ZXA8UywgQyBleHRlbmRzIENvbXBhcmFibGU+IGV4dGVuZHMgQ29sbGVjdGluZ0JhcnJpZXJTdGVwPFM+IGltcGxlbWVudHMgQ29tcGFyYXRvckhvbGRlcjxTLCBDPiwgVHJhdmVyc2FsUGFyZW50LCBCeU1vZHVsYXRpbmcsIFNlZWRhYmxlIHsKIAogICAgIHByaXZhdGUgTGlzdDxQYWlyPFRyYXZlcnNhbC5BZG1pbjxTLCBDPiwgQ29tcGFyYXRvcjxDPj4+IGNvbXBhcmF0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBNdWx0aUNvbXBhcmF0b3I8Qz4gbXVsdGlDb21wYXJhdG9yID0gbnVsbDsKICAgICBwcml2YXRlIGxvbmcgbGltaXQgPSBMb25nLk1BWF9WQUxVRTsKKyAgICBwcml2YXRlIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CiAKICAgICBwdWJsaWMgT3JkZXJHbG9iYWxTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwpIHsKICAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldFNlZWQobG9uZyBzZWVkKSB7CisgICAgICAgIHRoaXMucmFuZG9tLnNldFNlZWQoc2VlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYmFycmllckNvbnN1bWVyKGZpbmFsIFRyYXZlcnNlclNldDxTPiB0cmF2ZXJzZXJTZXQpIHsKICAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5tdWx0aUNvbXBhcmF0b3IpIHRoaXMubXVsdGlDb21wYXJhdG9yID0gdGhpcy5jcmVhdGVNdWx0aUNvbXBhcmF0b3IoKTsKICAgICAgICAgLy8KICAgICAgICAgaWYgKHRoaXMubXVsdGlDb21wYXJhdG9yLmlzU2h1ZmZsZSgpKQotICAgICAgICAgICAgdHJhdmVyc2VyU2V0LnNodWZmbGUoKTsKKyAgICAgICAgICAgIHRyYXZlcnNlclNldC5zaHVmZmxlKHJhbmRvbSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHRyYXZlcnNlclNldC5zb3J0KChDb21wYXJhdG9yKSB0aGlzLm11bHRpQ29tcGFyYXRvcik7CiAgICAgfQpAQCAtOTksNiArMTA3LDE5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUxvY2FsQ2hpbGQoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoZmluYWwgUGFpcjxUcmF2ZXJzYWwuQWRtaW48UywgQz4sIENvbXBhcmF0b3I8Qz4+IHBhaXIgOiB0aGlzLmNvbXBhcmF0b3JzKSB7CisgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48UywgQz4gdHJhdmVyc2FsID0gcGFpci5nZXRWYWx1ZTAoKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IHRyYXZlcnNhbCAmJiB0cmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3JzLnNldChpLCBQYWlyLndpdGgodGhpcy5pbnRlZ3JhdGVDaGlsZChuZXdUcmF2ZXJzYWwpLCBwYWlyLmdldFZhbHVlMSgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxQYWlyPFRyYXZlcnNhbC5BZG1pbjxTLCBDPiwgQ29tcGFyYXRvcjxDPj4+IGdldENvbXBhcmF0b3JzKCkgewogICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJhdG9ycy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBQYWlyPD4obmV3IElkZW50aXR5VHJhdmVyc2FsKCksIChDb21wYXJhdG9yKSBPcmRlci5hc2MpKSA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5jb21wYXJhdG9ycyk7CiAgICAgfQpAQCAtMTQ2LDE1ICsxNjcsMTkgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVtb3J5Q29tcHV0ZUtleTxUcmF2ZXJzZXJTZXQ8Uz4+IGdldE1lbW9yeUNvbXB1dGVLZXkoKSB7CiAgICAgICAgIGlmIChudWxsID09IHRoaXMubXVsdGlDb21wYXJhdG9yKSB0aGlzLm11bHRpQ29tcGFyYXRvciA9IHRoaXMuY3JlYXRlTXVsdGlDb21wYXJhdG9yKCk7Ci0gICAgICAgIHJldHVybiBNZW1vcnlDb21wdXRlS2V5Lm9mKHRoaXMuZ2V0SWQoKSwgbmV3IE9yZGVyQmlPcGVyYXRvcjw+KHRoaXMubGltaXQsIHRoaXMubXVsdGlDb21wYXJhdG9yKSwgZmFsc2UsIHRydWUpOworICAgICAgICByZXR1cm4gTWVtb3J5Q29tcHV0ZUtleS5vZih0aGlzLmdldElkKCksIG5ldyBPcmRlckJpT3BlcmF0b3I8Pih0aGlzLmxpbWl0LCB0aGlzLm11bHRpQ29tcGFyYXRvciwgdGhpcy5yYW5kb20pLCBmYWxzZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0ZWRUcmF2ZXJzZXI8UywgT2JqZWN0PiBjcmVhdGVQcm9qZWN0ZWRUcmF2ZXJzZXIoZmluYWwgVHJhdmVyc2VyLkFkbWluPFM+IHRyYXZlcnNlcikgeworICAgICAgICAvLyB0aGlzIHdhcyBQcm9qZWN0ZWRUcmF2ZXJzZXI8UywgQz4gYnV0IHRoZSBwcm9qZWN0aW9uIG1heSBub3QgYmUgQyBpbiB0aGUgY2FzZSBvZiBhIGxhbWJkYSB3aGVyZSBhCisgICAgICAgIC8vIENvbXBhcmFibGUgbWF5IG5vdCBiZSBleHBlY3RlZCBidXQgcmF0aGVyIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBjb21wYXJlZCBpbiBhbnkgd2F5IGdpdmVuIGEgbGFtYmRhLgorICAgICAgICAvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBzdWRkZW5seSBhbiBpc3N1ZSBidXQgSW50ZWxsaWogd291bGQgbm90IGxldCBjZXJ0YWluIHRlc3RzIHBhc3Mgd2l0aG91dCB0aGlzCisgICAgICAgIC8vIGFkanVzdG1lbnQgaGVyZS4KICAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IHByb2plY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KHRoaXMuY29tcGFyYXRvcnMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChmaW5hbCBQYWlyPFRyYXZlcnNhbC5BZG1pbjxTLCBDPiwgQ29tcGFyYXRvcjxDPj4gcGFpciA6IHRoaXMuY29tcGFyYXRvcnMpIHsKICAgICAgICAgICAgIHByb2plY3Rpb25zLmFkZChUcmF2ZXJzYWxVdGlsLmFwcGx5KHRyYXZlcnNlciwgcGFpci5nZXRWYWx1ZTAoKSkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUHJvamVjdGVkVHJhdmVyc2VyPD4odHJhdmVyc2VyLCBwcm9qZWN0aW9ucyk7CisgICAgICAgIHJldHVybiBuZXcgUHJvamVjdGVkVHJhdmVyc2VyKHRyYXZlcnNlciwgcHJvamVjdGlvbnMpOwogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgTXVsdGlDb21wYXJhdG9yPEM+IGNyZWF0ZU11bHRpQ29tcGFyYXRvcigpIHsKQEAgLTE3MSwxNCArMTk2LDE2IEBACiAKICAgICAgICAgcHJpdmF0ZSBsb25nIGxpbWl0OwogICAgICAgICBwcml2YXRlIE11bHRpQ29tcGFyYXRvciBjb21wYXJhdG9yOworICAgICAgICBwcml2YXRlIFJhbmRvbSByYW5kb207CiAKICAgICAgICAgcHJpdmF0ZSBPcmRlckJpT3BlcmF0b3IoKSB7CiAgICAgICAgICAgICAvLyBmb3Igc2VyaWFsaXplcnMgdGhhdCBuZWVkIGEgbm8tYXJnIGNvbnN0cnVjdG9yCiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgT3JkZXJCaU9wZXJhdG9yKGZpbmFsIGxvbmcgbGltaXQsIGZpbmFsIE11bHRpQ29tcGFyYXRvciBtdWx0aUNvbXBhcmF0b3IpIHsKKyAgICAgICAgcHVibGljIE9yZGVyQmlPcGVyYXRvcihmaW5hbCBsb25nIGxpbWl0LCBmaW5hbCBNdWx0aUNvbXBhcmF0b3IgbXVsdGlDb21wYXJhdG9yLCBmaW5hbCBSYW5kb20gcmFuZG9tKSB7CiAgICAgICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CiAgICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBtdWx0aUNvbXBhcmF0b3I7CisgICAgICAgICAgICB0aGlzLnJhbmRvbSA9IHJhbmRvbTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTg2LDcgKzIxMyw3IEBACiAgICAgICAgICAgICBzZXRBLmFkZEFsbChzZXRCKTsKICAgICAgICAgICAgIGlmICh0aGlzLmxpbWl0ICE9IC0xICYmIHNldEEuYnVsa1NpemUoKSA+IHRoaXMubGltaXQpIHsKICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYXJhdG9yLmlzU2h1ZmZsZSgpKQotICAgICAgICAgICAgICAgICAgICBzZXRBLnNodWZmbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0QS5zaHVmZmxlKHJhbmRvbSk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBzZXRBLnNvcnQodGhpcy5jb21wYXJhdG9yKTsKICAgICAgICAgICAgICAgICBsb25nIGNvdW50ZXIgPSAwTDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvT3JkZXJMb2NhbFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvT3JkZXJMb2NhbFN0ZXAuamF2YQppbmRleCA5NWNiNmRiLi5lYjNhNWY4IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyTG9jYWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9PcmRlckxvY2FsU3RlcC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuSWRlbnRpdHlUcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLkJ5TW9kdWxhdGluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuQ29tcGFyYXRvckhvbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuU2VlZGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLlN0cmluZ0ZhY3Rvcnk7CkBAIC0zNywzMCArMzgsMzcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIC8qKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPcmRlckxvY2FsU3RlcDxTLCBDIGV4dGVuZHMgQ29tcGFyYWJsZT4gZXh0ZW5kcyBNYXBTdGVwPFMsIFM+IGltcGxlbWVudHMgQ29tcGFyYXRvckhvbGRlcjxTLCBDPiwgQnlNb2R1bGF0aW5nLCBUcmF2ZXJzYWxQYXJlbnQgeworcHVibGljIGZpbmFsIGNsYXNzIE9yZGVyTG9jYWxTdGVwPFMsIEMgZXh0ZW5kcyBDb21wYXJhYmxlPiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgUz4gaW1wbGVtZW50cyBDb21wYXJhdG9ySG9sZGVyPFMsIEM+LCBCeU1vZHVsYXRpbmcsIFRyYXZlcnNhbFBhcmVudCwgU2VlZGFibGUgewogCiAgICAgcHJpdmF0ZSBMaXN0PFBhaXI8VHJhdmVyc2FsLkFkbWluPFMsIEM+LCBDb21wYXJhdG9yPEM+Pj4gY29tcGFyYXRvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBwcml2YXRlIENoYWluZWRDb21wYXJhdG9yPFMsIEM+IGNoYWluZWRDb21wYXJhdG9yID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CiAKICAgICBwdWJsaWMgT3JkZXJMb2NhbFN0ZXAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbCkgewogICAgICAgICBzdXBlcih0cmF2ZXJzYWwpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0U2VlZChsb25nIHNlZWQpIHsKKyAgICAgICAgdGhpcy5yYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgUyBtYXAoZmluYWwgVHJhdmVyc2VyLkFkbWluPFM+IHRyYXZlcnNlcikgewogICAgICAgICBpZiAobnVsbCA9PSB0aGlzLmNoYWluZWRDb21wYXJhdG9yKQogICAgICAgICAgICAgdGhpcy5jaGFpbmVkQ29tcGFyYXRvciA9IG5ldyBDaGFpbmVkQ29tcGFyYXRvcjw+KGZhbHNlLCB0aGlzLmNvbXBhcmF0b3JzKTsKICAgICAgICAgZmluYWwgUyBzdGFydCA9IHRyYXZlcnNlci5nZXQoKTsKICAgICAgICAgaWYgKHN0YXJ0IGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLSAgICAgICAgICAgIHJldHVybiAoUykgT3JkZXJMb2NhbFN0ZXAuc29ydENvbGxlY3Rpb24oKENvbGxlY3Rpb24pIHN0YXJ0LCB0aGlzLmNoYWluZWRDb21wYXJhdG9yKTsKKyAgICAgICAgICAgIHJldHVybiAoUykgc29ydENvbGxlY3Rpb24oKENvbGxlY3Rpb24pIHN0YXJ0LCB0aGlzLmNoYWluZWRDb21wYXJhdG9yKTsKICAgICAgICAgZWxzZSBpZiAoc3RhcnQgaW5zdGFuY2VvZiBNYXApCi0gICAgICAgICAgICByZXR1cm4gKFMpIE9yZGVyTG9jYWxTdGVwLnNvcnRNYXAoKE1hcCkgc3RhcnQsIHRoaXMuY2hhaW5lZENvbXBhcmF0b3IpOworICAgICAgICAgICAgcmV0dXJuIChTKSBzb3J0TWFwKChNYXApIHN0YXJ0LCB0aGlzLmNoYWluZWRDb21wYXJhdG9yKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwogICAgIH0KQEAgLTgxLDYgKzg5LDE5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUxvY2FsQ2hpbGQoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoZmluYWwgUGFpcjxUcmF2ZXJzYWwuQWRtaW48UywgQz4sIENvbXBhcmF0b3I8Qz4+IHBhaXIgOiB0aGlzLmNvbXBhcmF0b3JzKSB7CisgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48UywgQz4gdHJhdmVyc2FsID0gcGFpci5nZXRWYWx1ZTAoKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IHRyYXZlcnNhbCAmJiB0cmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3JzLnNldChpLCBQYWlyLndpdGgodGhpcy5pbnRlZ3JhdGVDaGlsZChuZXdUcmF2ZXJzYWwpLCBwYWlyLmdldFZhbHVlMSgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxQYWlyPFRyYXZlcnNhbC5BZG1pbjxTLCBDPiwgQ29tcGFyYXRvcjxDPj4+IGdldENvbXBhcmF0b3JzKCkgewogICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJhdG9ycy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBQYWlyPD4obmV3IElkZW50aXR5VHJhdmVyc2FsKCksIChDb21wYXJhdG9yKSBPcmRlci5hc2MpKSA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5jb21wYXJhdG9ycyk7CiAgICAgfQpAQCAtMTI5LDEwICsxNTAsMTAgQEAKIAogICAgIC8vLy8vLy8vLy8vLy8KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIDxBPiBMaXN0PEE+IHNvcnRDb2xsZWN0aW9uKGZpbmFsIENvbGxlY3Rpb248QT4gY29sbGVjdGlvbiwgZmluYWwgQ2hhaW5lZENvbXBhcmF0b3IgY29tcGFyYXRvcikgeworICAgIHByaXZhdGUgPEE+IExpc3Q8QT4gc29ydENvbGxlY3Rpb24oZmluYWwgQ29sbGVjdGlvbjxBPiBjb2xsZWN0aW9uLCBmaW5hbCBDaGFpbmVkQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7CiAgICAgICAgIGlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNTaHVmZmxlKCkpCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZSgoTGlzdCkgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZSgoTGlzdCkgY29sbGVjdGlvbiwgcmFuZG9tKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KChMaXN0KSBjb2xsZWN0aW9uLCBjb21wYXJhdG9yKTsKICAgICAgICAgICAgIHJldHVybiAoTGlzdDxBPikgY29sbGVjdGlvbjsKQEAgLTE0MSwxMCArMTYyLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCA8SywgVj4gTWFwPEssIFY+IHNvcnRNYXAoZmluYWwgTWFwPEssIFY+IG1hcCwgZmluYWwgQ2hhaW5lZENvbXBhcmF0b3IgY29tcGFyYXRvcikgeworICAgIHByaXZhdGUgPEssIFY+IE1hcDxLLCBWPiBzb3J0TWFwKGZpbmFsIE1hcDxLLCBWPiBtYXAsIGZpbmFsIENoYWluZWRDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKICAgICAgICAgZmluYWwgTGlzdDxNYXAuRW50cnk8SywgVj4+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4obWFwLmVudHJ5U2V0KCkpOwogICAgICAgICBpZiAoY29tcGFyYXRvci5pc1NodWZmbGUoKSkKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUoZW50cmllcyk7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKGVudHJpZXMsIHJhbmRvbSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZW50cmllcywgY29tcGFyYXRvcik7CiAgICAgICAgIGZpbmFsIExpbmtlZEhhc2hNYXA8SywgVj4gc29ydGVkTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9QYXRoU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9QYXRoU3RlcC5qYXZhCmluZGV4IGI0OWExZTQuLmNiNjE2Y2UgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUGF0aFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1BhdGhTdGVwLmphdmEKQEAgLTM4LDcgKzM4LDcgQEAKIC8qKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQYXRoU3RlcDxTPiBleHRlbmRzIE1hcFN0ZXA8UywgUGF0aD4gaW1wbGVtZW50cyBUcmF2ZXJzYWxQYXJlbnQsIFBhdGhQcm9jZXNzb3IsIEJ5TW9kdWxhdGluZywgRnJvbVRvTW9kdWxhdGluZyB7CitwdWJsaWMgZmluYWwgY2xhc3MgUGF0aFN0ZXA8Uz4gZXh0ZW5kcyBTY2FsYXJNYXBTdGVwPFMsIFBhdGg+IGltcGxlbWVudHMgVHJhdmVyc2FsUGFyZW50LCBQYXRoUHJvY2Vzc29yLCBCeU1vZHVsYXRpbmcsIEZyb21Ub01vZHVsYXRpbmcgewogCiAgICAgcHJpdmF0ZSBUcmF2ZXJzYWxSaW5nPE9iamVjdCwgT2JqZWN0PiB0cmF2ZXJzYWxSaW5nOwogICAgIHByaXZhdGUgU2V0PFN0cmluZz4ga2VlcExhYmVsczsKQEAgLTk5LDYgKzk5LDEzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUxvY2FsQ2hpbGQoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICB0aGlzLnRyYXZlcnNhbFJpbmcucmVwbGFjZVRyYXZlcnNhbCgKKyAgICAgICAgICAgICAgICAoVHJhdmVyc2FsLkFkbWluPE9iamVjdCwgT2JqZWN0Pikgb2xkVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgIChUcmF2ZXJzYWwuQWRtaW48T2JqZWN0LCBPYmplY3Q+KSBuZXdUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBTdHJpbmdGYWN0b3J5LnN0ZXBTdHJpbmcodGhpcywgdGhpcy50cmF2ZXJzYWxSaW5nKTsKICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb2plY3RTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb2plY3RTdGVwLmphdmEKaW5kZXggM2RkZDRhNi4uYjk3YzhkNiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9qZWN0U3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvamVjdFN0ZXAuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogLyoqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RTdGVwPFMsIEU+IGV4dGVuZHMgTWFwU3RlcDxTLCBNYXA8U3RyaW5nLCBFPj4gaW1wbGVtZW50cyBUcmF2ZXJzYWxQYXJlbnQsIEJ5TW9kdWxhdGluZyB7CitwdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdFN0ZXA8UywgRT4gZXh0ZW5kcyBTY2FsYXJNYXBTdGVwPFMsIE1hcDxTdHJpbmcsIEU+PiBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgQnlNb2R1bGF0aW5nIHsKIAogICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHByb2plY3RLZXlzOwogICAgIHByaXZhdGUgVHJhdmVyc2FsUmluZzxTLCBFPiB0cmF2ZXJzYWxSaW5nOwpAQCAtOTcsNiArOTcsMTMgQEAKICAgICAgICAgdGhpcy50cmF2ZXJzYWxSaW5nLmFkZFRyYXZlcnNhbCh0aGlzLmludGVncmF0ZUNoaWxkKHNlbGVjdFRyYXZlcnNhbCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VMb2NhbENoaWxkKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBvbGRUcmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBuZXdUcmF2ZXJzYWwpIHsKKyAgICAgICAgdGhpcy50cmF2ZXJzYWxSaW5nLnJlcGxhY2VUcmF2ZXJzYWwoCisgICAgICAgICAgICAgICAgKFRyYXZlcnNhbC5BZG1pbjxTLCBFPikgb2xkVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgIChUcmF2ZXJzYWwuQWRtaW48UywgRT4pIG5ld1RyYXZlcnNhbCk7CisgICAgfQorCiAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9qZWN0S2V5cygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdEtleXM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9wZXJ0eUtleVN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvcGVydHlLZXlTdGVwLmphdmEKaW5kZXggZWExZGIyNy4uOWU3YTBhYiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9wZXJ0eUtleVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb3BlcnR5S2V5U3RlcC5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlLZXlTdGVwIGV4dGVuZHMgTWFwU3RlcDxQcm9wZXJ0eSwgU3RyaW5nPiB7CitwdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlLZXlTdGVwIGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxQcm9wZXJ0eSwgU3RyaW5nPiB7CiAKICAgICBwdWJsaWMgUHJvcGVydHlLZXlTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwpIHsKICAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvcGVydHlNYXBTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb3BlcnR5TWFwU3RlcC5qYXZhCmluZGV4IDk4YTI4NGIuLmVjYzgyZjkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvcGVydHlNYXBTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9wZXJ0eU1hcFN0ZXAuamF2YQpAQCAtNDksNyArNDksNyBAQAogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKiBAYXV0aG9yIERhbmllbCBLdXBwaXR6IChodHRwOi8vZ3JlbWxpbi5ndXJ1KQogICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlNYXBTdGVwPEssRT4gZXh0ZW5kcyBNYXBTdGVwPEVsZW1lbnQsIE1hcDxLLCBFPj4KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eU1hcFN0ZXA8SyxFPiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8RWxlbWVudCwgTWFwPEssIEU+PgogICAgICAgICBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgQnlNb2R1bGF0aW5nLCBDb25maWd1cmluZyB7CiAKICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlLZXlzOwpAQCAtNjEsMTUgKzYxLDYgQEAKICAgICBwcml2YXRlIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCk7CiAgICAgcHJpdmF0ZSBUcmF2ZXJzYWxSaW5nPEssIEU+IHRyYXZlcnNhbFJpbmc7CiAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuNC4wLCByZXBsYWNlZCBieSB7QGxpbmsgI1Byb3BlcnR5TWFwU3RlcChUcmF2ZXJzYWwuQWRtaW4sIFByb3BlcnR5VHlwZSwgU3RyaW5nLi4uKX0uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgUHJvcGVydHlNYXBTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwsIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVRva2VucywgZmluYWwgUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSwgZmluYWwgU3RyaW5nLi4uIHByb3BlcnR5S2V5cykgewotICAgICAgICB0aGlzKHRyYXZlcnNhbCwgcHJvcGVydHlUeXBlLCBwcm9wZXJ0eUtleXMpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyZShXaXRoT3B0aW9ucy50b2tlbnMsIGluY2x1ZGVUb2tlbnMgPyBXaXRoT3B0aW9ucy5hbGwgOiBXaXRoT3B0aW9ucy5ub25lKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgUHJvcGVydHlNYXBTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwsIGZpbmFsIFByb3BlcnR5VHlwZSBwcm9wZXJ0eVR5cGUsIGZpbmFsIFN0cmluZy4uLiBwcm9wZXJ0eUtleXMpIHsKICAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKICAgICAgICAgdGhpcy5wcm9wZXJ0eUtleXMgPSBwcm9wZXJ0eUtleXM7CkBAIC03OCw2ICs2OSwxMSBAQAogICAgICAgICB0aGlzLnRyYXZlcnNhbFJpbmcgPSBuZXcgVHJhdmVyc2FsUmluZzw+KCk7CiAgICAgfQogCisgICAgcHVibGljIFByb3BlcnR5TWFwU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsLCBmaW5hbCBpbnQgb3B0aW9ucywgZmluYWwgUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSwgZmluYWwgU3RyaW5nLi4uIHByb3BlcnR5S2V5cykgeworICAgICAgICB0aGlzKHRyYXZlcnNhbCwgcHJvcGVydHlUeXBlLCBwcm9wZXJ0eUtleXMpOworICAgICAgICB0aGlzLmNvbmZpZ3VyZShXaXRoT3B0aW9ucy50b2tlbnMsIG9wdGlvbnMpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBNYXA8SywgRT4gbWFwKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxFbGVtZW50PiB0cmF2ZXJzZXIpIHsKICAgICAgICAgZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CkBAIC0xNjcsMTQgKzE2Myw2IEBACiAgICAgICAgIHJldHVybiBwcm9wZXJ0eUtleXM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjQuMCwgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRJbmNsdWRlZFRva2VucygpfS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVRva2VucygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zICE9IFdpdGhPcHRpb25zLm5vbmU7Ci0gICAgfQotCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIFN0cmluZ0ZhY3Rvcnkuc3RlcFN0cmluZyh0aGlzLCBBcnJheXMuYXNMaXN0KHRoaXMucHJvcGVydHlLZXlzKSwKICAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNhbFJpbmcsIHRoaXMucmV0dXJuVHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb3BlcnR5VmFsdWVTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb3BlcnR5VmFsdWVTdGVwLmphdmEKaW5kZXggZWFiMGVhNi4uNmY0MTAxMCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9wZXJ0eVZhbHVlU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvcGVydHlWYWx1ZVN0ZXAuamF2YQpAQCAtMjksNyArMjksNyBAQAogLyoqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnR5VmFsdWVTdGVwPEU+IGV4dGVuZHMgTWFwU3RlcDxQcm9wZXJ0eTxFPiwgRT4geworcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnR5VmFsdWVTdGVwPEU+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxQcm9wZXJ0eTxFPiwgRT4gewogCiAgICAgcHVibGljIFByb3BlcnR5VmFsdWVTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwpIHsKICAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUmFuZ2VMb2NhbFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUmFuZ2VMb2NhbFN0ZXAuamF2YQppbmRleCA5MDVhODBjLi5mNzJhMGNiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1JhbmdlTG9jYWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9SYW5nZUxvY2FsU3RlcC5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAvKioKICAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSYW5nZUxvY2FsU3RlcDxTPiBleHRlbmRzIE1hcFN0ZXA8UywgUz4geworcHVibGljIGZpbmFsIGNsYXNzIFJhbmdlTG9jYWxTdGVwPFM+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxTLCBTPiB7CiAKICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbG93OwogICAgIHByaXZhdGUgZmluYWwgbG9uZyBoaWdoOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TYWNrU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TYWNrU3RlcC5qYXZhCmluZGV4IDNlMDM4NWIuLjdmMTJhMDAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU2Fja1N0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1NhY2tTdGVwLmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIC8qKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTYWNrU3RlcDxTLCBFPiBleHRlbmRzIE1hcFN0ZXA8UywgRT4geworcHVibGljIGZpbmFsIGNsYXNzIFNhY2tTdGVwPFMsIEU+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxTLCBFPiB7CiAKICAgICBwdWJsaWMgU2Fja1N0ZXAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbCkgewogICAgICAgICBzdXBlcih0cmF2ZXJzYWwpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TYW1wbGVMb2NhbFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU2FtcGxlTG9jYWxTdGVwLmphdmEKaW5kZXggNWY4M2M1My4uMDUyY2ExNSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TYW1wbGVMb2NhbFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1NhbXBsZUxvY2FsU3RlcC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuU2VlZGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIuVHJhdmVyc2VyUmVxdWlyZW1lbnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzYsOSArMzcsOSBAQAogICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2FtcGxlTG9jYWxTdGVwPFM+IGV4dGVuZHMgTWFwU3RlcDxTLCBTPiB7CitwdWJsaWMgZmluYWwgY2xhc3MgU2FtcGxlTG9jYWxTdGVwPFM+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxTLCBTPiBpbXBsZW1lbnRzIFNlZWRhYmxlIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET00gPSBuZXcgUmFuZG9tKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYW1vdW50VG9TYW1wbGU7CiAKQEAgLTQ4LDYgKzQ5LDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXRTZWVkKGZpbmFsIGxvbmcgc2VlZCkgeworICAgICAgICB0aGlzLnJhbmRvbS5zZXRTZWVkKHNlZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTIG1hcChmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyKSB7CiAgICAgICAgIGZpbmFsIFMgc3RhcnQgPSB0cmF2ZXJzZXIuZ2V0KCk7CiAgICAgICAgIGlmIChzdGFydCBpbnN0YW5jZW9mIE1hcCkgewpAQCAtNjYsNyArNzIsNyBAQAogICAgICAgICBmaW5hbCBMaXN0PFM+IG9yaWdpbmFsID0gbmV3IEFycmF5TGlzdDw+KGNvbGxlY3Rpb24pOwogICAgICAgICBmaW5hbCBMaXN0PFM+IHRhcmdldCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICB3aGlsZSAodGFyZ2V0LnNpemUoKSA8IHRoaXMuYW1vdW50VG9TYW1wbGUpIHsKLSAgICAgICAgICAgIHRhcmdldC5hZGQob3JpZ2luYWwucmVtb3ZlKFJBTkRPTS5uZXh0SW50KG9yaWdpbmFsLnNpemUoKSkpKTsKKyAgICAgICAgICAgIHRhcmdldC5hZGQob3JpZ2luYWwucmVtb3ZlKHJhbmRvbS5uZXh0SW50KG9yaWdpbmFsLnNpemUoKSkpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gKFMpIHRhcmdldDsKICAgICB9CkBAIC03OCw3ICs4NCw3IEBACiAgICAgICAgIGZpbmFsIExpc3Q8TWFwLkVudHJ5PiBvcmlnaW5hbCA9IG5ldyBBcnJheUxpc3Q8PihtYXAuZW50cnlTZXQoKSk7CiAgICAgICAgIGZpbmFsIE1hcCB0YXJnZXQgPSBuZXcgTGlua2VkSGFzaE1hcDw+KHRoaXMuYW1vdW50VG9TYW1wbGUpOwogICAgICAgICB3aGlsZSAodGFyZ2V0LnNpemUoKSA8IHRoaXMuYW1vdW50VG9TYW1wbGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeSBlbnRyeSA9IG9yaWdpbmFsLnJlbW92ZShSQU5ET00ubmV4dEludChvcmlnaW5hbC5zaXplKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeSBlbnRyeSA9IG9yaWdpbmFsLnJlbW92ZShyYW5kb20ubmV4dEludChvcmlnaW5hbC5zaXplKCkpKTsKICAgICAgICAgICAgIHRhcmdldC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAoUykgdGFyZ2V0OwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TY2FsYXJNYXBTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1NjYWxhck1hcFN0ZXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGUwNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TY2FsYXJNYXBTdGVwLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKKworLyoqCisgKiBBIHR5cGUgb2Yge0BsaW5rIE1hcFN0ZXB9IGNsYXNzIHdoaWNoIHdpbGwgdHJhbnNmb3JtIHRoZSBvYmplY3Qgb2Ygb25lIHtAbGluayBUcmF2ZXJzZXJ9IGludG8gYW5vdGhlci4gVGhpcyBjbGFzcworICogc2ltcGx5IHJlcXVpcmVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rICNtYXAoVHJhdmVyc2VyLkFkbWluKX0gbWV0aG9kIHRvIGV4dHJhY3QgdGhlIG9iamVjdCBvZiB0aGUgZ2l2ZW4KKyAqIHtAbGluayBUcmF2ZXJzZXJ9IGFuZCByZXR1cm4gdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoYXQgb2JqZWN0IGFzIHtAY29kZSBFfS4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNjYWxhck1hcFN0ZXA8UywgRT4gZXh0ZW5kcyBNYXBTdGVwPFMsRT4geworICAgIHB1YmxpYyBTY2FsYXJNYXBTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwpIHsKKyAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVHJhdmVyc2VyLkFkbWluPEU+IHByb2Nlc3NOZXh0U3RhcnQoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIgPSB0aGlzLnN0YXJ0cy5uZXh0KCk7CisgICAgICAgIHJldHVybiB0cmF2ZXJzZXIuc3BsaXQodGhpcy5tYXAodHJhdmVyc2VyKSwgdGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEUgbWFwKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpOworfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TZWxlY3RPbmVTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1NlbGVjdE9uZVN0ZXAuamF2YQppbmRleCAyYzdhYTgyLi45NzZjNTEyIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1NlbGVjdE9uZVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1NlbGVjdE9uZVN0ZXAuamF2YQpAQCAtMjYsMTMgKzI2LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlNjb3Bpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudHJhdmVyc2VyLnV0aWwuRW1wdHlUcmF2ZXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLlRyYXZlcnNhbFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5TdHJpbmdGYWN0b3J5OwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgpAQCAtNTIsOSArNTMsMTkgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRSBtYXAoZmluYWwgVHJhdmVyc2VyLkFkbWluPFM+IHRyYXZlcnNlcikgewotICAgICAgICBmaW5hbCBFIGVuZCA9IHRoaXMuZ2V0TnVsbGFibGVTY29wZVZhbHVlKHRoaXMucG9wLCB0aGlzLnNlbGVjdEtleSwgdHJhdmVyc2VyKTsKLSAgICAgICAgcmV0dXJuIG51bGwgIT0gZW5kID8gVHJhdmVyc2FsVXRpbC5hcHBseU51bGxhYmxlKChTKSBlbmQsIHRoaXMuc2VsZWN0VHJhdmVyc2FsKSA6IG51bGw7CisgICAgcHJvdGVjdGVkIFRyYXZlcnNlci5BZG1pbjxFPiBwcm9jZXNzTmV4dFN0YXJ0KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyID0gdGhpcy5zdGFydHMubmV4dCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTIG8gPSBnZXRTY29wZVZhbHVlKHBvcCwgc2VsZWN0S2V5LCB0cmF2ZXJzZXIpOworICAgICAgICAgICAgaWYgKG51bGwgPT0gbykgcmV0dXJuIHRyYXZlcnNlci5zcGxpdChudWxsLCB0aGlzKTsKKyAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNlci5BZG1pbjxFPiBvdXRUcmF2ZXJzZXIgPSB0cmF2ZXJzZXIuc3BsaXQoVHJhdmVyc2FsVXRpbC5hcHBseU51bGxhYmxlKG8sIHRoaXMuc2VsZWN0VHJhdmVyc2FsKSwgdGhpcyk7CisgICAgICAgICAgICBpZiAoISh0aGlzLmdldFRyYXZlcnNhbCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgTWF0Y2hTdGVwKSkKKyAgICAgICAgICAgICAgICBQYXRoUHJvY2Vzc29yLnByb2Nlc3NUcmF2ZXJzZXJQYXRoTGFiZWxzKG91dFRyYXZlcnNlciwgdGhpcy5rZWVwTGFiZWxzKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRUcmF2ZXJzZXI7CisgICAgICAgIH0gY2F0Y2ggKEtleU5vdEZvdW5kRXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgcmV0dXJuIEVtcHR5VHJhdmVyc2VyLmluc3RhbmNlKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwMyw2ICsxMTQsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTG9jYWxDaGlsZChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gb2xkVHJhdmVyc2FsLCBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gbmV3VHJhdmVyc2FsKSB7CisgICAgICAgIGlmIChudWxsICE9IHRoaXMuc2VsZWN0VHJhdmVyc2FsICYmIHRoaXMuc2VsZWN0VHJhdmVyc2FsLmVxdWFscyhvbGRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgdGhpcy5zZWxlY3RUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKG5ld1RyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxUcmF2ZXJzZXJSZXF1aXJlbWVudD4gZ2V0UmVxdWlyZW1lbnRzKCkgewogICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWxmQW5kQ2hpbGRSZXF1aXJlbWVudHMoVHJhdmVyc2VyUmVxdWlyZW1lbnQuT0JKRUNULCBUcmF2ZXJzZXJSZXF1aXJlbWVudC5TSURFX0VGRkVDVFMpOwogICAgIH0KQEAgLTEyNiwxNCArMTQzLDYgQEAKICAgICAgICAgcmV0dXJuIHRoaXMua2VlcExhYmVsczsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgVHJhdmVyc2VyLkFkbWluPEU+IHByb2Nlc3NOZXh0U3RhcnQoKSB7Ci0gICAgICAgIGZpbmFsIFRyYXZlcnNlci5BZG1pbjxFPiB0cmF2ZXJzZXIgPSBzdXBlci5wcm9jZXNzTmV4dFN0YXJ0KCk7Ci0gICAgICAgIGlmICghKHRoaXMuZ2V0VHJhdmVyc2FsKCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBNYXRjaFN0ZXApKSB7Ci0gICAgICAgICAgICBQYXRoUHJvY2Vzc29yLnByb2Nlc3NUcmF2ZXJzZXJQYXRoTGFiZWxzKHRyYXZlcnNlciwgdGhpcy5rZWVwTGFiZWxzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhdmVyc2VyOwotICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1NlbGVjdFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU2VsZWN0U3RlcC5qYXZhCmluZGV4IDg3NWNmOTMuLjllZGRlOWQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU2VsZWN0U3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU2VsZWN0U3RlcC5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlNjb3Bpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudHJhdmVyc2VyLnV0aWwuRW1wdHlUcmF2ZXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLlRyYXZlcnNhbFJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLlRyYXZlcnNhbFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5TdHJpbmdGYWN0b3J5OwpAQCAtMzgsMTAgKzM4LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQorICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU2VsZWN0U3RlcDxTLCBFPiBleHRlbmRzIE1hcFN0ZXA8UywgTWFwPFN0cmluZywgRT4+IGltcGxlbWVudHMgU2NvcGluZywgVHJhdmVyc2FsUGFyZW50LCBQYXRoUHJvY2Vzc29yLCBCeU1vZHVsYXRpbmcgewogCkBAIC02MSwxOSArNjMsMjEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgRT4gbWFwKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpIHsKKyAgICBwcm90ZWN0ZWQgVHJhdmVyc2VyLkFkbWluPE1hcDxTdHJpbmcsIEU+PiBwcm9jZXNzTmV4dFN0YXJ0KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyID0gdGhpcy5zdGFydHMubmV4dCgpOwogICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBFPiBiaW5kaW5ncyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4odGhpcy5zZWxlY3RLZXlzLnNpemUoKSwgMS4wZik7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHNlbGVjdEtleSA6IHRoaXMuc2VsZWN0S2V5cykgewotICAgICAgICAgICAgZmluYWwgRSBlbmQgPSB0aGlzLmdldE51bGxhYmxlU2NvcGVWYWx1ZSh0aGlzLnBvcCwgc2VsZWN0S2V5LCB0cmF2ZXJzZXIpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gZW5kKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgc2VsZWN0S2V5IDogdGhpcy5zZWxlY3RLZXlzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRSBlbmQgPSB0aGlzLmdldFNjb3BlVmFsdWUodGhpcy5wb3AsIHNlbGVjdEtleSwgdHJhdmVyc2VyKTsKICAgICAgICAgICAgICAgICBiaW5kaW5ncy5wdXQoc2VsZWN0S2V5LCBUcmF2ZXJzYWxVdGlsLmFwcGx5TnVsbGFibGUoZW5kLCB0aGlzLnRyYXZlcnNhbFJpbmcubmV4dCgpKSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNhbFJpbmcucmVzZXQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoS2V5Tm90Rm91bmRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICByZXR1cm4gRW1wdHlUcmF2ZXJzZXIuaW5zdGFuY2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRoaXMudHJhdmVyc2FsUmluZy5yZXNldCgpOwogICAgICAgICB9Ci0gICAgICAgIHRoaXMudHJhdmVyc2FsUmluZy5yZXNldCgpOwotICAgICAgICByZXR1cm4gYmluZGluZ3M7CisKKyAgICAgICAgcmV0dXJuIFBhdGhQcm9jZXNzb3IucHJvY2Vzc1RyYXZlcnNlclBhdGhMYWJlbHModHJhdmVyc2VyLnNwbGl0KGJpbmRpbmdzLCB0aGlzKSwgdGhpcy5rZWVwTGFiZWxzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExOSw2ICsxMjMsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTG9jYWxDaGlsZChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gb2xkVHJhdmVyc2FsLCBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gbmV3VHJhdmVyc2FsKSB7CisgICAgICAgIHRoaXMudHJhdmVyc2FsUmluZy5yZXBsYWNlVHJhdmVyc2FsKAorICAgICAgICAgICAgICAgIChUcmF2ZXJzYWwuQWRtaW48T2JqZWN0LCBFPikgb2xkVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgIChUcmF2ZXJzYWwuQWRtaW48T2JqZWN0LCBFPikgbmV3VHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2V0PFRyYXZlcnNlclJlcXVpcmVtZW50PiBnZXRSZXF1aXJlbWVudHMoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmdldFNlbGZBbmRDaGlsZFJlcXVpcmVtZW50cyhUcmF2ZXJzZXJSZXF1aXJlbWVudC5PQkpFQ1QsIFRyYXZlcnNlclJlcXVpcmVtZW50LlNJREVfRUZGRUNUUyk7CiAgICAgfQpAQCAtMTUwLDkgKzE2MSw0IEBACiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEtlZXBMYWJlbHMoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmtlZXBMYWJlbHM7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFRyYXZlcnNlci5BZG1pbjxNYXA8U3RyaW5nLCBFPj4gcHJvY2Vzc05leHRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIFBhdGhQcm9jZXNzb3IucHJvY2Vzc1RyYXZlcnNlclBhdGhMYWJlbHMoc3VwZXIucHJvY2Vzc05leHRTdGFydCgpLCB0aGlzLmtlZXBMYWJlbHMpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU3VtTG9jYWxTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1N1bUxvY2FsU3RlcC5qYXZhCmluZGV4IDcyZTY1MzkuLjMyNDllMzEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU3VtTG9jYWxTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TdW1Mb2NhbFN0ZXAuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKiBAYXV0aG9yIERhbmllbCBLdXBwaXR6IChodHRwOi8vZ3JlbWxpbi5ndXJ1KQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3VtTG9jYWxTdGVwPEUgZXh0ZW5kcyBOdW1iZXIsIFMgZXh0ZW5kcyBJdGVyYWJsZTxFPj4gZXh0ZW5kcyBNYXBTdGVwPFMsIEU+IHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBTdW1Mb2NhbFN0ZXA8RSBleHRlbmRzIE51bWJlciwgUyBleHRlbmRzIEl0ZXJhYmxlPEU+PiBleHRlbmRzIFNjYWxhck1hcFN0ZXA8UywgRT4gewogCiAgICAgcHVibGljIFN1bUxvY2FsU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1RhaWxMb2NhbFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVGFpbExvY2FsU3RlcC5qYXZhCmluZGV4IGVhNjc4YTUuLjMzNjMyM2UgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVGFpbExvY2FsU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVGFpbExvY2FsU3RlcC5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiAvKioKICAqIEBhdXRob3IgTWF0dCBGcmFudHogKGh0dHA6Ly9naXRodWIuY29tL21oZnJhbnR6KQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFpbExvY2FsU3RlcDxTPiBleHRlbmRzIE1hcFN0ZXA8UywgUz4geworcHVibGljIGZpbmFsIGNsYXNzIFRhaWxMb2NhbFN0ZXA8Uz4gZXh0ZW5kcyBTY2FsYXJNYXBTdGVwPFMsIFM+IHsKIAogICAgIHByaXZhdGUgZmluYWwgbG9uZyBsaW1pdDsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9UcmF2ZXJzYWxNYXBTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1RyYXZlcnNhbE1hcFN0ZXAuamF2YQppbmRleCA4OTZiODMzLi43ZGM4MmQ3IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1RyYXZlcnNhbE1hcFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1RyYXZlcnNhbE1hcFN0ZXAuamF2YQpAQCAtMjIsMTYgKzIyLDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci51dGlsLkVtcHR5VHJhdmVyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5UcmF2ZXJzYWxVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFRyYXZlcnNhbE1hcFN0ZXA8UywgRT4gZXh0ZW5kcyBNYXBTdGVwPFMsIEU+IGltcGxlbWVudHMgVHJhdmVyc2FsUGFyZW50IHsKIApAQCAtNDMsOSArNDYsMTAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRSBtYXAoZmluYWwgVHJhdmVyc2VyLkFkbWluPFM+IHRyYXZlcnNlcikgeworICAgIHByb3RlY3RlZCBUcmF2ZXJzZXIuQWRtaW48RT4gcHJvY2Vzc05leHRTdGFydCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2VyLkFkbWluPFM+IHRyYXZlcnNlciA9IHRoaXMuc3RhcnRzLm5leHQoKTsKICAgICAgICAgZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSBUcmF2ZXJzYWxVdGlsLmFwcGx5QWxsKHRyYXZlcnNlciwgdGhpcy5tYXBUcmF2ZXJzYWwpOwotICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gaXRlcmF0b3IubmV4dCgpIDogbnVsbDsKKyAgICAgICAgcmV0dXJuICBpdGVyYXRvci5oYXNOZXh0KCkgPyB0cmF2ZXJzZXIuc3BsaXQoaXRlcmF0b3IubmV4dCgpLCB0aGlzKSA6IEVtcHR5VHJhdmVyc2VyLmluc3RhbmNlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1RyYXZlcnNhbFNlbGVjdFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVHJhdmVyc2FsU2VsZWN0U3RlcC5qYXZhCmluZGV4IDFkNWVjZDEuLmZmOWYwOTkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVHJhdmVyc2FsU2VsZWN0U3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVHJhdmVyc2FsU2VsZWN0U3RlcC5qYXZhCkBAIC0xOCwxNCArMTgsMTUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5QYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUG9wOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CeU1vZHVsYXRpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlBhdGhQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlNjb3Bpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci51dGlsLkVtcHR5VHJhdmVyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5UcmF2ZXJzYWxVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKIApAQCAtMzQsMTQgKzM1LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotCiAvKioKICAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmF2ZXJzYWxTZWxlY3RTdGVwPFMsIEU+IGV4dGVuZHMgTWFwU3RlcDxTLCBFPiBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgUGF0aFByb2Nlc3NvciwgQnlNb2R1bGF0aW5nIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBUcmF2ZXJzYWxTZWxlY3RTdGVwPFMsIEU+IGV4dGVuZHMgTWFwU3RlcDxTLCBFPiBpbXBsZW1lbnRzIFRyYXZlcnNhbFBhcmVudCwgUGF0aFByb2Nlc3NvciwgQnlNb2R1bGF0aW5nLCBTY29waW5nIHsKIAogICAgIHByaXZhdGUgZmluYWwgUG9wIHBvcDsKICAgICBwcml2YXRlIFRyYXZlcnNhbC5BZG1pbjxTLCBFPiBrZXlUcmF2ZXJzYWw7CkBAIC01NSwyNiArNTQsMzUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRSBtYXAoZmluYWwgVHJhdmVyc2VyLkFkbWluPFM+IHRyYXZlcnNlcikgewotICAgICAgICBFIGVuZCA9IG51bGw7CisgICAgcHJvdGVjdGVkIFRyYXZlcnNlci5BZG1pbjxFPiBwcm9jZXNzTmV4dFN0YXJ0KCkgeworICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyID0gdGhpcy5zdGFydHMubmV4dCgpOwogICAgICAgICBmaW5hbCBJdGVyYXRvcjxFPiBrZXlJdGVyYXRvciA9IFRyYXZlcnNhbFV0aWwuYXBwbHlBbGwodHJhdmVyc2VyLCB0aGlzLmtleVRyYXZlcnNhbCk7CiAgICAgICAgIGlmIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIGZpbmFsIEUga2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iamVjdCA9IHRyYXZlcnNlci5nZXQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApIG9iamVjdCkuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgICAgICAgICBlbmQgPSAoRSkgKChNYXApIG9iamVjdCkuZ2V0KGtleSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2tleSA9IChTdHJpbmcpIGtleTsKLSAgICAgICAgICAgICAgICBpZiAodHJhdmVyc2VyLmdldFNpZGVFZmZlY3RzKCkuZXhpc3RzKHNrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRyYXZlcnNlci5nZXRTaWRlRWZmZWN0cygpLmdldCgoU3RyaW5nKSBrZXkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggcGF0aCA9IHRyYXZlcnNlci5wYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmhhc0xhYmVsKHNrZXkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gbnVsbCA9PSBwb3AgPyBwYXRoLmdldChza2V5KSA6IHBhdGguZ2V0KHBvcCwgc2tleSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIEUgZW5kID0gZ2V0U2NvcGVWYWx1ZShwb3AsIGtleSwgdHJhdmVyc2VyKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48RT4gb3V0VHJhdmVyc2VyID0gdHJhdmVyc2VyLnNwbGl0KG51bGwgPT0gZW5kID8gbnVsbCA6IFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZShlbmQsIHRoaXMuc2VsZWN0VHJhdmVyc2FsKSwgdGhpcyk7CisgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE1hdGNoU3RlcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUGF0aFByb2Nlc3Nvci5wcm9jZXNzVHJhdmVyc2VyUGF0aExhYmVscyhvdXRUcmF2ZXJzZXIsIHRoaXMua2VlcExhYmVscyk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBvdXRUcmF2ZXJzZXI7CisgICAgICAgICAgICB9IGNhdGNoIChLZXlOb3RGb3VuZEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRW1wdHlUcmF2ZXJzZXIuaW5zdGFuY2UoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBFbXB0eVRyYXZlcnNlci5pbnN0YW5jZSgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsICE9IGVuZCA/IFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZShlbmQsIHRoaXMuc2VsZWN0VHJhdmVyc2FsKSA6IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFNjb3BlS2V5cygpIHsKKyAgICAgICAgLy8gY2FuJ3QgcmV0dXJuIHNjb3BlIGtleXMgaGVyZSBiZWNhdXNlIHRoZXkgYXJlbid0IGtub3duIHByaW9yIHRvIHRyYXZlcnNhbCBleGVjdXRpb24gYW5kIHRoaXMgbWV0aG9kIGlzCisgICAgICAgIC8vIHVzZWQgYXQgc3RyYXRlZ3kgYXBwbGljYXRpb24gdGltZS4gbm90IGdldHRpbmcgYW55IHRlc3QgZmFpbHVyZXMgYXMgYSByZXN1bHQgb2YgcmV0dXJuaW5nIGVtcHR5LiBhc3N1bWluZworICAgICAgICAvLyB0aGF0IHN0cmF0ZWdpZXMgZG9uJ3QgdXNlIFNjb3BpbmcgaW4gYSB3YXkgdGhhdCByZXF1aXJlcyB0aGUga2V5cyB0byBiZSBrbm93biBhbmQgaWYgdGhleSBhcmVuJ3QgZG9lc24ndAorICAgICAgICAvLyBob3NlIHRoZSB3aG9sZSB0cmF2ZXJzYWwuIGluIHRoZSB3b3JzdCBjYXNlLCBzdHJhdGVnaWVzIHdpbGwgaG9wZWZ1bGx5IGp1c3QgbGVhdmUgc3RlcHMgYWxvbmUgcmF0aGVyIHRoYW4KKyAgICAgICAgLy8gbWFrZSB0aGVpciBvd24gYXNzdW1wdGlvbnMgdGhhdCB0aGUgc3RlcCBpcyBub3Qgc2VsZWN0aW5nIGFueXRoaW5nLiBpZiB0aGF0IGlzIGhhcHBlbmluZyBzb21laG93IHdlIG1pZ2h0CisgICAgICAgIC8vIG5lZWQgdG8gbW9kaWZ5IFNjb3BpbmcgdG8gYmV0dGVyIHN1aXRlIHRoaXMgcnVudGltZSBldmFsdWF0aW9uIG9mIHRoZSBrZXkuCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU1LDE1ICsxNjMsNiBAQAogICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRLZWVwTGFiZWxzKCkgewogICAgICAgICByZXR1cm4gdGhpcy5rZWVwTGFiZWxzOwogICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBUcmF2ZXJzZXIuQWRtaW48RT4gcHJvY2Vzc05leHRTdGFydCgpIHsKLSAgICAgICAgZmluYWwgVHJhdmVyc2VyLkFkbWluPEU+IHRyYXZlcnNlciA9IHN1cGVyLnByb2Nlc3NOZXh0U3RhcnQoKTsKLSAgICAgICAgaWYgKCEodGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE1hdGNoU3RlcCkpIHsKLSAgICAgICAgICAgIFBhdGhQcm9jZXNzb3IucHJvY2Vzc1RyYXZlcnNlclBhdGhMYWJlbHModHJhdmVyc2VyLCB0aGlzLmtlZXBMYWJlbHMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmF2ZXJzZXI7Ci0gICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVHJlZVN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvVHJlZVN0ZXAuamF2YQppbmRleCA0MTMxMGFhLi4xOTA0ODU5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1RyZWVTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9UcmVlU3RlcC5qYXZhCkBAIC02NCw2ICs2NCwxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VMb2NhbENoaWxkKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBvbGRUcmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBuZXdUcmF2ZXJzYWwpIHsKKyAgICAgICAgdGhpcy50cmF2ZXJzYWxSaW5nLnJlcGxhY2VUcmF2ZXJzYWwoCisgICAgICAgICAgICAgICAgKFRyYXZlcnNhbC5BZG1pbjxPYmplY3QsIE9iamVjdD4pIG9sZFRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAoVHJhdmVyc2FsLkFkbWluPE9iamVjdCwgT2JqZWN0PikgbmV3VHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2V0PFRyYXZlcnNlclJlcXVpcmVtZW50PiBnZXRSZXF1aXJlbWVudHMoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmdldFNlbGZBbmRDaGlsZFJlcXVpcmVtZW50cyhUcmF2ZXJzZXJSZXF1aXJlbWVudC5QQVRILCBUcmF2ZXJzZXJSZXF1aXJlbWVudC5TSURFX0VGRkVDVFMpOwogICAgIH0KQEAgLTgzLDcgKzkwLDYgQEAKICAgICAgICAgcmV0dXJuIHRvcFRyZWU7CiAgICAgfQogCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVHJlZVN0ZXA8Uz4gY2xvbmUoKSB7CiAgICAgICAgIGZpbmFsIFRyZWVTdGVwPFM+IGNsb25lID0gKFRyZWVTdGVwPFM+KSBzdXBlci5jbG9uZSgpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvQWdncmVnYXRlR2xvYmFsU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvQWdncmVnYXRlR2xvYmFsU3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzU5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9BZ2dyZWdhdGVHbG9iYWxTdGVwLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuT3BlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLkJ5TW9kdWxhdGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuTG9jYWxCYXJyaWVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5TaWRlRWZmZWN0Q2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkFic3RyYWN0U3RlcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5CdWxrU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudHJhdmVyc2VyLlRyYXZlcnNlclJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudHJhdmVyc2VyLnV0aWwuVHJhdmVyc2VyU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5GYXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLlN0cmluZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkJ1bGtTZXRTdXBwbGllcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFnZ3JlZ2F0ZUdsb2JhbFN0ZXA8Uz4gZXh0ZW5kcyBBYnN0cmFjdFN0ZXA8UywgUz4gaW1wbGVtZW50cyBTaWRlRWZmZWN0Q2FwYWJsZTxDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPiwgVHJhdmVyc2FsUGFyZW50LCBCeU1vZHVsYXRpbmcsIExvY2FsQmFycmllcjxTPiB7CisKKyAgICBwcml2YXRlIFRyYXZlcnNhbC5BZG1pbjxTLCBPYmplY3Q+IGFnZ3JlZ2F0ZVRyYXZlcnNhbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2lkZUVmZmVjdEtleTsKKyAgICBwcml2YXRlIFRyYXZlcnNlclNldDxTPiBiYXJyaWVyOworCisgICAgcHVibGljIEFnZ3JlZ2F0ZUdsb2JhbFN0ZXAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbCwgZmluYWwgU3RyaW5nIHNpZGVFZmZlY3RLZXkpIHsKKyAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKKyAgICAgICAgdGhpcy5zaWRlRWZmZWN0S2V5ID0gc2lkZUVmZmVjdEtleTsKKyAgICAgICAgdGhpcy5iYXJyaWVyID0gKFRyYXZlcnNlclNldDxTPikgdGhpcy50cmF2ZXJzYWwuZ2V0VHJhdmVyc2VyU2V0U3VwcGxpZXIoKS5nZXQoKTsKKyAgICAgICAgdGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRTaWRlRWZmZWN0cygpLnJlZ2lzdGVySWZBYnNlbnQodGhpcy5zaWRlRWZmZWN0S2V5LCAoU3VwcGxpZXIpIEJ1bGtTZXRTdXBwbGllci5pbnN0YW5jZSgpLCBPcGVyYXRvci5hZGRBbGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lkZUVmZmVjdEtleSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2lkZUVmZmVjdEtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nRmFjdG9yeS5zdGVwU3RyaW5nKHRoaXMsIHRoaXMuc2lkZUVmZmVjdEtleSwgdGhpcy5hZ2dyZWdhdGVUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1vZHVsYXRlQnkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IGFnZ3JlZ2F0ZVRyYXZlcnNhbCkgeworICAgICAgICB0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQoYWdncmVnYXRlVHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTG9jYWxDaGlsZChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gb2xkVHJhdmVyc2FsLCBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gbmV3VHJhdmVyc2FsKSB7CisgICAgICAgIGlmIChudWxsICE9IHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsICYmIHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsLmVxdWFscyhvbGRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgdGhpcy5hZ2dyZWdhdGVUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKG5ld1RyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8VHJhdmVyc2FsLkFkbWluPFMsIE9iamVjdD4+IGdldExvY2FsQ2hpbGRyZW4oKSB7CisgICAgICAgIHJldHVybiBudWxsID09IHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFRyYXZlcnNlclJlcXVpcmVtZW50PiBnZXRSZXF1aXJlbWVudHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldFNlbGZBbmRDaGlsZFJlcXVpcmVtZW50cyhUcmF2ZXJzZXJSZXF1aXJlbWVudC5CVUxLLCBUcmF2ZXJzZXJSZXF1aXJlbWVudC5TSURFX0VGRkVDVFMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBZ2dyZWdhdGVHbG9iYWxTdGVwPFM+IGNsb25lKCkgeworICAgICAgICBmaW5hbCBBZ2dyZWdhdGVHbG9iYWxTdGVwPFM+IGNsb25lID0gKEFnZ3JlZ2F0ZUdsb2JhbFN0ZXA8Uz4pIHN1cGVyLmNsb25lKCk7CisgICAgICAgIGNsb25lLmJhcnJpZXIgPSAoVHJhdmVyc2VyU2V0PFM+KSB0aGlzLnRyYXZlcnNhbC5nZXRUcmF2ZXJzZXJTZXRTdXBwbGllcigpLmdldCgpOworICAgICAgICBpZiAobnVsbCAhPSB0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbCkKKyAgICAgICAgICAgIGNsb25lLmFnZ3JlZ2F0ZVRyYXZlcnNhbCA9IHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsLmNsb25lKCk7CisgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmF2ZXJzYWwoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHBhcmVudFRyYXZlcnNhbCkgeworICAgICAgICBzdXBlci5zZXRUcmF2ZXJzYWwocGFyZW50VHJhdmVyc2FsKTsKKyAgICAgICAgdGhpcy5pbnRlZ3JhdGVDaGlsZCh0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHN1cGVyLmhhc2hDb2RlKCkgXiB0aGlzLnNpZGVFZmZlY3RLZXkuaGFzaENvZGUoKTsKKyAgICAgICAgaWYgKHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsICE9IG51bGwpCisgICAgICAgICAgICByZXN1bHQgXj0gdGhpcy5hZ2dyZWdhdGVUcmF2ZXJzYWwuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVHJhdmVyc2VyLkFkbWluPFM+IHByb2Nlc3NOZXh0U3RhcnQoKSB7CisgICAgICAgIGlmICh0aGlzLmJhcnJpZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbGxTdGFydHMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5iYXJyaWVyLnJlbW92ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NBbGxTdGFydHMoKSB7CisgICAgICAgIGlmICh0aGlzLnN0YXJ0cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bGtTZXQ8T2JqZWN0PiBidWxrU2V0ID0gbmV3IEJ1bGtTZXQ8PigpOworICAgICAgICAgICAgd2hpbGUgKHRoaXMuc3RhcnRzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIgPSB0aGlzLnN0YXJ0cy5uZXh0KCk7CisgICAgICAgICAgICAgICAgYnVsa1NldC5hZGQoVHJhdmVyc2FsVXRpbC5hcHBseU51bGxhYmxlKHRyYXZlcnNlciwgdGhpcy5hZ2dyZWdhdGVUcmF2ZXJzYWwpLCB0cmF2ZXJzZXIuYnVsaygpKTsKKyAgICAgICAgICAgICAgICB0cmF2ZXJzZXIuc2V0U3RlcElkKHRoaXMuZ2V0TmV4dFN0ZXAoKS5nZXRJZCgpKTsgLy8gd2hlbiBiYXJyaWVyIGlzIHJlbG9hZGVkLCB0aGUgdHJhdmVyc2VycyBzaG91bGQgYmUgYXQgdGhlIG5leHQgc3RlcAorICAgICAgICAgICAgICAgIHRoaXMuYmFycmllci5hZGQodHJhdmVyc2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuZ2V0VHJhdmVyc2FsKCkuZ2V0U2lkZUVmZmVjdHMoKS5hZGQodGhpcy5zaWRlRWZmZWN0S2V5LCBidWxrU2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRCYXJyaWVyKCkgeworICAgICAgICBpZiAodGhpcy5iYXJyaWVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzQWxsU3RhcnRzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICF0aGlzLmJhcnJpZXIuaXNFbXB0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUcmF2ZXJzZXJTZXQ8Uz4gbmV4dEJhcnJpZXIoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLmJhcnJpZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbGxTdGFydHMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5iYXJyaWVyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRocm93IEZhc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmluc3RhbmNlKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZmluYWwgVHJhdmVyc2VyU2V0PFM+IHRlbXAgPSB0aGlzLmJhcnJpZXI7CisgICAgICAgICAgICB0aGlzLmJhcnJpZXIgPSAoVHJhdmVyc2VyU2V0PFM+KSB0aGlzLnRyYXZlcnNhbC5nZXRUcmF2ZXJzZXJTZXRTdXBwbGllcigpLmdldCgpOworICAgICAgICAgICAgcmV0dXJuIHRlbXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRCYXJyaWVyKGZpbmFsIFRyYXZlcnNlclNldDxTPiBiYXJyaWVyKSB7CisgICAgICAgIHRoaXMuYmFycmllci5hZGRBbGwoYmFycmllcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgICAgIHRoaXMuYmFycmllci5jbGVhcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZUxvY2FsU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvQWdncmVnYXRlTG9jYWxTdGVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3YzBmYQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZUxvY2FsU3RlcC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLk9wZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CeU1vZHVsYXRpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlNpZGVFZmZlY3RDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5UcmF2ZXJzYWxQYXJlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuQnVsa1NldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLlN0cmluZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkJ1bGtTZXRTdXBwbGllcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFnZ3JlZ2F0ZUxvY2FsU3RlcDxTPiBleHRlbmRzIFNpZGVFZmZlY3RTdGVwPFM+IGltcGxlbWVudHMgU2lkZUVmZmVjdENhcGFibGU8Q29sbGVjdGlvbiwgQ29sbGVjdGlvbj4sIFRyYXZlcnNhbFBhcmVudCwgQnlNb2R1bGF0aW5nIHsKKworICAgIHByaXZhdGUgVHJhdmVyc2FsLkFkbWluPFMsIE9iamVjdD4gc3RvcmVUcmF2ZXJzYWwgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHNpZGVFZmZlY3RLZXk7CisKKyAgICBwdWJsaWMgQWdncmVnYXRlTG9jYWxTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwsIGZpbmFsIFN0cmluZyBzaWRlRWZmZWN0S2V5KSB7CisgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CisgICAgICAgIHRoaXMuc2lkZUVmZmVjdEtleSA9IHNpZGVFZmZlY3RLZXk7CisgICAgICAgIHRoaXMuZ2V0VHJhdmVyc2FsKCkuZ2V0U2lkZUVmZmVjdHMoKS5yZWdpc3RlcklmQWJzZW50KHRoaXMuc2lkZUVmZmVjdEtleSwgKFN1cHBsaWVyKSBCdWxrU2V0U3VwcGxpZXIuaW5zdGFuY2UoKSwgT3BlcmF0b3IuYWRkQWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzaWRlRWZmZWN0KGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpIHsKKyAgICAgICAgZmluYWwgQnVsa1NldDxPYmplY3Q+IGJ1bGtTZXQgPSBuZXcgQnVsa1NldDw+KCk7CisgICAgICAgIGJ1bGtTZXQuYWRkKFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZSh0cmF2ZXJzZXIsIHRoaXMuc3RvcmVUcmF2ZXJzYWwpLCB0cmF2ZXJzZXIuYnVsaygpKTsKKyAgICAgICAgdGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRTaWRlRWZmZWN0cygpLmFkZCh0aGlzLnNpZGVFZmZlY3RLZXksIGJ1bGtTZXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lkZUVmZmVjdEtleSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2lkZUVmZmVjdEtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nRmFjdG9yeS5zdGVwU3RyaW5nKHRoaXMsIHRoaXMuc2lkZUVmZmVjdEtleSwgdGhpcy5zdG9yZVRyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8VHJhdmVyc2FsLkFkbWluPFMsIE9iamVjdD4+IGdldExvY2FsQ2hpbGRyZW4oKSB7CisgICAgICAgIHJldHVybiBudWxsID09IHRoaXMuc3RvcmVUcmF2ZXJzYWwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGhpcy5zdG9yZVRyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbW9kdWxhdGVCeShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gc3RvcmVUcmF2ZXJzYWwpIHsKKyAgICAgICAgdGhpcy5zdG9yZVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQoc3RvcmVUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VMb2NhbENoaWxkKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBvbGRUcmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBuZXdUcmF2ZXJzYWwpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5zdG9yZVRyYXZlcnNhbCAmJiB0aGlzLnN0b3JlVHJhdmVyc2FsLmVxdWFscyhvbGRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgdGhpcy5zdG9yZVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQobmV3VHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFRyYXZlcnNlclJlcXVpcmVtZW50PiBnZXRSZXF1aXJlbWVudHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldFNlbGZBbmRDaGlsZFJlcXVpcmVtZW50cyhUcmF2ZXJzZXJSZXF1aXJlbWVudC5TSURFX0VGRkVDVFMsIFRyYXZlcnNlclJlcXVpcmVtZW50LkJVTEspOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBZ2dyZWdhdGVMb2NhbFN0ZXA8Uz4gY2xvbmUoKSB7CisgICAgICAgIGZpbmFsIEFnZ3JlZ2F0ZUxvY2FsU3RlcDxTPiBjbG9uZSA9IChBZ2dyZWdhdGVMb2NhbFN0ZXA8Uz4pIHN1cGVyLmNsb25lKCk7CisgICAgICAgIGlmIChudWxsICE9IHRoaXMuc3RvcmVUcmF2ZXJzYWwpCisgICAgICAgICAgICBjbG9uZS5zdG9yZVRyYXZlcnNhbCA9IHRoaXMuc3RvcmVUcmF2ZXJzYWwuY2xvbmUoKTsKKyAgICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRyYXZlcnNhbChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gcGFyZW50VHJhdmVyc2FsKSB7CisgICAgICAgIHN1cGVyLnNldFRyYXZlcnNhbChwYXJlbnRUcmF2ZXJzYWwpOworICAgICAgICB0aGlzLmludGVncmF0ZUNoaWxkKHRoaXMuc3RvcmVUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBzdXBlci5oYXNoQ29kZSgpIF4gdGhpcy5zaWRlRWZmZWN0S2V5Lmhhc2hDb2RlKCk7CisgICAgICAgIGlmICh0aGlzLnN0b3JlVHJhdmVyc2FsICE9IG51bGwpCisgICAgICAgICAgICByZXN1bHQgXj0gdGhpcy5zdG9yZVRyYXZlcnNhbC5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZVN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyZWE0OC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9BZ2dyZWdhdGVTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5PcGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuQnlNb2R1bGF0aW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5Mb2NhbEJhcnJpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlNpZGVFZmZlY3RDYXBhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5UcmF2ZXJzYWxQYXJlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuQWJzdHJhY3RTdGVwOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkJ1bGtTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIuVHJhdmVyc2VyUmVxdWlyZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIudXRpbC5UcmF2ZXJzZXJTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLkZhc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5UcmF2ZXJzYWxVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uQnVsa1NldFN1cHBsaWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWdncmVnYXRlU3RlcDxTPiBleHRlbmRzIEFic3RyYWN0U3RlcDxTLCBTPiBpbXBsZW1lbnRzIFNpZGVFZmZlY3RDYXBhYmxlPENvbGxlY3Rpb24sIENvbGxlY3Rpb24+LCBUcmF2ZXJzYWxQYXJlbnQsIEJ5TW9kdWxhdGluZywgTG9jYWxCYXJyaWVyPFM+IHsKLQotICAgIHByaXZhdGUgVHJhdmVyc2FsLkFkbWluPFMsIE9iamVjdD4gYWdncmVnYXRlVHJhdmVyc2FsID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBzaWRlRWZmZWN0S2V5OwotICAgIHByaXZhdGUgVHJhdmVyc2VyU2V0PFM+IGJhcnJpZXI7Ci0KLSAgICBwdWJsaWMgQWdncmVnYXRlU3RlcChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdHJhdmVyc2FsLCBmaW5hbCBTdHJpbmcgc2lkZUVmZmVjdEtleSkgewotICAgICAgICBzdXBlcih0cmF2ZXJzYWwpOwotICAgICAgICB0aGlzLnNpZGVFZmZlY3RLZXkgPSBzaWRlRWZmZWN0S2V5OwotICAgICAgICB0aGlzLmJhcnJpZXIgPSAoVHJhdmVyc2VyU2V0PFM+KSB0aGlzLnRyYXZlcnNhbC5nZXRUcmF2ZXJzZXJTZXRTdXBwbGllcigpLmdldCgpOwotICAgICAgICB0aGlzLmdldFRyYXZlcnNhbCgpLmdldFNpZGVFZmZlY3RzKCkucmVnaXN0ZXJJZkFic2VudCh0aGlzLnNpZGVFZmZlY3RLZXksIChTdXBwbGllcikgQnVsa1NldFN1cHBsaWVyLmluc3RhbmNlKCksIE9wZXJhdG9yLmFkZEFsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTaWRlRWZmZWN0S2V5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5zaWRlRWZmZWN0S2V5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmdGYWN0b3J5LnN0ZXBTdHJpbmcodGhpcywgdGhpcy5zaWRlRWZmZWN0S2V5LCB0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbW9kdWxhdGVCeShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gYWdncmVnYXRlVHJhdmVyc2FsKSB7Ci0gICAgICAgIHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsID0gdGhpcy5pbnRlZ3JhdGVDaGlsZChhZ2dyZWdhdGVUcmF2ZXJzYWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFRyYXZlcnNhbC5BZG1pbjxTLCBPYmplY3Q+PiBnZXRMb2NhbENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gbnVsbCA9PSB0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbCA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxUcmF2ZXJzZXJSZXF1aXJlbWVudD4gZ2V0UmVxdWlyZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWxmQW5kQ2hpbGRSZXF1aXJlbWVudHMoVHJhdmVyc2VyUmVxdWlyZW1lbnQuQlVMSywgVHJhdmVyc2VyUmVxdWlyZW1lbnQuU0lERV9FRkZFQ1RTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWdncmVnYXRlU3RlcDxTPiBjbG9uZSgpIHsKLSAgICAgICAgZmluYWwgQWdncmVnYXRlU3RlcDxTPiBjbG9uZSA9IChBZ2dyZWdhdGVTdGVwPFM+KSBzdXBlci5jbG9uZSgpOwotICAgICAgICBjbG9uZS5iYXJyaWVyID0gKFRyYXZlcnNlclNldDxTPikgdGhpcy50cmF2ZXJzYWwuZ2V0VHJhdmVyc2VyU2V0U3VwcGxpZXIoKS5nZXQoKTsKLSAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5hZ2dyZWdhdGVUcmF2ZXJzYWwpCi0gICAgICAgICAgICBjbG9uZS5hZ2dyZWdhdGVUcmF2ZXJzYWwgPSB0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbC5jbG9uZSgpOwotICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VHJhdmVyc2FsKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBwYXJlbnRUcmF2ZXJzYWwpIHsKLSAgICAgICAgc3VwZXIuc2V0VHJhdmVyc2FsKHBhcmVudFRyYXZlcnNhbCk7Ci0gICAgICAgIHRoaXMuaW50ZWdyYXRlQ2hpbGQodGhpcy5hZ2dyZWdhdGVUcmF2ZXJzYWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCByZXN1bHQgPSBzdXBlci5oYXNoQ29kZSgpIF4gdGhpcy5zaWRlRWZmZWN0S2V5Lmhhc2hDb2RlKCk7Ci0gICAgICAgIGlmICh0aGlzLmFnZ3JlZ2F0ZVRyYXZlcnNhbCAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0IF49IHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsLmhhc2hDb2RlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFRyYXZlcnNlci5BZG1pbjxTPiBwcm9jZXNzTmV4dFN0YXJ0KCkgewotICAgICAgICBpZiAodGhpcy5iYXJyaWVyLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhpcy5wcm9jZXNzQWxsU3RhcnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFycmllci5yZW1vdmUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQWxsU3RhcnRzKCkgewotICAgICAgICBpZiAodGhpcy5zdGFydHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBCdWxrU2V0PE9iamVjdD4gYnVsa1NldCA9IG5ldyBCdWxrU2V0PD4oKTsKLSAgICAgICAgICAgIHdoaWxlICh0aGlzLnN0YXJ0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyID0gdGhpcy5zdGFydHMubmV4dCgpOwotICAgICAgICAgICAgICAgIGJ1bGtTZXQuYWRkKFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZSh0cmF2ZXJzZXIsIHRoaXMuYWdncmVnYXRlVHJhdmVyc2FsKSwgdHJhdmVyc2VyLmJ1bGsoKSk7Ci0gICAgICAgICAgICAgICAgdHJhdmVyc2VyLnNldFN0ZXBJZCh0aGlzLmdldE5leHRTdGVwKCkuZ2V0SWQoKSk7IC8vIHdoZW4gYmFycmllciBpcyByZWxvYWRlZCwgdGhlIHRyYXZlcnNlcnMgc2hvdWxkIGJlIGF0IHRoZSBuZXh0IHN0ZXAKLSAgICAgICAgICAgICAgICB0aGlzLmJhcnJpZXIuYWRkKHRyYXZlcnNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmdldFRyYXZlcnNhbCgpLmdldFNpZGVFZmZlY3RzKCkuYWRkKHRoaXMuc2lkZUVmZmVjdEtleSwgYnVsa1NldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0QmFycmllcigpIHsKLSAgICAgICAgaWYgKHRoaXMuYmFycmllci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FsbFN0YXJ0cygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAhdGhpcy5iYXJyaWVyLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVHJhdmVyc2VyU2V0PFM+IG5leHRCYXJyaWVyKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5iYXJyaWVyLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhpcy5wcm9jZXNzQWxsU3RhcnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMuYmFycmllci5pc0VtcHR5KCkpCi0gICAgICAgICAgICB0aHJvdyBGYXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbi5pbnN0YW5jZSgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNlclNldDxTPiB0ZW1wID0gdGhpcy5iYXJyaWVyOwotICAgICAgICAgICAgdGhpcy5iYXJyaWVyID0gKFRyYXZlcnNlclNldDxTPikgdGhpcy50cmF2ZXJzYWwuZ2V0VHJhdmVyc2VyU2V0U3VwcGxpZXIoKS5nZXQoKTsKLSAgICAgICAgICAgIHJldHVybiB0ZW1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQmFycmllcihmaW5hbCBUcmF2ZXJzZXJTZXQ8Uz4gYmFycmllcikgewotICAgICAgICB0aGlzLmJhcnJpZXIuYWRkQWxsKGJhcnJpZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBzdXBlci5yZXNldCgpOwotICAgICAgICB0aGlzLmJhcnJpZXIuY2xlYXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9Hcm91cENvdW50U2lkZUVmZmVjdFN0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0dyb3VwQ291bnRTaWRlRWZmZWN0U3RlcC5qYXZhCmluZGV4IDg4YTFjYjcuLjQxZGRlZWYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0dyb3VwQ291bnRTaWRlRWZmZWN0U3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0dyb3VwQ291bnRTaWRlRWZmZWN0U3RlcC5qYXZhCkBAIC0xMDYsNCArMTA2LDEwIEBACiAgICAgcHVibGljIHZvaWQgbW9kdWxhdGVCeShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4ga2V5VHJhdmVyc2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewogICAgICAgICB0aGlzLmtleVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQoa2V5VHJhdmVyc2FsKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTG9jYWxDaGlsZChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gb2xkVHJhdmVyc2FsLCBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gbmV3VHJhdmVyc2FsKSB7CisgICAgICAgIGlmIChudWxsICE9IHRoaXMua2V5VHJhdmVyc2FsICYmIHRoaXMua2V5VHJhdmVyc2FsLmVxdWFscyhvbGRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgdGhpcy5rZXlUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKG5ld1RyYXZlcnNhbCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvR3JvdXBTaWRlRWZmZWN0U3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvR3JvdXBTaWRlRWZmZWN0U3RlcC5qYXZhCmluZGV4IGZkMzFiYzMuLjk0Njc0NjcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0dyb3VwU2lkZUVmZmVjdFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9Hcm91cFNpZGVFZmZlY3RTdGVwLmphdmEKQEAgLTI0LDEzICsyNCwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CYXJyaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CeU1vZHVsYXRpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLkdyb3VwaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5Qcm9maWxpbmdBd2FyZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuU2lkZUVmZmVjdENhcGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLkdyb3VwU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5Qcm9maWxlU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsSGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5UcmF2ZXJzYWxVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uSGFzaE1hcFN1cHBsaWVyOwpAQCAtNDQsNyArNDQsOCBAQAogLyoqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdyb3VwU2lkZUVmZmVjdFN0ZXA8UywgSywgVj4gZXh0ZW5kcyBTaWRlRWZmZWN0U3RlcDxTPiBpbXBsZW1lbnRzIFNpZGVFZmZlY3RDYXBhYmxlPE1hcDxLLCA/PiwgTWFwPEssIFY+PiwgVHJhdmVyc2FsUGFyZW50LCBCeU1vZHVsYXRpbmcsIFByb2ZpbGluZ0F3YXJlIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBHcm91cFNpZGVFZmZlY3RTdGVwPFMsIEssIFY+IGV4dGVuZHMgU2lkZUVmZmVjdFN0ZXA8Uz4KKyAgICAgICAgaW1wbGVtZW50cyBTaWRlRWZmZWN0Q2FwYWJsZTxNYXA8SywgPz4sIE1hcDxLLCBWPj4sIFRyYXZlcnNhbFBhcmVudCwgQnlNb2R1bGF0aW5nLCBQcm9maWxpbmdBd2FyZSwgR3JvdXBpbmc8UywgSywgVj4gewogCiAgICAgcHJpdmF0ZSBjaGFyIHN0YXRlID0gJ2snOwogICAgIHByaXZhdGUgVHJhdmVyc2FsLkFkbWluPFMsIEs+IGtleVRyYXZlcnNhbDsKQEAgLTU4LDcgKzU5LDcgQEAKICAgICAgICAgc3VwZXIodHJhdmVyc2FsKTsKICAgICAgICAgdGhpcy5zaWRlRWZmZWN0S2V5ID0gc2lkZUVmZmVjdEtleTsKICAgICAgICAgdGhpcy52YWx1ZVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQoX18uZm9sZCgpLmFzQWRtaW4oKSk7Ci0gICAgICAgIHRoaXMuYmFycmllclN0ZXAgPSBHcm91cFN0ZXAuZGV0ZXJtaW5lQmFycmllclN0ZXAodGhpcy52YWx1ZVRyYXZlcnNhbCk7CisgICAgICAgIHRoaXMuYmFycmllclN0ZXAgPSBkZXRlcm1pbmVCYXJyaWVyU3RlcCh0aGlzLnZhbHVlVHJhdmVyc2FsKTsKICAgICAgICAgdGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRTaWRlRWZmZWN0cygpLnJlZ2lzdGVySWZBYnNlbnQodGhpcy5zaWRlRWZmZWN0S2V5LCBIYXNoTWFwU3VwcGxpZXIuaW5zdGFuY2UoKSwKICAgICAgICAgICAgICAgICBuZXcgR3JvdXBTdGVwLkdyb3VwQmlPcGVyYXRvcjw+KG51bGwgPT0gdGhpcy5iYXJyaWVyU3RlcCA/CiAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvci5hc3NpZ24gOgpAQCAtNzUsMTcgKzc2LDMxIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRyYXZlcnNhbC5BZG1pbjxTLCBLPiBnZXRLZXlUcmF2ZXJzYWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmtleVRyYXZlcnNhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHJhdmVyc2FsLkFkbWluPFMsIFY+IGdldFZhbHVlVHJhdmVyc2FsKCkgeworICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVRyYXZlcnNhbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVUcmF2ZXJzYWwoZmluYWwgVHJhdmVyc2FsLkFkbWluIHZhbHVlVHJhdmVyc2FsKSB7CisgICAgICAgIHRoaXMudmFsdWVUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKGNvbnZlcnRWYWx1ZVRyYXZlcnNhbCh2YWx1ZVRyYXZlcnNhbCkpOworICAgICAgICB0aGlzLmJhcnJpZXJTdGVwID0gZGV0ZXJtaW5lQmFycmllclN0ZXAodGhpcy52YWx1ZVRyYXZlcnNhbCk7CisgICAgICAgIHRoaXMuZ2V0VHJhdmVyc2FsKCkuZ2V0U2lkZUVmZmVjdHMoKS5yZWdpc3Rlcih0aGlzLnNpZGVFZmZlY3RLZXksIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IEdyb3VwU3RlcC5Hcm91cEJpT3BlcmF0b3I8PihudWxsID09IHRoaXMuYmFycmllclN0ZXAgPworICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IuYXNzaWduIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFycmllclN0ZXAuZ2V0TWVtb3J5Q29tcHV0ZUtleSgpLmdldFJlZHVjZXIoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1vZHVsYXRlQnkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IGt2VHJhdmVyc2FsKSB7CiAgICAgICAgIGlmICgnaycgPT0gdGhpcy5zdGF0ZSkgewogICAgICAgICAgICAgdGhpcy5rZXlUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKGt2VHJhdmVyc2FsKTsKICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAndic7CiAgICAgICAgIH0gZWxzZSBpZiAoJ3YnID09IHRoaXMuc3RhdGUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWVUcmF2ZXJzYWwgPSB0aGlzLmludGVncmF0ZUNoaWxkKEdyb3VwU3RlcC5jb252ZXJ0VmFsdWVUcmF2ZXJzYWwoa3ZUcmF2ZXJzYWwpKTsKLSAgICAgICAgICAgIHRoaXMuYmFycmllclN0ZXAgPSBHcm91cFN0ZXAuZGV0ZXJtaW5lQmFycmllclN0ZXAodGhpcy52YWx1ZVRyYXZlcnNhbCk7Ci0gICAgICAgICAgICB0aGlzLmdldFRyYXZlcnNhbCgpLmdldFNpZGVFZmZlY3RzKCkucmVnaXN0ZXIodGhpcy5zaWRlRWZmZWN0S2V5LCBudWxsLAotICAgICAgICAgICAgICAgICAgICBuZXcgR3JvdXBTdGVwLkdyb3VwQmlPcGVyYXRvcjw+KG51bGwgPT0gdGhpcy5iYXJyaWVyU3RlcCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IuYXNzaWduIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnJpZXJTdGVwLmdldE1lbW9yeUNvbXB1dGVLZXkoKS5nZXRSZWR1Y2VyKCkpKTsKKyAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVUcmF2ZXJzYWwoa3ZUcmF2ZXJzYWwpOwogICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICd4JzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBrZXkgYW5kIHZhbHVlIHRyYXZlcnNhbHMgZm9yIGdyb3VwKCktc3RlcCBoYXZlIGFscmVhZHkgYmVlbiBzZXQ6ICIgKyB0aGlzKTsKQEAgLTkzLDYgKzEwOCwxNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VMb2NhbENoaWxkKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBvbGRUcmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBuZXdUcmF2ZXJzYWwpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5rZXlUcmF2ZXJzYWwgJiYgdGhpcy5rZXlUcmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpCisgICAgICAgICAgICB0aGlzLmtleVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQobmV3VHJhdmVyc2FsKTsKKyAgICAgICAgZWxzZSBpZiAobnVsbCAhPSB0aGlzLnZhbHVlVHJhdmVyc2FsICYmIHRoaXMudmFsdWVUcmF2ZXJzYWwuZXF1YWxzKG9sZFRyYXZlcnNhbCkpCisgICAgICAgICAgICB0aGlzLnNldFZhbHVlVHJhdmVyc2FsKG5ld1RyYXZlcnNhbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2lkZUVmZmVjdChmaW5hbCBUcmF2ZXJzZXIuQWRtaW48Uz4gdHJhdmVyc2VyKSB7CiAgICAgICAgIGZpbmFsIE1hcDxLLCBWPiBtYXAgPSBuZXcgSGFzaE1hcDw+KDEpOwogICAgICAgICB0aGlzLnZhbHVlVHJhdmVyc2FsLnJlc2V0KCk7CkBAIC0xMDEsNyArMTI0LDcgQEAKICAgICAgICAgLy8gcmVzZXQgdGhlIGJhcnJpZXJTdGVwIGFzIHRoZXJlIGFyZSBub3cgUHJvZmlsZVN0ZXAgaW5zdGFuY2VzIHByZXNlbnQgYW5kIHRoZSB0aW1lcnMgd29uJ3Qgc3RhcnQgcmlnaHQKICAgICAgICAgLy8gd2l0aG91dCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHRocm91Z2ggd3JhcHBpbmcgYm90aCB0aGUgQmFycmllciBhbmQgUHJvZmlsZVN0ZXAgaW4gUHJvZmlsZWRCYXJyaWVyCiAgICAgICAgIGlmIChyZXNldEJhcnJpZXJGb3JQcm9maWxpbmcpIHsKLSAgICAgICAgICAgIGJhcnJpZXJTdGVwID0gR3JvdXBTdGVwLmRldGVybWluZUJhcnJpZXJTdGVwKHZhbHVlVHJhdmVyc2FsKTsKKyAgICAgICAgICAgIGJhcnJpZXJTdGVwID0gZGV0ZXJtaW5lQmFycmllclN0ZXAodmFsdWVUcmF2ZXJzYWwpOwogCiAgICAgICAgICAgICAvLyB0aGUgYmFycmllciBvbmx5IG5lZWRzIHRvIGJlIHJlc2V0IG9uY2UKICAgICAgICAgICAgIHJlc2V0QmFycmllckZvclByb2ZpbGluZyA9IGZhbHNlOwpAQCAtMTQ2LDcgKzE2OSw3IEBACiAgICAgICAgIGlmIChudWxsICE9IHRoaXMua2V5VHJhdmVyc2FsKQogICAgICAgICAgICAgY2xvbmUua2V5VHJhdmVyc2FsID0gdGhpcy5rZXlUcmF2ZXJzYWwuY2xvbmUoKTsKICAgICAgICAgY2xvbmUudmFsdWVUcmF2ZXJzYWwgPSB0aGlzLnZhbHVlVHJhdmVyc2FsLmNsb25lKCk7Ci0gICAgICAgIGNsb25lLmJhcnJpZXJTdGVwID0gR3JvdXBTdGVwLmRldGVybWluZUJhcnJpZXJTdGVwKGNsb25lLnZhbHVlVHJhdmVyc2FsKTsKKyAgICAgICAgY2xvbmUuYmFycmllclN0ZXAgPSBkZXRlcm1pbmVCYXJyaWVyU3RlcChjbG9uZS52YWx1ZVRyYXZlcnNhbCk7CiAgICAgICAgIHJldHVybiBjbG9uZTsKICAgICB9CiAKQEAgLTE2Nyw2ICsxOTAsNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1hcDxLLCBWPiBnZW5lcmF0ZUZpbmFsUmVzdWx0KGZpbmFsIE1hcDxLLCA/PiBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIEdyb3VwU3RlcC5kb0ZpbmFsUmVkdWN0aW9uKChNYXA8SywgT2JqZWN0Pikgb2JqZWN0LCB0aGlzLnZhbHVlVHJhdmVyc2FsKTsKKyAgICAgICAgcmV0dXJuIGRvRmluYWxSZWR1Y3Rpb24oKE1hcDxLLCBPYmplY3Q+KSBvYmplY3QsIHRoaXMudmFsdWVUcmF2ZXJzYWwpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9Jb1N0ZXAuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0lvU3RlcC5qYXZhCmluZGV4IDY0YTkwMzUuLmRjNWYwNDAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0lvU3RlcC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0lvU3RlcC5qYXZhCkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBHcnlvTWFwcGVyLkJ1aWxkZXIgYnVpbGRlciA9IEdyeW9NYXBwZXIuYnVpbGQoKTsKICAgICAgICAgICAgICAgICBkZXRlY3RSZWdpc3RyaWVzKCkuZm9yRWFjaChidWlsZGVyOjphZGRSZWdpc3RyeSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEdyeW9Xcml0ZXIuYnVpbGQoKS5tYXBwZXIoYnVpbGRlci5jcmVhdGUoKSkuY3JlYXRlKCk7Ci0gICAgICAgICAgICB9ZWxzZSBpZiAob2JqZWN0T3JDbGFzcy5lcXVhbHMoSU8uZ3JhcGhtbCkpCisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdE9yQ2xhc3MuZXF1YWxzKElPLmdyYXBobWwpKQogICAgICAgICAgICAgICAgIHJldHVybiBHcmFwaE1MV3JpdGVyLmJ1aWxkKCkuY3JlYXRlKCk7CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvU2Fja1ZhbHVlU3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvU2Fja1ZhbHVlU3RlcC5qYXZhCmluZGV4IDY1MDE0MGUuLmJkMGU4MjggMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L1NhY2tWYWx1ZVN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9TYWNrVmFsdWVTdGVwLmphdmEKQEAgLTUyLDYgKzUyLDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUxvY2FsQ2hpbGQoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICBpZiAobnVsbCAhPSB0aGlzLnNhY2tUcmF2ZXJzYWwgJiYgdGhpcy5zYWNrVHJhdmVyc2FsLmVxdWFscyhvbGRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgdGhpcy5zYWNrVHJhdmVyc2FsID0gdGhpcy5pbnRlZ3JhdGVDaGlsZChuZXdUcmF2ZXJzYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PFRyYXZlcnNhbC5BZG1pbjxTLCBCPj4gZ2V0TG9jYWxDaGlsZHJlbigpIHsKICAgICAgICAgcmV0dXJuIG51bGwgPT0gdGhpcy5zYWNrVHJhdmVyc2FsID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRoaXMuc2Fja1RyYXZlcnNhbCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvU3RvcmVTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9TdG9yZVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1YjBjNi4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9TdG9yZVN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLk9wZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CeU1vZHVsYXRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlNpZGVFZmZlY3RDYXBhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5UcmF2ZXJzYWxQYXJlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuQnVsa1NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLlN0cmluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkJ1bGtTZXRTdXBwbGllcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLQotLyoqCi0gKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0b3JlU3RlcDxTPiBleHRlbmRzIFNpZGVFZmZlY3RTdGVwPFM+IGltcGxlbWVudHMgU2lkZUVmZmVjdENhcGFibGU8Q29sbGVjdGlvbiwgQ29sbGVjdGlvbj4sIFRyYXZlcnNhbFBhcmVudCwgQnlNb2R1bGF0aW5nIHsKLQotICAgIHByaXZhdGUgVHJhdmVyc2FsLkFkbWluPFMsIE9iamVjdD4gc3RvcmVUcmF2ZXJzYWwgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHNpZGVFZmZlY3RLZXk7Ci0KLSAgICBwdWJsaWMgU3RvcmVTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwsIGZpbmFsIFN0cmluZyBzaWRlRWZmZWN0S2V5KSB7Ci0gICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7Ci0gICAgICAgIHRoaXMuc2lkZUVmZmVjdEtleSA9IHNpZGVFZmZlY3RLZXk7Ci0gICAgICAgIHRoaXMuZ2V0VHJhdmVyc2FsKCkuZ2V0U2lkZUVmZmVjdHMoKS5yZWdpc3RlcklmQWJzZW50KHRoaXMuc2lkZUVmZmVjdEtleSwgKFN1cHBsaWVyKSBCdWxrU2V0U3VwcGxpZXIuaW5zdGFuY2UoKSwgT3BlcmF0b3IuYWRkQWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzaWRlRWZmZWN0KGZpbmFsIFRyYXZlcnNlci5BZG1pbjxTPiB0cmF2ZXJzZXIpIHsKLSAgICAgICAgZmluYWwgQnVsa1NldDxPYmplY3Q+IGJ1bGtTZXQgPSBuZXcgQnVsa1NldDw+KCk7Ci0gICAgICAgIGJ1bGtTZXQuYWRkKFRyYXZlcnNhbFV0aWwuYXBwbHlOdWxsYWJsZSh0cmF2ZXJzZXIsIHRoaXMuc3RvcmVUcmF2ZXJzYWwpLCB0cmF2ZXJzZXIuYnVsaygpKTsKLSAgICAgICAgdGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRTaWRlRWZmZWN0cygpLmFkZCh0aGlzLnNpZGVFZmZlY3RLZXksIGJ1bGtTZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lkZUVmZmVjdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2lkZUVmZmVjdEtleTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nRmFjdG9yeS5zdGVwU3RyaW5nKHRoaXMsIHRoaXMuc2lkZUVmZmVjdEtleSwgdGhpcy5zdG9yZVRyYXZlcnNhbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8VHJhdmVyc2FsLkFkbWluPFMsIE9iamVjdD4+IGdldExvY2FsQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBudWxsID09IHRoaXMuc3RvcmVUcmF2ZXJzYWwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGhpcy5zdG9yZVRyYXZlcnNhbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbW9kdWxhdGVCeShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gc3RvcmVUcmF2ZXJzYWwpIHsKLSAgICAgICAgdGhpcy5zdG9yZVRyYXZlcnNhbCA9IHRoaXMuaW50ZWdyYXRlQ2hpbGQoc3RvcmVUcmF2ZXJzYWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXQ8VHJhdmVyc2VyUmVxdWlyZW1lbnQ+IGdldFJlcXVpcmVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZkFuZENoaWxkUmVxdWlyZW1lbnRzKFRyYXZlcnNlclJlcXVpcmVtZW50LlNJREVfRUZGRUNUUywgVHJhdmVyc2VyUmVxdWlyZW1lbnQuQlVMSyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0b3JlU3RlcDxTPiBjbG9uZSgpIHsKLSAgICAgICAgZmluYWwgU3RvcmVTdGVwPFM+IGNsb25lID0gKFN0b3JlU3RlcDxTPikgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5zdG9yZVRyYXZlcnNhbCkKLSAgICAgICAgICAgIGNsb25lLnN0b3JlVHJhdmVyc2FsID0gdGhpcy5zdG9yZVRyYXZlcnNhbC5jbG9uZSgpOwotICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VHJhdmVyc2FsKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBwYXJlbnRUcmF2ZXJzYWwpIHsKLSAgICAgICAgc3VwZXIuc2V0VHJhdmVyc2FsKHBhcmVudFRyYXZlcnNhbCk7Ci0gICAgICAgIHRoaXMuaW50ZWdyYXRlQ2hpbGQodGhpcy5zdG9yZVRyYXZlcnNhbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IHN1cGVyLmhhc2hDb2RlKCkgXiB0aGlzLnNpZGVFZmZlY3RLZXkuaGFzaENvZGUoKTsKLSAgICAgICAgaWYgKHRoaXMuc3RvcmVUcmF2ZXJzYWwgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCBePSB0aGlzLnN0b3JlVHJhdmVyc2FsLmhhc2hDb2RlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvVHJlZVNpZGVFZmZlY3RTdGVwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9UcmVlU2lkZUVmZmVjdFN0ZXAuamF2YQppbmRleCAyZDQzZGRjLi5jM2YwZmJkIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9UcmVlU2lkZUVmZmVjdFN0ZXAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9UcmVlU2lkZUVmZmVjdFN0ZXAuamF2YQpAQCAtMTE5LDYgKzExOSwxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VMb2NhbENoaWxkKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBvbGRUcmF2ZXJzYWwsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBuZXdUcmF2ZXJzYWwpIHsKKyAgICAgICAgdGhpcy50cmF2ZXJzYWxSaW5nLnJlcGxhY2VUcmF2ZXJzYWwoCisgICAgICAgICAgICAgICAgKFRyYXZlcnNhbC5BZG1pbjxPYmplY3QsIE9iamVjdD4pIG9sZFRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAoVHJhdmVyc2FsLkFkbWluPE9iamVjdCwgT2JqZWN0PikgbmV3VHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2V0PFRyYXZlcnNlclJlcXVpcmVtZW50PiBnZXRSZXF1aXJlbWVudHMoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmdldFNlbGZBbmRDaGlsZFJlcXVpcmVtZW50cyhUcmF2ZXJzZXJSZXF1aXJlbWVudC5QQVRILCBUcmF2ZXJzZXJSZXF1aXJlbWVudC5TSURFX0VGRkVDVFMpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC91dGlsL0Fic3RyYWN0U3RlcC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3V0aWwvQWJzdHJhY3RTdGVwLmphdmEKaW5kZXggMzJkNzdlOC4uNzkwMzcyMSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3V0aWwvQWJzdHJhY3RTdGVwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3V0aWwvQWJzdHJhY3RTdGVwLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIudXRpbC5FbXB0eVRyYXZlcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci51dGlsLlRyYXZlcnNlclNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuRW1wdHlUcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLlRyYXZlcnNhbEludGVycnVwdGVkRXhjZXB0aW9uOwpAQCAtNDMsNyArNDQsNyBAQAogICAgIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBUcmF2ZXJzZXIuQWRtaW4uSEFMVDsKICAgICBwcm90ZWN0ZWQgVHJhdmVyc2FsLkFkbWluIHRyYXZlcnNhbDsKICAgICBwcm90ZWN0ZWQgRXhwYW5kYWJsZVN0ZXBJdGVyYXRvcjxTPiBzdGFydHM7Ci0gICAgcHJvdGVjdGVkIFRyYXZlcnNlci5BZG1pbjxFPiBuZXh0RW5kID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgVHJhdmVyc2VyLkFkbWluPEU+IG5leHRFbmQgPSBFbXB0eVRyYXZlcnNlci5pbnN0YW5jZSgpOwogICAgIHByb3RlY3RlZCBib29sZWFuIHRyYXZlcnNlclN0ZXBJZEFuZExhYmVsc1NldEJ5Q2hpbGQgPSBmYWxzZTsKIAogICAgIHByb3RlY3RlZCBTdGVwPD8sIFM+IHByZXZpb3VzU3RlcCA9IEVtcHR5U3RlcC5pbnN0YW5jZSgpOwpAQCAtODMsNyArODQsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgICAgICB0aGlzLnN0YXJ0cy5jbGVhcigpOwotICAgICAgICB0aGlzLm5leHRFbmQgPSBudWxsOworICAgICAgICB0aGlzLm5leHRFbmQgPSBFbXB0eVRyYXZlcnNlci5pbnN0YW5jZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTE4LDE3ICsxMTksMTcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUcmF2ZXJzZXIuQWRtaW48RT4gbmV4dCgpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5uZXh0RW5kKSB7CisgICAgICAgIGlmIChFbXB0eVRyYXZlcnNlci5pbnN0YW5jZSgpICE9IHRoaXMubmV4dEVuZCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlVHJhdmVyc2FsRm9yTmV4dFN0ZXAodGhpcy5uZXh0RW5kKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5uZXh0RW5kID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHRFbmQgPSBFbXB0eVRyYXZlcnNlci5pbnN0YW5jZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICBpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHRocm93IG5ldyBUcmF2ZXJzYWxJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwogICAgICAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNlci5BZG1pbjxFPiB0cmF2ZXJzZXIgPSB0aGlzLnByb2Nlc3NOZXh0U3RhcnQoKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0cmF2ZXJzZXIuZ2V0KCkgJiYgMCAhPSB0cmF2ZXJzZXIuYnVsaygpKQorICAgICAgICAgICAgICAgIGlmICh0cmF2ZXJzZXIuYnVsaygpID4gMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVRyYXZlcnNhbEZvck5leHRTdGVwKHRyYXZlcnNlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNiwxNyArMTM3LDE3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICBpZiAobnVsbCAhPSB0aGlzLm5leHRFbmQpCisgICAgICAgIGlmIChFbXB0eVRyYXZlcnNlci5pbnN0YW5jZSgpICE9IHRoaXMubmV4dEVuZCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB0aHJvdyBuZXcgVHJhdmVyc2FsSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0RW5kID0gdGhpcy5wcm9jZXNzTmV4dFN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHRoaXMubmV4dEVuZC5nZXQoKSAmJiAwICE9IHRoaXMubmV4dEVuZC5idWxrKCkpCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRFbmQuYnVsaygpID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRFbmQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0RW5kID0gRW1wdHlUcmF2ZXJzZXIuaW5zdGFuY2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNzksNyArMTgwLDcgQEAKICAgICAgICAgICAgIGNsb25lLnN0YXJ0cyA9IG5ldyBFeHBhbmRhYmxlU3RlcEl0ZXJhdG9yPD4oY2xvbmUsIChUcmF2ZXJzZXJTZXQ8Uz4pIHRyYXZlcnNhbC5nZXRUcmF2ZXJzZXJTZXRTdXBwbGllcigpLmdldCgpKTsKICAgICAgICAgICAgIGNsb25lLnByZXZpb3VzU3RlcCA9IEVtcHR5U3RlcC5pbnN0YW5jZSgpOwogICAgICAgICAgICAgY2xvbmUubmV4dFN0ZXAgPSBFbXB0eVN0ZXAuaW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNsb25lLm5leHRFbmQgPSBudWxsOworICAgICAgICAgICAgY2xvbmUubmV4dEVuZCA9IEVtcHR5VHJhdmVyc2VyLmluc3RhbmNlKCk7CiAgICAgICAgICAgICBjbG9uZS50cmF2ZXJzYWwgPSBFbXB0eVRyYXZlcnNhbC5pbnN0YW5jZSgpOwogICAgICAgICAgICAgY2xvbmUubGFiZWxzID0gbmV3IExpbmtlZEhhc2hTZXQ8Pih0aGlzLmxhYmVscyk7CiAgICAgICAgICAgICBjbG9uZS5yZXNldCgpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3V0aWwvSW1tdXRhYmxlUGF0aC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3V0aWwvSW1tdXRhYmxlUGF0aC5qYXZhCmluZGV4IDYyM2I4MTAuLjFiNWU1NjIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC91dGlsL0ltbXV0YWJsZVBhdGguamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvdXRpbC9JbW11dGFibGVQYXRoLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKQEAgLTM1LDcgKzM2LDggQEAKICAqLwogcHVibGljIGNsYXNzIEltbXV0YWJsZVBhdGggaW1wbGVtZW50cyBQYXRoLCBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVQYXRoIFRBSUxfUEFUSCA9IG5ldyBJbW11dGFibGVQYXRoKG51bGwsIG51bGwsIG51bGwpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFTkQgPSBFbXB0eVBhdGguaW5zdGFuY2UoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVQYXRoIFRBSUxfUEFUSCA9IG5ldyBJbW11dGFibGVQYXRoKG51bGwsIEVORCwgbnVsbCk7CiAKICAgICBwcml2YXRlIEltbXV0YWJsZVBhdGggcHJldmlvdXNQYXRoOwogICAgIHByaXZhdGUgT2JqZWN0IGN1cnJlbnRPYmplY3Q7CkBAIC01OCw3ICs2MCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzVGFpbCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGwgPT0gdGhpcy5jdXJyZW50T2JqZWN0OworICAgICAgICByZXR1cm4gRU5ELmVxdWFscyh0aGlzLmN1cnJlbnRPYmplY3QpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjMwLDcgKzIzMiw3IEBACiAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICBpZiAoY3VycmVudFBhdGguaXNUYWlsKCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBoYXNoQ29kZXNbaW5kZXhdID0gY3VycmVudFBhdGguY3VycmVudE9iamVjdC5oYXNoQ29kZSgpOworICAgICAgICAgICAgaGFzaENvZGVzW2luZGV4XSA9IE9iamVjdHMuaGFzaENvZGUoY3VycmVudFBhdGguY3VycmVudE9iamVjdCk7CiAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoLnByZXZpb3VzUGF0aDsKICAgICAgICAgICAgIGluZGV4LS07CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC91dGlsL1BhcmFtZXRlcnMuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC91dGlsL1BhcmFtZXRlcnMuamF2YQppbmRleCA1Yzg2YWQ5Li5mMTZmZDcwIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvdXRpbC9QYXJhbWV0ZXJzLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3V0aWwvUGFyYW1ldGVycy5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIApAQCAtNzMsNiArNzQsMTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVja3MgZm9yIGV4aXN0ZW5jZSBvZiBhIGtleSBhbmQgdmFsdWUgaW4gYSBwYXJhbWV0ZXIgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGNoZWNrCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjaworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBrZXkgYW5kIHZhbHVlIGFyZSBwcmVzZW50IGFuZCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGZpbmFsIE9iamVjdCBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdGhpcy5jb250YWlucyhrZXkpICYmIHRoaXMucGFyYW1ldGVycy5nZXQoa2V5KS5jb250YWlucyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmVuYW1lcyBhIGtleSBpbiB0aGUgcGFyYW1ldGVyIHNldC4KICAgICAgKgogICAgICAqIEBwYXJhbSBvbGRLZXkgdGhlIGtleSB0byByZW5hbWUKQEAgLTE4MCwyNyArMTkyLDI0IEBACiAgICAgICAgICAgICBpZiAoIShrZXlWYWx1ZXNbaXhdIGluc3RhbmNlb2YgU3RyaW5nKSAmJiAhKGtleVZhbHVlc1tpeF0gaW5zdGFuY2VvZiBUKSAmJiAhKGtleVZhbHVlc1tpeF0gaW5zdGFuY2VvZiBUcmF2ZXJzYWwpKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwcm92aWRlZCBrZXkvdmFsdWUgYXJyYXkgbXVzdCBoYXZlIGEgU3RyaW5nLCBULCBvciBUcmF2ZXJzYWwgb24gZXZlbiBhcnJheSBpbmRpY2VzIik7CiAKLSAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaXggKyAxXSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBib3RoIGtleSBhbmQgdmFsdWUgZm9yIHRyYXZlcnNhbCBpbnN0YW5jZXMuIHRyYWNrIHRoZSBsaXN0IG9mIHRyYXZlcnNhbHMgdGhhdCBhcmUgcHJlc2VudCBzbwotICAgICAgICAgICAgICAgIC8vIHRoYXQgZWxzZXdoZXJlIGluIFBhcmFtZXRlcnMgdGhlcmUgaXMgbm8gbmVlZCB0byBpdGVyYXRlIGFsbCB2YWx1ZXMgdG8gbm90IGZpbmQgYW55LiBhbHNvIGdyYWIKLSAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgbGFiZWxzIGluIHRyYXZlcnNhbCB2YWx1ZXMKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpeSA9IDA7IGl5IDwgMjsgaXkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5VmFsdWVzW2l4ICsgaXldIGluc3RhbmNlb2YgVHJhdmVyc2FsLkFkbWluKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdCA9IChUcmF2ZXJzYWwuQWRtaW4pIGtleVZhbHVlc1tpeCArIGl5XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRyYXZlcnNhbCh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgcGFyZW50LmludGVncmF0ZUNoaWxkKHQpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBib3RoIGtleSBhbmQgdmFsdWUgZm9yIHRyYXZlcnNhbCBpbnN0YW5jZXMuIHRyYWNrIHRoZSBsaXN0IG9mIHRyYXZlcnNhbHMgdGhhdCBhcmUgcHJlc2VudCBzbworICAgICAgICAgICAgLy8gdGhhdCBlbHNld2hlcmUgaW4gUGFyYW1ldGVycyB0aGVyZSBpcyBubyBuZWVkIHRvIGl0ZXJhdGUgYWxsIHZhbHVlcyB0byBub3QgZmluZCBhbnkuIGFsc28gZ3JhYgorICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGxhYmVscyBpbiB0cmF2ZXJzYWwgdmFsdWVzCisgICAgICAgICAgICBmb3IgKGludCBpeSA9IDA7IGl5IDwgMjsgaXkrKykgeworICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaXggKyBpeV0gaW5zdGFuY2VvZiBUcmF2ZXJzYWwuQWRtaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJhdmVyc2FsLkFkbWluIHQgPSAoVHJhdmVyc2FsLkFkbWluKSBrZXlWYWx1ZXNbaXggKyBpeV07CisgICAgICAgICAgICAgICAgICAgIGFkZFRyYXZlcnNhbCh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSBwYXJlbnQuaW50ZWdyYXRlQ2hpbGQodCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IHZhbHVlcyA9IHRoaXMucGFyYW1ldGVycy5nZXQoa2V5VmFsdWVzW2l4XSk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGtleVZhbHVlc1tpeCArIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnB1dChrZXlWYWx1ZXNbaXhdLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoa2V5VmFsdWVzW2l4ICsgMV0pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWx1ZXMgPSB0aGlzLnBhcmFtZXRlcnMuZ2V0KGtleVZhbHVlc1tpeF0pOworICAgICAgICAgICAgaWYgKG51bGwgPT0gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChrZXlWYWx1ZXNbaXggKyAxXSk7CisgICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnB1dChrZXlWYWx1ZXNbaXhdLCB2YWx1ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGtleVZhbHVlc1tpeCArIDFdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1NCw3ICsyNjMsNyBAQAogICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZW50cnkgOiB0aGlzLnBhcmFtZXRlcnMuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgcmVzdWx0IF49IGVudHJ5LmdldEtleSgpLmhhc2hDb2RlKCk7CiAgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCB2YWx1ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgXj0gSW50ZWdlci5yb3RhdGVMZWZ0KHZhbHVlLmhhc2hDb2RlKCksIGVudHJ5LmdldEtleSgpLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgIHJlc3VsdCBePSBJbnRlZ2VyLnJvdGF0ZUxlZnQoT2JqZWN0cy5oYXNoQ29kZSh2YWx1ZSksIGVudHJ5LmdldEtleSgpLmhhc2hDb2RlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L1RyYXZlcnNhbFN0cmF0ZWd5UHJveHkuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvVHJhdmVyc2FsU3RyYXRlZ3lQcm94eS5qYXZhCmluZGV4IDhjOWMyOWEuLjE3ZTM5MmUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvVHJhdmVyc2FsU3RyYXRlZ3lQcm94eS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvVHJhdmVyc2FsU3RyYXRlZ3lQcm94eS5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5CeXRlY29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNvdXJjZTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9FbGVtZW50SWRTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0VsZW1lbnRJZFN0cmF0ZWd5LmphdmEKaW5kZXggMjVhMjgzMy4uOTAzZWEzYSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0VsZW1lbnRJZFN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0VsZW1lbnRJZFN0cmF0ZWd5LmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLk1hcENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5QOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5QYXJhbWV0ZXJpemluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9IYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0hhbHRlZFRyYXZlcnNlclN0cmF0ZWd5LmphdmEKaW5kZXggM2YwMmM0MC4uOTg4ZDgxOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0hhbHRlZFRyYXZlcnNlclN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0hhbHRlZFRyYXZlcnNlclN0cmF0ZWd5LmphdmEKQEAgLTE5LDggKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLk1hcENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9PcHRpb25zU3RyYXRlZ3kuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9PcHRpb25zU3RyYXRlZ3kuamF2YQppbmRleCBmZDY0ZDdmLi4xYTdhODFmIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vT3B0aW9uc1N0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL09wdGlvbnNTdHJhdGVneS5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5BYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5OwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1BhcnRpdGlvblN0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vUGFydGl0aW9uU3RyYXRlZ3kuamF2YQppbmRleCAxMTE2MDliLi4yMTAzYmY1IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vUGFydGl0aW9uU3RyYXRlZ3kuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vUGFydGl0aW9uU3RyYXRlZ3kuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlBhcmFtZXRlcml6aW5nOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuU3RlcDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9SZXF1aXJlbWVudHNTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1JlcXVpcmVtZW50c1N0cmF0ZWd5LmphdmEKaW5kZXggNzhjNDhiOC4uY2Q5ZDY2MyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1JlcXVpcmVtZW50c1N0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1JlcXVpcmVtZW50c1N0cmF0ZWd5LmphdmEKQEAgLTQ0LDEyICs0NCwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgewotICAgICAgICBpZiAodHJhdmVyc2FsLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRW1wdHlTdGVwICYmICF0aGlzLnJlcXVpcmVtZW50cy5pc0VtcHR5KCkpCisgICAgICAgIGlmICh0cmF2ZXJzYWwuaXNSb290KCkgJiYgIXRoaXMucmVxdWlyZW1lbnRzLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHRyYXZlcnNhbC5hZGRTdGVwKG5ldyBSZXF1aXJlbWVudHNTdGVwPD4odHJhdmVyc2FsLCB0aGlzLnJlcXVpcmVtZW50cykpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZXF1aXJlbWVudHMoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ2llcyB0cmF2ZXJzYWxTdHJhdGVnaWVzLCBmaW5hbCBUcmF2ZXJzZXJSZXF1aXJlbWVudC4uLiByZXF1aXJlbWVudHMpIHsKLSAgICAgICAgUmVxdWlyZW1lbnRzU3RyYXRlZ3kgc3RyYXRlZ3kgPSAoUmVxdWlyZW1lbnRzU3RyYXRlZ3kpIHRyYXZlcnNhbFN0cmF0ZWdpZXMudG9MaXN0KCkuc3RyZWFtKCkuZmlsdGVyKHMgLT4gcyBpbnN0YW5jZW9mIFJlcXVpcmVtZW50c1N0cmF0ZWd5KS5maW5kQW55KCkub3JFbHNlKG51bGwpOworICAgICAgICBSZXF1aXJlbWVudHNTdHJhdGVneSBzdHJhdGVneSA9IChSZXF1aXJlbWVudHNTdHJhdGVneSkgdHJhdmVyc2FsU3RyYXRlZ2llcy5nZXRTdHJhdGVneShSZXF1aXJlbWVudHNTdHJhdGVneS5jbGFzcykub3JFbHNlKG51bGwpOwogICAgICAgICBpZiAobnVsbCA9PSBzdHJhdGVneSkgewogICAgICAgICAgICAgc3RyYXRlZ3kgPSBuZXcgUmVxdWlyZW1lbnRzU3RyYXRlZ3koKTsKICAgICAgICAgICAgIHRyYXZlcnNhbFN0cmF0ZWdpZXMuYWRkU3RyYXRlZ2llcyhzdHJhdGVneSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU2Fja1N0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU2Fja1N0cmF0ZWd5LmphdmEKaW5kZXggMDU5OGQxNy4uZTMyMWY4YyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1NhY2tTdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9TYWNrU3RyYXRlZ3kuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgewotICAgICAgICBpZiAodHJhdmVyc2FsLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRW1wdHlTdGVwKQorICAgICAgICBpZiAodHJhdmVyc2FsLmlzUm9vdCgpKQogICAgICAgICAgICAgdHJhdmVyc2FsLmdldFNpZGVFZmZlY3RzKCkuc2V0U2Fjayh0aGlzLmluaXRpYWxWYWx1ZSwgdGhpcy5zcGxpdE9wZXJhdG9yLCB0aGlzLm1lcmdlT3BlcmF0b3IpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1NlZWRTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1NlZWRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjkzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU2VlZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlNlZWRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuQWJzdHJhY3RUcmF2ZXJzYWxTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsSGVscGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBIHN0cmF0ZWd5IHRoYXQgcmVzZXRzIHRoZSBzcGVjaWZpZWQge0Bjb2RlIHNlZWR9IHZhbHVlIGZvciB7QGxpbmsgU2VlZGFibGV9IHN0ZXBzLCB3aGljaCBpbiB0dXJuIHdpbGwgcHJvZHVjZQorICogZGV0ZXJtaW5pc3RpYyByZXN1bHRzIGZyb20gdGhvc2Ugc3RlcHMuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgd2hlbiB1c2luZyB0aGlzIHN0cmF0ZWd5IHRoYXQgaXQgb25seQorICogZ3VhcmFudGVlcyBkZXRlcm1pbmlzdGljIHJlc3VsdHMgZnJvbSBhIHN0ZXAgYnV0IG5vdCBmcm9tIGFuIGVudGlyZSB0cmF2ZXJzYWwuIEZvciBleGFtcGxlLCBpZiBhIGdyYXBoIGRvZXMgbm8KKyAqIGd1YXJhbnRlZSBpdGVyYXRpb24gb3JkZXIgZm9yIHtAY29kZSBnLlYoKX0gdGhlbiByZXBlYXRlZCBydW5zIG9mIHtAY29kZSBnLlYoKS5jb2luKDAuNSl9IHdpdGggdGhpcyBzdHJhdGVneQorICogd2lsbCByZXR1cm4gdGhlIHNhbWUgbnVtYmVyIG9mIHJlc3VsdHMgYnV0IG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvbmVzLiBUaGUgc2FtZSBwcm9ibGVtIGNhbiBvY2N1ciBpbiBPTEFQLWJhc2VkCisgKiB0cmF2ZXJzYWxzIHdoZXJlIGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZXhwbGljaXRseSBndWFyYW50ZWVkLiBUaGUgb25seSB3YXkgdG8gZW5zdXJlIGNvbXBsZXRlbHkgZGV0ZXJtaW5pc3RpYworICogcmVzdWx0cyBpbiB0aGF0IHNlbnNlIGlzIHRvIGFwcGx5IHNvbWUgZm9ybSBvZiB7QGNvZGUgb3JkZXIoKX0gaW4gdGhlc2UgY2FzZXMKKyAqLworcHVibGljIGNsYXNzIFNlZWRTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VHJhdmVyc2FsU3RyYXRlZ3k8VHJhdmVyc2FsU3RyYXRlZ3kuRGVjb3JhdGlvblN0cmF0ZWd5PgorICAgICAgICBpbXBsZW1lbnRzIFRyYXZlcnNhbFN0cmF0ZWd5LkRlY29yYXRpb25TdHJhdGVneSB7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgc2VlZDsKKworICAgIHB1YmxpYyBTZWVkU3RyYXRlZ3koZmluYWwgbG9uZyBzZWVkKSB7CisgICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0U2VlZCgpIHsKKyAgICAgICAgcmV0dXJuIHNlZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgeworICAgICAgICBmaW5hbCBMaXN0PFNlZWRhYmxlPiBzZWVkYWJsZVN0ZXBzID0gVHJhdmVyc2FsSGVscGVyLmdldFN0ZXBzT2ZBc3NpZ25hYmxlQ2xhc3MoU2VlZGFibGUuY2xhc3MsIHRyYXZlcnNhbCk7CisgICAgICAgIGZvciAoZmluYWwgU2VlZGFibGUgc2VlZGFibGVTdGVwc1RvUmVzZXQgOiBzZWVkYWJsZVN0ZXBzKSB7CisgICAgICAgICAgICBzZWVkYWJsZVN0ZXBzVG9SZXNldC5yZXNldFNlZWQoc2VlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TRUVEID0gInNlZWQiOworCisgICAgcHVibGljIHN0YXRpYyBTZWVkU3RyYXRlZ3kgY3JlYXRlKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoSURfU0VFRCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZWVkU3RyYXRlZ3kgY29uZmlndXJhdGlvbiByZXF1aXJlcyBhICdzZWVkJyB2YWx1ZSIpOworCisgICAgICAgIHJldHVybiBuZXcgU2VlZFN0cmF0ZWd5KExvbmcucGFyc2VMb25nKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoSURfU0VFRCkudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBtYXAucHV0KFNUUkFURUdZLCBTZWVkU3RyYXRlZ3kuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgbWFwLnB1dChJRF9TRUVELCB0aGlzLnNlZWQpOworICAgICAgICByZXR1cm4gbmV3IE1hcENvbmZpZ3VyYXRpb24obWFwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU2lkZUVmZmVjdFN0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU2lkZUVmZmVjdFN0cmF0ZWd5LmphdmEKaW5kZXggNWM5OWI1Zi4uNmJlMWNiNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1NpZGVFZmZlY3RTdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9TaWRlRWZmZWN0U3RyYXRlZ3kuamF2YQpAQCAtNDQsMTMgKzQ0LDEzIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7Ci0gICAgICAgIGlmICh0cmF2ZXJzYWwuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBFbXB0eVN0ZXApIHsKKyAgICAgICAgaWYgKHRyYXZlcnNhbC5pc1Jvb3QoKSkgewogICAgICAgICAgICAgdGhpcy5zaWRlRWZmZWN0cy5mb3JFYWNoKHRyaXBsZXQgLT4gdHJhdmVyc2FsLmdldFNpZGVFZmZlY3RzKCkucmVnaXN0ZXIodHJpcGxldC5nZXRWYWx1ZTAoKSwgdHJpcGxldC5nZXRWYWx1ZTEoKSwgdHJpcGxldC5nZXRWYWx1ZTIoKSkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyA8QT4gdm9pZCBhZGRTaWRlRWZmZWN0KGZpbmFsIFRyYXZlcnNhbFN0cmF0ZWdpZXMgdHJhdmVyc2FsU3RyYXRlZ2llcywgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgQSB2YWx1ZSwgZmluYWwgQmluYXJ5T3BlcmF0b3I8QT4gcmVkdWNlcikgewotICAgICAgICBTaWRlRWZmZWN0U3RyYXRlZ3kgc3RyYXRlZ3kgPSAoU2lkZUVmZmVjdFN0cmF0ZWd5KSB0cmF2ZXJzYWxTdHJhdGVnaWVzLnRvTGlzdCgpLnN0cmVhbSgpLmZpbHRlcihzIC0+IHMgaW5zdGFuY2VvZiBTaWRlRWZmZWN0U3RyYXRlZ3kpLmZpbmRBbnkoKS5vckVsc2UobnVsbCk7CisgICAgICAgIFNpZGVFZmZlY3RTdHJhdGVneSBzdHJhdGVneSA9IHRyYXZlcnNhbFN0cmF0ZWdpZXMuZ2V0U3RyYXRlZ3koU2lkZUVmZmVjdFN0cmF0ZWd5LmNsYXNzKS5vckVsc2UobnVsbCk7CiAgICAgICAgIGlmIChudWxsID09IHN0cmF0ZWd5KSB7CiAgICAgICAgICAgICBzdHJhdGVneSA9IG5ldyBTaWRlRWZmZWN0U3RyYXRlZ3koKTsKICAgICAgICAgICAgIHRyYXZlcnNhbFN0cmF0ZWdpZXMuYWRkU3RyYXRlZ2llcyhzdHJhdGVneSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU3ViZ3JhcGhTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1N1YmdyYXBoU3RyYXRlZ3kuamF2YQppbmRleCBhNTdhN2QzLi41MzMzZDJiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU3ViZ3JhcGhTdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9TdWJncmFwaFN0cmF0ZWd5LmphdmEKQEAgLTE4LDEzICsxOCwxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXzsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5FbGVtZW50VmFsdWVUcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuVmFsdWVUcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkNsYXNzRmlsdGVyU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkZpbHRlclN0ZXA7CkBAIC0xNTAsMTggKzE1MCw3IEBACiAgICAgICAgICAgICB0cmF2ZXJzYWwuZ2V0U3RhcnRTdGVwKCkucmVtb3ZlTGFiZWwoTUFSS0VSKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIFN0ZXAgc3RlcCA6IHRyYXZlcnNhbC5nZXRTdGVwcygpKSB7Ci0gICAgICAgICAgICBpZiAoc3RlcCBpbnN0YW5jZW9mIFRyYXZlcnNhbFBhcmVudCkgewotICAgICAgICAgICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsLkFkbWluIHQgOiAoKFRyYXZlcnNhbFBhcmVudCkgc3RlcCkuZ2V0TG9jYWxDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkodCk7Ci0gICAgICAgICAgICAgICAgICAgIHQuZ2V0U3RhcnRTdGVwKCkuYWRkTGFiZWwoTUFSS0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdCA6ICgoVHJhdmVyc2FsUGFyZW50KSBzdGVwKS5nZXRHbG9iYWxDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkodCk7Ci0gICAgICAgICAgICAgICAgICAgIHQuZ2V0U3RhcnRTdGVwKCkuYWRkTGFiZWwoTUFSS0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwogICAgICAgICAvLwogICAgICAgICBmaW5hbCBMaXN0PEdyYXBoU3RlcD4gZ3JhcGhTdGVwcyA9IFRyYXZlcnNhbEhlbHBlci5nZXRTdGVwc09mQXNzaWduYWJsZUNsYXNzKEdyYXBoU3RlcC5jbGFzcywgdHJhdmVyc2FsKTsKICAgICAgICAgZmluYWwgTGlzdDxWZXJ0ZXhTdGVwPiB2ZXJ0ZXhTdGVwcyA9IFRyYXZlcnNhbEhlbHBlci5nZXRTdGVwc09mQXNzaWduYWJsZUNsYXNzKFZlcnRleFN0ZXAuY2xhc3MsIHRyYXZlcnNhbCk7CkBAIC0yMzEsMTkgKzIyMCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtLmNvbmNhdCgoKFRyYXZlcnNhbFBhcmVudCkgc3RlcCkuZ2V0R2xvYmFsQ2hpbGRyZW4oKS5zdHJlYW0oKSwgKChUcmF2ZXJzYWxQYXJlbnQpIHN0ZXApLmdldExvY2FsQ2hpbGRyZW4oKS5zdHJlYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0IC0+IHQgaW5zdGFuY2VvZiBFbGVtZW50VmFsdWVUcmF2ZXJzYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodCAtPiB0IGluc3RhbmNlb2YgVmFsdWVUcmF2ZXJzYWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKHQgLT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBwcm9wZXJ0eVR5cGUgPSBwcm9jZXNzZXNQcm9wZXJ0eVR5cGUoc3RlcC5nZXRQcmV2aW91c1N0ZXAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3AnICE9IHByb3BlcnR5VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiB0ZW1wID0gbmV3IERlZmF1bHRUcmF2ZXJzYWw8PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuYWRkU3RlcChuZXcgUHJvcGVydGllc1N0ZXA8Pih0ZW1wLCBQcm9wZXJ0eVR5cGUuUFJPUEVSVFksICgoRWxlbWVudFZhbHVlVHJhdmVyc2FsKSB0KS5nZXRQcm9wZXJ0eUtleSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGRTdGVwKG5ldyBQcm9wZXJ0aWVzU3RlcDw+KHRlbXAsIFByb3BlcnR5VHlwZS5QUk9QRVJUWSwgKChWYWx1ZVRyYXZlcnNhbCkgdCkuZ2V0UHJvcGVydHlLZXkoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndicgPT0gcHJvcGVydHlUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuaW5zZXJ0VHJhdmVyc2FsKDAsIG5vbkNoZWNrUHJvcGVydHlDcml0ZXJpb24uY2xvbmUoKSwgdGVtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLmFkZFN0ZXAoY2hlY2tQcm9wZXJ0eUNyaXRlcmlvbi5jbG9uZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLmFkZFN0ZXAobmV3IFByb3BlcnR5VmFsdWVTdGVwPD4odGVtcCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0UGFyZW50KChUcmF2ZXJzYWxQYXJlbnQpIHN0ZXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWxlbWVudFZhbHVlVHJhdmVyc2FsKSB0KS5zZXRCeXBhc3NUcmF2ZXJzYWwodGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWYWx1ZVRyYXZlcnNhbCkgdCkuc2V0QnlwYXNzVHJhdmVyc2FsKHRlbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9maW5hbGl6YXRpb24vTWF0Y2hBbGdvcml0aG1TdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9maW5hbGl6YXRpb24vTWF0Y2hBbGdvcml0aG1TdHJhdGVneS5qYXZhCmluZGV4IGE3MGUyMmEuLmEwNTc3ZWYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZmluYWxpemF0aW9uL01hdGNoQWxnb3JpdGhtU3RyYXRlZ3kuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2ZpbmFsaXphdGlvbi9NYXRjaEFsZ29yaXRobVN0cmF0ZWd5LmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmZpbmFsaXphdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZmluYWxpemF0aW9uL1Byb2ZpbGVTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9maW5hbGl6YXRpb24vUHJvZmlsZVN0cmF0ZWd5LmphdmEKaW5kZXggY2VlZGIzOC4uZGVkZDU2NyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9maW5hbGl6YXRpb24vUHJvZmlsZVN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9maW5hbGl6YXRpb24vUHJvZmlsZVN0cmF0ZWd5LmphdmEKQEAgLTQ1LDkgKzQ1LDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7Ci0gICAgICAgIGlmICgodHJhdmVyc2FsLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRW1wdHlTdGVwIHx8IHRyYXZlcnNhbC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZlcnRleFByb2dyYW1TdGVwKSAmJgorICAgICAgICBpZiAoIXRyYXZlcnNhbC5nZXRFbmRTdGVwKCkuZ2V0TGFiZWxzKCkuY29udGFpbnMoTUFSS0VSKSAmJgorICAgICAgICAgICAgICAgICh0cmF2ZXJzYWwuaXNSb290KCkgfHwgdHJhdmVyc2FsLmdldFBhcmVudCgpIGluc3RhbmNlb2YgVmVydGV4UHJvZ3JhbVN0ZXApICYmCiAgICAgICAgICAgICAgICAgVHJhdmVyc2FsSGVscGVyLmhhc1N0ZXBPZkFzc2lnbmFibGVDbGFzc1JlY3Vyc2l2ZWx5KFByb2ZpbGVTaWRlRWZmZWN0U3RlcC5jbGFzcywgdHJhdmVyc2FsKSkKICAgICAgICAgICAgIFRyYXZlcnNhbEhlbHBlci5hcHBseVRyYXZlcnNhbFJlY3Vyc2l2ZWx5KHQgLT4gdC5nZXRFbmRTdGVwKCkuYWRkTGFiZWwoTUFSS0VSKSwgdHJhdmVyc2FsKTsKKwogICAgICAgICBpZiAodHJhdmVyc2FsLmdldEVuZFN0ZXAoKS5nZXRMYWJlbHMoKS5jb250YWlucyhNQVJLRVIpKSB7CiAgICAgICAgICAgICB0cmF2ZXJzYWwuZ2V0RW5kU3RlcCgpLnJlbW92ZUxhYmVsKE1BUktFUik7CiAgICAgICAgICAgICAvLyBBZGQgLnByb2ZpbGUoKSBzdGVwIGFmdGVyIGV2ZXJ5IHByZS1leGlzdGluZyBzdGVwLgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9maW5hbGl6YXRpb24vUmVmZXJlbmNlRWxlbWVudFN0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2ZpbmFsaXphdGlvbi9SZWZlcmVuY2VFbGVtZW50U3RyYXRlZ3kuamF2YQppbmRleCA0MWUxMzI1Li5lYmIwNDIzIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2ZpbmFsaXphdGlvbi9SZWZlcmVuY2VFbGVtZW50U3RyYXRlZ3kuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2ZpbmFsaXphdGlvbi9SZWZlcmVuY2VFbGVtZW50U3RyYXRlZ3kuamF2YQpAQCAtMjEsNyArMjEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5NYXBTdGVwOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuU2NhbGFyTWFwU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5Qcm9maWxlU2lkZUVmZmVjdFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuRW1wdHlTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuQWJzdHJhY3RUcmF2ZXJzYWxTdHJhdGVneTsKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgICAgcmV0dXJuIElOU1RBTkNFOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlRWxlbWVudFN0ZXA8UywgRT4gZXh0ZW5kcyBNYXBTdGVwPFMsIEU+IHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUVsZW1lbnRTdGVwPFMsIEU+IGV4dGVuZHMgU2NhbGFyTWFwU3RlcDxTLCBFPiB7CiAKICAgICAgICAgcHVibGljIFJlZmVyZW5jZUVsZW1lbnRTdGVwKGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwpIHsKICAgICAgICAgICAgIHN1cGVyKHRyYXZlcnNhbCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9CeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9CeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhYWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL0J5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5JZGVudGl0eVRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5Ub2tlblRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5WYWx1ZVRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuQnlNb2R1bGF0aW5nOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5Hcm91cGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuRm9sZFN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5Hcm91cFN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5JZFN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5MYWJlbFN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5Qcm9wZXJ0aWVzU3RlcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLlByb3BlcnR5S2V5U3RlcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLlByb3BlcnR5VmFsdWVTdGVwOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0Lkdyb3VwU2lkZUVmZmVjdFN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuSWRlbnRpdHlTdGVwOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuQWJzdHJhY3RUcmF2ZXJzYWxTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogVGhpcyBzdHJhdGVneSBsb29rcyBmb3Igc3RhbmRhcmQgdHJhdmVyc2FscyBpbiBieS1tb2R1bGF0b3JzIGFuZCByZXBsYWNlcyB0aGVtIHdpdGggbW9yZSBvcHRpbWl6ZWQgdHJhdmVyc2FscworICogKGUuZy4ge0Bjb2RlIFRva2VuVHJhdmVyc2FsfSkgaWYgcG9zc2libGUuCisgKiA8cC8+CisgKgorICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKKyAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKKyAqIEBleGFtcGxlIDxwcmU+CisgKiBfXy5wYXRoKCkuYnkoaWQoKSkgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZXBsYWNlZCBieSBfXy5wYXRoKCkuYnkoaWQpCisgKiBfXy5kZWR1cCgpLmJ5KGxhYmVsKCkpICAgICAgICAgICAgICAgICAgICAvLyBpcyByZXBsYWNlZCBieSBfXy5kZWR1cCgpLmJ5KGxhYmVsKQorICogX18ub3JkZXIoKS5ieSh2YWx1ZXMoIm5hbWUiKSkgICAgICAgICAgICAgLy8gaXMgcmVwbGFjZWQgYnkgX18ub3JkZXIoKS5ieSgibmFtZSIpCisgKiBfXy5ncm91cCgpLmJ5KCkuYnkodmFsdWVzKCJuYW1lIikuZm9sZCgpKSAvLyBpcyByZXBsYWNlZCBieSBfXy5ncm91cCgpLmJ5KCJuYW1lIikKKyAqIDwvcHJlPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VHJhdmVyc2FsU3RyYXRlZ3k8VHJhdmVyc2FsU3RyYXRlZ3kuT3B0aW1pemF0aW9uU3RyYXRlZ3k+CisgICAgICAgIGltcGxlbWVudHMgVHJhdmVyc2FsU3RyYXRlZ3kuT3B0aW1pemF0aW9uU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5KCk7CisKKyAgICAvLyB3aGVuIFBhdGhQcm9jZXNzb3JTdHJhdGVneSBpcyBwcmVzZW50IGZvciB3aXRoQ29tcHV0ZXIoKSB5b3UgbmVlZCB0byBlbnN1cmUgaXQgYWx3YXlzIGV4ZWN1dGVzIGZpcnN0IGJlY2F1c2UKKyAgICAvLyBpdCBkb2VzIHNvbWUgbWFuaXB1bGF0aW9uIHRvIHNlbGVjdCgpLmJ5KHQpIGluIHNvbWUgY2FzZXMgdG8gdHVybiBpdCB0byBzZWxlY3QoKS5tYXAodCkgaW4gd2hpY2ggY2FzZSB0aGlzCisgICAgLy8gc3RyYXRlZ3kgaGFzIG5vdGhpbmcgdG8gZG8uIGlmIGl0IHdlcmUgdG8gb2NjdXIgZmlyc3QgdGhlbiB0aGF0IG9wdGltaXphdGlvbiB3b3VsZG4ndCB3b3JrIGFzIGV4cGVjdGVkLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/IGV4dGVuZHMgT3B0aW1pemF0aW9uU3RyYXRlZ3k+PiBQUklPUlMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBQYXRoUHJvY2Vzc29yU3RyYXRlZ3kuY2xhc3MsIElkZW50aXR5UmVtb3ZhbFN0cmF0ZWd5LmNsYXNzKSk7CisKKyAgICBwcml2YXRlIEJ5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3koKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5IGluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gSU5TVEFOQ0U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9wdGltaXplQnlNb2R1bGF0aW5nVHJhdmVyc2FsKGZpbmFsIFRyYXZlcnNhbFBhcmVudCBzdGVwLCBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7CisgICAgICAgIGlmICh0cmF2ZXJzYWwgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBmaW5hbCBMaXN0PFN0ZXA+IHN0ZXBzID0gdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdGVwcygpOworICAgICAgICBpZiAoc3RlcHMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0ZXAgc2luZ2xlU3RlcCA9IHN0ZXBzLmdldCgwKTsKKyAgICAgICAgICAgIG9wdGltaXplRm9yU3RlcChzdGVwLCB0cmF2ZXJzYWwsIHNpbmdsZVN0ZXApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9wdGltaXplRm9yU3RlcChmaW5hbCBUcmF2ZXJzYWxQYXJlbnQgc3RlcCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCwgZmluYWwgU3RlcCBzaW5nbGVTdGVwKSB7CisgICAgICAgIGlmIChzaW5nbGVTdGVwIGluc3RhbmNlb2YgUHJvcGVydGllc1N0ZXApIHsKKyAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNTdGVwIHBzID0gKFByb3BlcnRpZXNTdGVwKSBzaW5nbGVTdGVwOworICAgICAgICAgICAgaWYgKHBzLmdldFJldHVyblR5cGUoKS5lcXVhbHMoUHJvcGVydHlUeXBlLlZBTFVFKSAmJiBwcy5nZXRQcm9wZXJ0eUtleXMoKS5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIHN0ZXAucmVwbGFjZUxvY2FsQ2hpbGQodHJhdmVyc2FsLCBuZXcgVmFsdWVUcmF2ZXJzYWw8Pihwcy5nZXRQcm9wZXJ0eUtleXMoKVswXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNpbmdsZVN0ZXAgaW5zdGFuY2VvZiBJZFN0ZXApIHsKKyAgICAgICAgICAgIHN0ZXAucmVwbGFjZUxvY2FsQ2hpbGQodHJhdmVyc2FsLCBuZXcgVG9rZW5UcmF2ZXJzYWw8PihULmlkKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2luZ2xlU3RlcCBpbnN0YW5jZW9mIExhYmVsU3RlcCkgeworICAgICAgICAgICAgc3RlcC5yZXBsYWNlTG9jYWxDaGlsZCh0cmF2ZXJzYWwsIG5ldyBUb2tlblRyYXZlcnNhbDw+KFQubGFiZWwpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaW5nbGVTdGVwIGluc3RhbmNlb2YgUHJvcGVydHlLZXlTdGVwKSB7CisgICAgICAgICAgICBzdGVwLnJlcGxhY2VMb2NhbENoaWxkKHRyYXZlcnNhbCwgbmV3IFRva2VuVHJhdmVyc2FsPD4oVC5rZXkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaW5nbGVTdGVwIGluc3RhbmNlb2YgUHJvcGVydHlWYWx1ZVN0ZXApIHsKKyAgICAgICAgICAgIHN0ZXAucmVwbGFjZUxvY2FsQ2hpbGQodHJhdmVyc2FsLCBuZXcgVG9rZW5UcmF2ZXJzYWw8PihULnZhbHVlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2luZ2xlU3RlcCBpbnN0YW5jZW9mIElkZW50aXR5U3RlcCkgeworICAgICAgICAgICAgc3RlcC5yZXBsYWNlTG9jYWxDaGlsZCh0cmF2ZXJzYWwsIG5ldyBJZGVudGl0eVRyYXZlcnNhbDw+KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgeworICAgICAgICBmaW5hbCBTdGVwIHN0ZXAgPSB0cmF2ZXJzYWwuZ2V0UGFyZW50KCkuYXNTdGVwKCk7CisgICAgICAgIGlmIChzdGVwIGluc3RhbmNlb2YgQnlNb2R1bGF0aW5nICYmIHN0ZXAgaW5zdGFuY2VvZiBUcmF2ZXJzYWxQYXJlbnQpIHsKKyAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNhbFBhcmVudCBieU1vZHVsYXRpbmdTdGVwID0gKFRyYXZlcnNhbFBhcmVudCkgc3RlcDsKKyAgICAgICAgICAgIGlmIChzdGVwIGluc3RhbmNlb2YgR3JvdXBpbmcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBHcm91cGluZyBncm91cGluZyA9IChHcm91cGluZykgc3RlcDsKKyAgICAgICAgICAgICAgICBvcHRpbWl6ZUJ5TW9kdWxhdGluZ1RyYXZlcnNhbChieU1vZHVsYXRpbmdTdGVwLCBncm91cGluZy5nZXRLZXlUcmF2ZXJzYWwoKSk7CisKKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgYnkoKSBuZWVkcyBkaWZmZXJlbnQgaGFuZGxpbmcgYmVjYXVzZSBieShUcmF2ZXJzYWwpIG9ubHkgZXF1YWxzIGJ5KFN0cmluZykgb3IgYnkoVCkKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdHJhdmVyc2FsIGRvZXMgYSBmb2xkKCkuCisgICAgICAgICAgICAgICAgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IGN1cnJlbnRWYWx1ZVRyYXZlcnNhbCA9IGdyb3VwaW5nLmdldFZhbHVlVHJhdmVyc2FsKCk7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdGVwPiBzdGVwc0luQ3VycmVudFZhbHVlVHJhdmVyc2FsID0gY3VycmVudFZhbHVlVHJhdmVyc2FsLmdldFN0ZXBzKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ZXBzSW5DdXJyZW50VmFsdWVUcmF2ZXJzYWwuc2l6ZSgpID09IDEgJiYgc3RlcHNJbkN1cnJlbnRWYWx1ZVRyYXZlcnNhbC5nZXQoMCkgaW5zdGFuY2VvZiBJZGVudGl0eVN0ZXApCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplRm9yU3RlcChieU1vZHVsYXRpbmdTdGVwLCBjdXJyZW50VmFsdWVUcmF2ZXJzYWwsIHN0ZXBzSW5DdXJyZW50VmFsdWVUcmF2ZXJzYWwuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGVwc0luQ3VycmVudFZhbHVlVHJhdmVyc2FsLnNpemUoKSA9PSAyICYmIHN0ZXBzSW5DdXJyZW50VmFsdWVUcmF2ZXJzYWwuZ2V0KDEpIGluc3RhbmNlb2YgRm9sZFN0ZXApCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplRm9yU3RlcChieU1vZHVsYXRpbmdTdGVwLCBjdXJyZW50VmFsdWVUcmF2ZXJzYWwsIHN0ZXBzSW5DdXJyZW50VmFsdWVUcmF2ZXJzYWwuZ2V0KDApKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBieU1vZHVsYXRpbmdUcmF2ZXJzYWwgOiBieU1vZHVsYXRpbmdTdGVwLmdldExvY2FsQ2hpbGRyZW4oKSkgeworICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZUJ5TW9kdWxhdGluZ1RyYXZlcnNhbChieU1vZHVsYXRpbmdTdGVwLCBieU1vZHVsYXRpbmdUcmF2ZXJzYWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8PyBleHRlbmRzIE9wdGltaXphdGlvblN0cmF0ZWd5Pj4gYXBwbHlQcmlvcigpIHsKKyAgICAgICAgcmV0dXJuIFBSSU9SUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9JbmNpZGVudFRvQWRqYWNlbnRTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vSW5jaWRlbnRUb0FkamFjZW50U3RyYXRlZ3kuamF2YQppbmRleCBlNzBlNTRhLi43NWQ1NWFkIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9JbmNpZGVudFRvQWRqYWNlbnRTdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL0luY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5LmphdmEKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiB0cmF2ZXJzYWwpIHsKICAgICAgICAgLy8gdXNpbmcgYSBoaWRkZW4gbGFiZWwgbWFya2VyIHRvIGRlbm90ZSB3aGV0aGVyIHRoZSB0cmF2ZXJzYWwgc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBzdHJhdGVneQotICAgICAgICBpZiAoKHRyYXZlcnNhbC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEVtcHR5U3RlcCB8fCB0cmF2ZXJzYWwuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBWZXJ0ZXhQcm9ncmFtU3RlcCkgJiYKKyAgICAgICAgaWYgKCh0cmF2ZXJzYWwuaXNSb290KCkgfHwgdHJhdmVyc2FsLmdldFBhcmVudCgpIGluc3RhbmNlb2YgVmVydGV4UHJvZ3JhbVN0ZXApICYmCiAgICAgICAgICAgICAgICAgVHJhdmVyc2FsSGVscGVyLmhhc1N0ZXBPZkFzc2lnbmFibGVDbGFzc1JlY3Vyc2l2ZWx5KElOVkFMSURBVElOR19TVEVQX0NMQVNTRVMsIHRyYXZlcnNhbCkpCiAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuYXBwbHlUcmF2ZXJzYWxSZWN1cnNpdmVseSh0IC0+IHQuZ2V0U3RhcnRTdGVwKCkuYWRkTGFiZWwoTUFSS0VSKSwgdHJhdmVyc2FsKTsKICAgICAgICAgaWYgKHRyYXZlcnNhbC5nZXRTdGFydFN0ZXAoKS5nZXRMYWJlbHMoKS5jb250YWlucyhNQVJLRVIpKSB7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9JbmxpbmVGaWx0ZXJTdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vSW5saW5lRmlsdGVyU3RyYXRlZ3kuamF2YQppbmRleCBmNWY5ODBmLi5iZWMxNzBkIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9JbmxpbmVGaWx0ZXJTdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL0lubGluZUZpbHRlclN0cmF0ZWd5LmphdmEKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgaW5zdGFuY2VvZiBPclN0ZXAgJiYgSW5saW5lRmlsdGVyU3RyYXRlZ3kucHJvY2Vzc09yU3RlcCgoT3JTdGVwKSBzdGVwLCB0cmF2ZXJzYWwpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwIGluc3RhbmNlb2YgQW5kU3RlcCAmJiBJbmxpbmVGaWx0ZXJTdHJhdGVneS5wcm9jZXNzQW5kU3RlcCgoQW5kU3RlcCkgc3RlcCwgdHJhdmVyc2FsKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiB0cmF2ZXJzYWwuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBFbXB0eVN0ZXApIHsKKyAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiB0cmF2ZXJzYWwuaXNSb290KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxNYXRjaFN0ZXA+IG1hdGNoU3RlcEl0ZXJhdG9yID0gVHJhdmVyc2FsSGVscGVyLmdldFN0ZXBzT2ZDbGFzcyhNYXRjaFN0ZXAuY2xhc3MsIHRyYXZlcnNhbCkuaXRlcmF0b3IoKTsKICAgICAgICAgICAgICAgICB3aGlsZSAoIWNoYW5nZWQgJiYgbWF0Y2hTdGVwSXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChJbmxpbmVGaWx0ZXJTdHJhdGVneS5wcm9jZXNzTWF0Y2hTdGVwKG1hdGNoU3RlcEl0ZXJhdG9yLm5leHQoKSwgdHJhdmVyc2FsKSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1BhdGhSZXRyYWN0aW9uU3RyYXRlZ3kuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1BhdGhSZXRyYWN0aW9uU3RyYXRlZ3kuamF2YQppbmRleCBkMzcwYzM4Li42MmFkZTJiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9QYXRoUmV0cmFjdGlvblN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vUGF0aFJldHJhY3Rpb25TdHJhdGVneS5qYXZhCkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgIC8vIGRvIG5vdCBhcHBseSB0aGlzIHN0cmF0ZWd5IGlmIHRoZXJlIGFyZSBsYW1iZGFzIGFzIHlvdSBjYW4ndCBpbnRyb3NwZWN0IHRvIGtub3cgd2hhdCBwYXRoIGluZm9ybWF0aW9uIHRoZSBsYW1iZGFzIGFyZSB1c2luZwogICAgICAgICAvLyBkbyBub3QgYXBwbHkgdGhpcyBzdHJhdGVneSBpZiBhIFBBVEggcmVxdWlyZW1lbnQgc3RlcCBpcyBiZWluZyB1c2VkIChpbiB0aGUgZnV0dXJlLCB3ZSBjYW4gZG8gUEFUSCByZXF1aXJlbWVudCBsb29raGVhZCB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IGl0cyB1c2FnZSkKICAgICAgICAgLy8gZG8gbm90IGFwcGx5IHRoaXMgc3RyYXRlZ3kgaWYgYSBWZXJ0ZXhQcm9ncmFtU3RlcCBpcyBwcmVzZW50IHdpdGggTEFCRUxFRF9QQVRIIHJlcXVpcmVtZW50cwotICAgICAgICBpZiAodHJhdmVyc2FsLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRW1wdHlTdGVwICYmCisgICAgICAgIGlmICh0cmF2ZXJzYWwuaXNSb290KCkgJiYKICAgICAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuYW55U3RlcFJlY3Vyc2l2ZWx5KHN0ZXAgLT4gc3RlcCBpbnN0YW5jZW9mIExhbWJkYUhvbGRlciB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5nZXRSZXF1aXJlbWVudHMoKS5jb250YWlucyhUcmF2ZXJzZXJSZXF1aXJlbWVudC5QQVRIKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKHN0ZXAgaW5zdGFuY2VvZiBWZXJ0ZXhQcm9ncmFtU3RlcCAmJgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS92ZXJpZmljYXRpb24vQWJzdHJhY3RXYXJuaW5nVmVyaWZpY2F0aW9uU3RyYXRlZ3kuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvdmVyaWZpY2F0aW9uL0Fic3RyYWN0V2FybmluZ1ZlcmlmaWNhdGlvblN0cmF0ZWd5LmphdmEKaW5kZXggYTdjNWEzYS4uOWE5MzkxYiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS92ZXJpZmljYXRpb24vQWJzdHJhY3RXYXJuaW5nVmVyaWZpY2F0aW9uU3RyYXRlZ3kuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L3ZlcmlmaWNhdGlvbi9BYnN0cmFjdFdhcm5pbmdWZXJpZmljYXRpb25TdHJhdGVneS5qYXZhCkBAIC0xOCwxMiArMTgsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LnZlcmlmaWNhdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLk1hcENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLlZlcnRleFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5BYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L3ZlcmlmaWNhdGlvbi9FZGdlTGFiZWxWZXJpZmljYXRpb25TdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS92ZXJpZmljYXRpb24vRWRnZUxhYmVsVmVyaWZpY2F0aW9uU3RyYXRlZ3kuamF2YQppbmRleCBmZjFlODM1Li4yZDQ5ZWNiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L3ZlcmlmaWNhdGlvbi9FZGdlTGFiZWxWZXJpZmljYXRpb25TdHJhdGVneS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvdmVyaWZpY2F0aW9uL0VkZ2VMYWJlbFZlcmlmaWNhdGlvblN0cmF0ZWd5LmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LnZlcmlmaWNhdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvdmVyaWZpY2F0aW9uL0xhbWJkYVJlc3RyaWN0aW9uU3RyYXRlZ3kuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvdmVyaWZpY2F0aW9uL0xhbWJkYVJlc3RyaWN0aW9uU3RyYXRlZ3kuamF2YQppbmRleCA2NDJkMTdhLi43MTk5OWM1IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L3ZlcmlmaWNhdGlvbi9MYW1iZGFSZXN0cmljdGlvblN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS92ZXJpZmljYXRpb24vTGFtYmRhUmVzdHJpY3Rpb25TdHJhdGVneS5qYXZhCkBAIC0zNCwxMSArMzQsMTEgQEAKICAqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKICAqIEBleGFtcGxlIDxwcmU+Ci0gKiBfXy5vdXQoKS5tYXAodiAtPiB2LmdldCgpLnZhbHVlKCJuYW1lIikpICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gKiBfXy5vdXQoKS5maWx0ZXIodiAtPiB2LmJ1bGsoKSA+IDIpICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gKiBfXy5jaG9vc2UodiAtPiB2LnNhY2soKSA9PSAxLG91dCgpLGluKCkpICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gKiBfXy5zZWxlY3QoKS5ieSh2IC0+IHYuZ2V0KCkuaWQoKSkgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gKiBfXy5vcmRlcigpLmJ5KGEsYiAtPiBhID4gYikgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgKiBfXy5vdXQoKS5tYXAodiAtJmd0OyB2LmdldCgpLnZhbHVlKCJuYW1lIikpICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgKiBfXy5vdXQoKS5maWx0ZXIodiAtJmd0OyB2LmJ1bGsoKSAmZ3Q7IDIpICAgICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgKiBfXy5jaG9vc2UodiAtJmd0OyB2LnNhY2soKSA9PSAxLG91dCgpLGluKCkpICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgKiBfXy5zZWxlY3QoKS5ieSh2IC0mZ3Q7IHYuZ2V0KCkuaWQoKSkgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgKiBfXy5vcmRlcigpLmJ5KGEsYiAtJmd0OyBhICZndDsgYikgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAgKiA8L3ByZT4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIExhbWJkYVJlc3RyaWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5PFRyYXZlcnNhbFN0cmF0ZWd5LlZlcmlmaWNhdGlvblN0cmF0ZWd5PiBpbXBsZW1lbnRzIFRyYXZlcnNhbFN0cmF0ZWd5LlZlcmlmaWNhdGlvblN0cmF0ZWd5IHsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvdmVyaWZpY2F0aW9uL1Jlc2VydmVkS2V5c1ZlcmlmaWNhdGlvblN0cmF0ZWd5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L3ZlcmlmaWNhdGlvbi9SZXNlcnZlZEtleXNWZXJpZmljYXRpb25TdHJhdGVneS5qYXZhCmluZGV4IDhmZTY0MjQuLmQ3NjQ2OTMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvdmVyaWZpY2F0aW9uL1Jlc2VydmVkS2V5c1ZlcmlmaWNhdGlvblN0cmF0ZWd5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS92ZXJpZmljYXRpb24vUmVzZXJ2ZWRLZXlzVmVyaWZpY2F0aW9uU3RyYXRlZ3kuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kudmVyaWZpY2F0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlBhcmFtZXRlcml6aW5nOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS92ZXJpZmljYXRpb24vU3RhbmRhcmRWZXJpZmljYXRpb25TdHJhdGVneS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS92ZXJpZmljYXRpb24vU3RhbmRhcmRWZXJpZmljYXRpb25TdHJhdGVneS5qYXZhCmluZGV4IGZjMzNjNjkuLjVhNDFjOTIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvdmVyaWZpY2F0aW9uL1N0YW5kYXJkVmVyaWZpY2F0aW9uU3RyYXRlZ3kuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L3ZlcmlmaWNhdGlvbi9TdGFuZGFyZFZlcmlmaWNhdGlvblN0cmF0ZWd5LmphdmEKQEAgLTUxLDggKzUxLDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiB0cmF2ZXJzYWwpIHsKLSAgICAgICAgaWYgKCF0cmF2ZXJzYWwuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKENvbXB1dGVyRmluYWxpemF0aW9uU3RyYXRlZ3kuaW5zdGFuY2UoKSkgJiYKLSAgICAgICAgICAgICAgICAhdHJhdmVyc2FsLmdldFN0cmF0ZWdpZXMoKS50b0xpc3QoKS5jb250YWlucyhDb21wdXRlclZlcmlmaWNhdGlvblN0cmF0ZWd5Lmluc3RhbmNlKCkpKSB7CisgICAgICAgIGlmICghdHJhdmVyc2FsLmdldFN0cmF0ZWdpZXMoKS5nZXRTdHJhdGVneShDb21wdXRlckZpbmFsaXphdGlvblN0cmF0ZWd5LmNsYXNzKS5pc1ByZXNlbnQoKSAmJgorICAgICAgICAgICAgICAgICF0cmF2ZXJzYWwuZ2V0U3RyYXRlZ2llcygpLmdldFN0cmF0ZWd5KENvbXB1dGVyVmVyaWZpY2F0aW9uU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpKSB7CiAgICAgICAgICAgICBpZiAoIVRyYXZlcnNhbEhlbHBlci5nZXRTdGVwc09mQXNzaWduYWJsZUNsYXNzKFZlcnRleENvbXB1dGluZy5jbGFzcywgdHJhdmVyc2FsKS5pc0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigiVmVydGV4Q29tcHV0aW5nIHN0ZXBzIG11c3QgYmUgZXhlY3V0ZWQgd2l0aCBhIEdyYXBoQ29tcHV0ZXI6ICIgKyBUcmF2ZXJzYWxIZWxwZXIuZ2V0U3RlcHNPZkFzc2lnbmFibGVDbGFzcyhWZXJ0ZXhDb21wdXRpbmcuY2xhc3MsIHRyYXZlcnNhbCksIHRyYXZlcnNhbCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdHJhdmVyc2VyL0JfT19TX1NFX1NMX1RyYXZlcnNlci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvQl9PX1NfU0VfU0xfVHJhdmVyc2VyLmphdmEKaW5kZXggMzNjNTUyMC4uNTdmYTQ3YSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvQl9PX1NfU0VfU0xfVHJhdmVyc2VyLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvQl9PX1NfU0VfU0xfVHJhdmVyc2VyLmphdmEKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIEJfT19TX1NFX1NMX1RyYXZlcnNlciBvdGhlcikgewogICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG90aGVyKSAmJiBvdGhlci5sb29wcyA9PSB0aGlzLmxvb3BzCi0gICAgICAgICAgICAgICAgJiYgKHRoaXMubG9vcE5hbWUgIT0gbnVsbCA/IHRoaXMubG9vcE5hbWUuZXF1YWxzKG90aGVyLmxvb3BOYW1lKSA6IG90aGVyLmxvb3BOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHModGhpcy5sb29wTmFtZSwgb3RoZXIubG9vcE5hbWUpCiAgICAgICAgICAgICAgICAgJiYgIWNhcnJpZXNVbm1lcmdlYWJsZVNhY2soKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdHJhdmVyc2VyL3V0aWwvQWJzdHJhY3RUcmF2ZXJzZXIuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdHJhdmVyc2VyL3V0aWwvQWJzdHJhY3RUcmF2ZXJzZXIuamF2YQppbmRleCA2NThiYTRiLi5lNzYwMTZhIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3RyYXZlcnNlci91dGlsL0Fic3RyYWN0VHJhdmVyc2VyLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvdXRpbC9BYnN0cmFjdFRyYXZlcnNlci5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5BdHRhY2hhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwucmVmZXJlbmNlLlJlZmVyZW5jZUZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIApAQCAtMjAzLDE2ICsyMDQsMTYgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnQuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUodGhpcy50KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RUcmF2ZXJzZXIgJiYgKChBYnN0cmFjdFRyYXZlcnNlcikgb2JqZWN0KS5nZXQoKS5lcXVhbHModGhpcy50KTsKKyAgICAgICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0VHJhdmVyc2VyICYmIE9iamVjdHMuZXF1YWxzKHRoaXMudCwgKChBYnN0cmFjdFRyYXZlcnNlcikgb2JqZWN0KS50KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy50LnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBPYmplY3RzLnRvU3RyaW5nKHRoaXMudCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvdXRpbC9FbXB0eVRyYXZlcnNlci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvdXRpbC9FbXB0eVRyYXZlcnNlci5qYXZhCmluZGV4IDNhZWFmYmQuLmM2OGZkYzYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdHJhdmVyc2VyL3V0aWwvRW1wdHlUcmF2ZXJzZXIuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3RyYXZlcnNlci91dGlsL0VtcHR5VHJhdmVyc2VyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTaWRlRWZmZWN0czsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5FbXB0eVBhdGg7CkBAIC0zMCwxMiArMzEsMTggQEAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKIC8qKgorICogQSB7QGxpbmsgVHJhdmVyc2VyfSB3aXRoIG5vIGJ1bGsgd2hpY2ggZWZmZWN0aXZlbHkgbWVhbnMgdGhhdCBpdCB3aWxsIG5vIGxvbmdlciBiZSBwcm9wYWdhdGVkIHRocm91Z2ggYQorICoge0BsaW5rIFRyYXZlcnNhbH0uCisgKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eVRyYXZlcnNlcjxUPiBpbXBsZW1lbnRzIFRyYXZlcnNlcjxUPiwgVHJhdmVyc2VyLkFkbWluPFQ+IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5VHJhdmVyc2VyIElOU1RBTkNFID0gbmV3IEVtcHR5VHJhdmVyc2VyKCk7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgZW1wdHkge0BsaW5rIFRyYXZlcnNlcn0gaW5zdGFuY2UuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8Uj4gRW1wdHlUcmF2ZXJzZXI8Uj4gaW5zdGFuY2UoKSB7CiAgICAgICAgIHJldHVybiBJTlNUQU5DRTsKICAgICB9CkBAIC05NSw3ICsxMDIsNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1bGsobG9uZyBjb3VudCkgeworICAgIHB1YmxpYyB2b2lkIHNldEJ1bGsoZmluYWwgbG9uZyBjb3VudCkgewogCiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3RyYXZlcnNlci91dGlsL1RyYXZlcnNlclNldC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvdXRpbC9UcmF2ZXJzZXJTZXQuamF2YQppbmRleCA1MmJmNGQ4Li5lMjViYmIxIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3RyYXZlcnNlci91dGlsL1RyYXZlcnNlclNldC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdHJhdmVyc2VyL3V0aWwvVHJhdmVyc2VyU2V0LmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNwbGl0ZXJhdG9yOwogCkBAIC00MSw2ICs0Miw3IEBACiBwdWJsaWMgY2xhc3MgVHJhdmVyc2VyU2V0PFM+IGV4dGVuZHMgQWJzdHJhY3RTZXQ8VHJhdmVyc2VyLkFkbWluPFM+PiBpbXBsZW1lbnRzIFNldDxUcmF2ZXJzZXIuQWRtaW48Uz4+LCBRdWV1ZTxUcmF2ZXJzZXIuQWRtaW48Uz4+LCBTZXJpYWxpemFibGUgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VHJhdmVyc2VyLkFkbWluPFM+LCBUcmF2ZXJzZXIuQWRtaW48Uz4+IG1hcCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgTGlua2VkSGFzaE1hcDw+KCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5EID0gbmV3IFJhbmRvbSgpOwogCiAgICAgcHVibGljIFRyYXZlcnNlclNldCgpIHsKIApAQCAtMTUzLDEwICsxNTUsMTAgQEAKICAgICAgICAgbGlzdC5mb3JFYWNoKHRyYXZlcnNlciAtPiB0aGlzLm1hcC5wdXQodHJhdmVyc2VyLCB0cmF2ZXJzZXIpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzaHVmZmxlKCkgeworICAgIHB1YmxpYyB2b2lkIHNodWZmbGUoZmluYWwgUmFuZG9tIHJhbmRvbSkgewogICAgICAgICBmaW5hbCBMaXN0PFRyYXZlcnNlci5BZG1pbjxTPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Pih0aGlzLm1hcC5zaXplKCkpOwogICAgICAgICBJdGVyYXRvclV0aWxzLnJlbW92ZU9uTmV4dCh0aGlzLm1hcC52YWx1ZXMoKS5pdGVyYXRvcigpKS5mb3JFYWNoUmVtYWluaW5nKGxpc3Q6OmFkZCk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobGlzdCk7CisgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobGlzdCwgcmFuZG9tKTsKICAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTsKICAgICAgICAgbGlzdC5mb3JFYWNoKHRyYXZlcnNlciAtPiB0aGlzLm1hcC5wdXQodHJhdmVyc2VyLCB0cmF2ZXJzZXIpKTsKICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvRGVmYXVsdFRyYXZlcnNhbC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL0RlZmF1bHRUcmF2ZXJzYWwuamF2YQppbmRleCA4N2M1ODVhLi45Y2VmZWVjIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvRGVmYXVsdFRyYXZlcnNhbC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9EZWZhdWx0VHJhdmVyc2FsLmphdmEKQEAgLTE4LDEyICsxOCwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbDsKIAoraW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RlcC5tYXAuVmVydGV4UHJvZ3JhbVN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5CeXRlY29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTaWRlRWZmZWN0czsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlckdlbmVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuVHJhdmVyc2FsUGFyZW50OwpAQCAtODgsOCArOTAsNiBAQAogICAgICAgICBzdGVwcy5hZGRBbGwodHJhdmVyc2FsLmdldFN0ZXBzKCkpOwogICAgIH0KIAotICAgIC8vIFRPRE86IGNsZWFuIHVwIHVudXNlZCBvciByZWR1bmRhbnQgY29uc3RydWN0b3JzCi0KICAgICBwdWJsaWMgRGVmYXVsdFRyYXZlcnNhbCgpIHsKICAgICAgICAgdGhpcyhFbXB0eUdyYXBoLmluc3RhbmNlKCksIFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhFbXB0eUdyYXBoLmNsYXNzKSwgbmV3IEJ5dGVjb2RlKCkpOwogICAgIH0KQEAgLTExMCw3ICsxMTAsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUcmF2ZXJzZXJHZW5lcmF0b3IgZ2V0VHJhdmVyc2VyR2VuZXJhdG9yKCkgewogICAgICAgICBpZiAobnVsbCA9PSB0aGlzLmdlbmVyYXRvcikKLSAgICAgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gKHRoaXMucGFyZW50IGluc3RhbmNlb2YgRW1wdHlTdGVwKSA/CisgICAgICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGlzUm9vdCgpID8KICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFRyYXZlcnNlckdlbmVyYXRvckZhY3RvcnkuaW5zdGFuY2UoKS5nZXRUcmF2ZXJzZXJHZW5lcmF0b3IodGhpcy5nZXRUcmF2ZXJzZXJSZXF1aXJlbWVudHMoKSkgOgogICAgICAgICAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuZ2V0Um9vdFRyYXZlcnNhbCh0aGlzKS5nZXRUcmF2ZXJzZXJHZW5lcmF0b3IoKTsKICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdG9yOwpAQCAtMTIwLDM0ICsxMjAsNTQgQEAKICAgICBwdWJsaWMgdm9pZCBhcHBseVN0cmF0ZWdpZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHRoaXMubG9ja2VkKSB0aHJvdyBUcmF2ZXJzYWwuRXhjZXB0aW9ucy50cmF2ZXJzYWxJc0xvY2tlZCgpOwogICAgICAgICBUcmF2ZXJzYWxIZWxwZXIucmVJZFN0ZXBzKHRoaXMuc3RlcFBvc2l0aW9uLCB0aGlzKTsKLSAgICAgICAgdGhpcy5zdHJhdGVnaWVzLmFwcGx5U3RyYXRlZ2llcyh0aGlzKTsKLSAgICAgICAgYm9vbGVhbiBoYXNHcmFwaCA9IG51bGwgIT0gdGhpcy5ncmFwaDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSB0aGlzLnN0ZXBzLnNpemUoKTsgaSA8IGo7IGkrKykgeyAvLyAiZm9yZWFjaCIgY2FuIGxlYWQgdG8gQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbnMKLSAgICAgICAgICAgIGZpbmFsIFN0ZXAgc3RlcCA9IHRoaXMuc3RlcHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHN0ZXAgaW5zdGFuY2VvZiBUcmF2ZXJzYWxQYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBnbG9iYWxDaGlsZCA6ICgoVHJhdmVyc2FsUGFyZW50KSBzdGVwKS5nZXRHbG9iYWxDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbENoaWxkLnNldFN0cmF0ZWdpZXModGhpcy5zdHJhdGVnaWVzKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xvYmFsQ2hpbGQuc2V0U2lkZUVmZmVjdHModGhpcy5zaWRlRWZmZWN0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNHcmFwaCkgZ2xvYmFsQ2hpbGQuc2V0R3JhcGgodGhpcy5ncmFwaCk7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbENoaWxkLmFwcGx5U3RyYXRlZ2llcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBsb2NhbENoaWxkIDogKChUcmF2ZXJzYWxQYXJlbnQpIHN0ZXApLmdldExvY2FsQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICBsb2NhbENoaWxkLnNldFN0cmF0ZWdpZXModGhpcy5zdHJhdGVnaWVzKTsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxDaGlsZC5zZXRTaWRlRWZmZWN0cyh0aGlzLnNpZGVFZmZlY3RzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0dyYXBoKSBsb2NhbENoaWxkLnNldEdyYXBoKHRoaXMuZ3JhcGgpOwotICAgICAgICAgICAgICAgICAgICBsb2NhbENoaWxkLmFwcGx5U3RyYXRlZ2llcygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNHcmFwaCA9IG51bGwgIT0gdGhpcy5ncmFwaDsKKworICAgICAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gYXBwbHkgc3RyYXRlZ2llcyBvbiB0aGUgdG9wLWxldmVsIHN0ZXAgb3IgaWYgd2UgZ290IHNvbWUgZ3JhcGhjb21wdXRlciBzdHVmZiBnb2luZyBvbi4KKyAgICAgICAgLy8gc2VlbXMgbGlrZSBpbiB0aGF0IGNhc2UsIHRoZSAidG9wLWxldmVsIiBvZiB0aGUgdHJhdmVyc2FsIGlzIHJlYWxseSBoZWxkIGJ5IHRoZSBWZXJ0ZXhQcm9ncmFtU3RlcCB3aGljaAorICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHN0cmF0ZWdpZXMgYXBwbGllZCBvbiAicHVyZSIgY29waWVzIG9mIHRoZSB0cmF2ZXJzYWwgaXQgaXMgaG9sZGluZyAoaSB0aGluaykuIGl0IGZ1cnRoZXIKKyAgICAgICAgLy8gc2VlbXMgdGhhdCB3ZSBuZWVkIHRocmVlIHJlY3Vyc2lvbnMgb3ZlciB0aGUgdHJhdmVyc2FsIGhpZXJhcmNoeSB0byBlbnN1cmUgZXZlcnl0aGluZyAid29ya3MiLCB3aGVyZQorICAgICAgICAvLyBzdHJhdGVneSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0b3AtbGV2ZWwgc3RyYXRlZ2llcyBhbmQgc2lkZS1lZmZlY3RzIHB1c2hlZCBpbnRvIGVhY2ggY2hpbGQgYW5kIHRoZW4gYWZ0ZXIKKyAgICAgICAgLy8gYXBwbGljYXRpb24gb2YgdGhlIHN0cmF0ZWdpZXMgd2UgbmVlZCB0byBjYWxsIGFwcGx5U3RyYXRlZ2llcygpIG9uIGFsbCB0aGUgY2hpbGRyZW4gdG8gZW5zdXJlIHRoYXQgdGhlaXIKKyAgICAgICAgLy8gc3RlcHMgZ2V0IHJlSWQnZCBhbmQgdHJhdmVyc2VyIHJlcXVpcmVtZW50cyBhcmUgc2V0LgorICAgICAgICBpZiAoaXNSb290KCkgfHwgdGhpcy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZlcnRleFByb2dyYW1TdGVwKSB7CisKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBwcmlvciB0byBhcHBseWluZyBzdHJhdGVnaWVzIHRvIGNoaWxkcmVuIHdlIHVzZWQgdG8gc2V0IHNpZGUtZWZmZWN0cyBhbmQgc3RyYXRlZ2llcyBvZiBhbGwKKyAgICAgICAgICAgIC8vIGNoaWxkcmVuIHRvIHRoYXQgb2YgdGhlIHBhcmVudC4gdW5kZXIgdGhpcyByZXZpc2VkIG1vZGVsIG9mIHN0cmF0ZWd5IGFwcGxpY2F0aW9uIGZyb20gVElOS0VSUE9QLTE1NjgKKyAgICAgICAgICAgIC8vIGl0IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIG5lY2Vzc2FyeSB0byBkbyB0aGF0IChhdCBsZWFzdCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgdGVzdCBzdWl0ZSkuIGJ5LAorICAgICAgICAgICAgLy8gbW92aW5nIHNpZGUtZWZmZWN0IHNldHRpbmcgYWZ0ZXIgYWN0dWFsIHJlY3Vyc2l2ZSBzdHJhdGVneSBhcHBsaWNhdGlvbiB3ZSBzYXZlIGEgbG9vcCBhbmQgYnkKKyAgICAgICAgICAgIC8vIGNvbnNlcXVlbmNlIGFsc28gZml4IGEgcHJvYmxlbSB3aGVyZSBzdHJhdGVnaWVzIG1pZ2h0IHJlc2V0IHNvbWV0aGluZyBpbiBzaWRlZWZmZWN0cyB3aGljaCBzZWVtcyB0bworICAgICAgICAgICAgLy8gaGFwcGVuIGluIFRyYW5zbGF0aW9uU3RyYXRlZ3kuCisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxUcmF2ZXJzYWxTdHJhdGVneTw/Pj4gc3RyYXRlZ3lJdGVyYXRvciA9IHRoaXMuc3RyYXRlZ2llcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKHN0cmF0ZWd5SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3k8Pz4gc3RyYXRlZ3kgPSBzdHJhdGVneUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBUcmF2ZXJzYWxIZWxwZXIuYXBwbHlUcmF2ZXJzYWxSZWN1cnNpdmVseShzdHJhdGVneTo6YXBwbHksIHRoaXMpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIHJlLWFwcGx5IHN0cmF0ZWdpZXMgdG8gInRoaXMiIC0gbGVhZHMgdG8gZW5kbGVzcyByZWN1cnNpb24gaW4gR3JhcGhDb21wdXRlci4KKyAgICAgICAgICAgIFRyYXZlcnNhbEhlbHBlci5hcHBseVRyYXZlcnNhbFJlY3Vyc2l2ZWx5KHQgLT4geworICAgICAgICAgICAgICAgIGlmIChoYXNHcmFwaCkgdC5zZXRHcmFwaCh0aGlzLmdyYXBoKTsKKyAgICAgICAgICAgICAgICBpZighKHQuaXNSb290KCkpICYmIHQgIT0gdGhpcyAmJiAhdC5pc0xvY2tlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHQuc2V0U3RyYXRlZ2llcyhuZXcgRGVmYXVsdFRyYXZlcnNhbFN0cmF0ZWdpZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIHQuc2V0U2lkZUVmZmVjdHModGhpcy5zaWRlRWZmZWN0cyk7CisgICAgICAgICAgICAgICAgICAgIHQuYXBwbHlTdHJhdGVnaWVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIHRoaXMuZmluYWxFbmRTdGVwID0gdGhpcy5nZXRFbmRTdGVwKCk7CisKICAgICAgICAgLy8gZmluYWxpemUgcmVxdWlyZW1lbnRzCi0gICAgICAgIGlmICh0aGlzLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRW1wdHlTdGVwKSB7Ci0gICAgICAgICAgICB0aGlzLnJlcXVpcmVtZW50cyA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLmdldFRyYXZlcnNlclJlcXVpcmVtZW50cygpOworICAgICAgICBpZiAodGhpcy5pc1Jvb3QoKSkgeworICAgICAgICAgICAgcmVzZXRUcmF2ZXJzZXJSZXF1aXJlbWVudHMoKTsKICAgICAgICAgfQogICAgICAgICB0aGlzLmxvY2tlZCA9IHRydWU7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0VHJhdmVyc2VyUmVxdWlyZW1lbnRzKCkgeworICAgICAgICB0aGlzLnJlcXVpcmVtZW50cyA9IG51bGw7CisgICAgICAgIHRoaXMuZ2V0VHJhdmVyc2VyUmVxdWlyZW1lbnRzKCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxUcmF2ZXJzZXJSZXF1aXJlbWVudD4gZ2V0VHJhdmVyc2VyUmVxdWlyZW1lbnRzKCkgewogICAgICAgICBpZiAobnVsbCA9PSB0aGlzLnJlcXVpcmVtZW50cykgewpAQCAtMTg1LDcgKzIwNSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxFbmRTdGVwLm5leHQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoZmluYWwgRmFzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBFbXB0eVN0ZXAgPyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIDogZTsKKyAgICAgICAgICAgIHRocm93IHRoaXMuaXNSb290KCkgPyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIDogZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjA4LDcgKzIyOCw3IEBACiAgICAgICAgICAgICAvLyBhbmQgcmVsZWFzZSB0aGUgcmVzb3VyY2VzLgogICAgICAgICAgICAgQ2xvc2VhYmxlSXRlcmF0b3IuY2xvc2VJdGVyYXRvcih0aGlzKTsKIAotICAgICAgICAgICAgdGhyb3cgdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBFbXB0eVN0ZXAgPyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIDogZTsKKyAgICAgICAgICAgIHRocm93IHRoaXMuaXNSb290KCkgPyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIDogZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzI1LDcgKzM0NSw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoZmluYWwgVHJhdmVyc2FsUGFyZW50IHN0ZXApIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBzdGVwOworICAgICAgICB0aGlzLnBhcmVudCA9IG51bGwgPT0gc3RlcCA/IEVtcHR5U3RlcC5pbnN0YW5jZSgpIDogc3RlcDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9EZWZhdWx0VHJhdmVyc2FsU3RyYXRlZ2llcy5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL0RlZmF1bHRUcmF2ZXJzYWxTdHJhdGVnaWVzLmphdmEKaW5kZXggOTY2NzEzNy4uM2UzOWQxYiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL0RlZmF1bHRUcmF2ZXJzYWxTdHJhdGVnaWVzLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL0RlZmF1bHRUcmF2ZXJzYWxTdHJhdGVnaWVzLmphdmEKQEAgLTE4LDEzICsxOCwxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ2llczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CkBAIC03MCw2ICs3MCwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYXRvcjxUcmF2ZXJzYWxTdHJhdGVneTw/Pj4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRyYXZlcnNhbFN0cmF0ZWdpZXMuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBUcmF2ZXJzYWxTdHJhdGVneT4gT3B0aW9uYWw8VD4gZ2V0U3RyYXRlZ3koZmluYWwgQ2xhc3M8VD4gdHJhdmVyc2FsU3RyYXRlZ3lDbGFzcykgewogICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbFN0cmF0ZWd5PD8+IHRyYXZlcnNhbFN0cmF0ZWd5IDogdGhpcy50cmF2ZXJzYWxTdHJhdGVnaWVzKSB7CiAgICAgICAgICAgICBpZiAodHJhdmVyc2FsU3RyYXRlZ3lDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRyYXZlcnNhbFN0cmF0ZWd5LmdldENsYXNzKCkpKQpAQCAtNzcsMTcgKzgyLDYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKICAgICB9Ci0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuMTAsIG5vdCBkaXJlY3RseSByZXBsYWNlZCBhcyB0aGlzIG1vZGUgb2Ygc3RyYXRlZ3kgYXBwbGljYXRpb24gaGFzIG5vdCBiZWVuCi0gICAgICogdXRpbGl6ZWQgc2luY2UgZWFybHkgZGF5cyBvZiAzLngKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyB2b2lkIGFwcGx5U3RyYXRlZ2llcyhmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7Ci0gICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3k8Pz4gdHJhdmVyc2FsU3RyYXRlZ3kgOiB0aGlzLnRyYXZlcnNhbFN0cmF0ZWdpZXMpIHsKLSAgICAgICAgICAgIHRyYXZlcnNhbFN0cmF0ZWd5LmFwcGx5KHRyYXZlcnNhbCk7Ci0gICAgICAgIH0KLSAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRGVmYXVsdFRyYXZlcnNhbFN0cmF0ZWdpZXMgY2xvbmUoKSB7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvRW1wdHlUcmF2ZXJzYWxTdHJhdGVnaWVzLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvRW1wdHlUcmF2ZXJzYWxTdHJhdGVnaWVzLmphdmEKaW5kZXggMTI3ZGY0ZC4uZjk5ZDRiYyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL0VtcHR5VHJhdmVyc2FsU3RyYXRlZ2llcy5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9FbXB0eVRyYXZlcnNhbFN0cmF0ZWdpZXMuamF2YQpAQCAtMTgsMTQgKzE4LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ2llczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudHJhdmVyc2VyLlRyYXZlcnNlckdlbmVyYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIudXRpbC5EZWZhdWx0VHJhdmVyc2VyR2VuZXJhdG9yRmFjdG9yeTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgpAQCAtNDMsOSArNDAsMTAgQEAKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFwcGx5U3RyYXRlZ2llcyhmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmF0b3I8VHJhdmVyc2FsU3RyYXRlZ3k8Pz4+IGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gdG9MaXN0KCkuaXRlcmF0b3IoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9QdXJlVHJhdmVyc2FsLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvUHVyZVRyYXZlcnNhbC5qYXZhCmluZGV4IDY4MmYwZDIuLmUyOGJjZDQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9QdXJlVHJhdmVyc2FsLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1B1cmVUcmF2ZXJzYWwuamF2YQpAQCAtMTksNyArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnV0aWwuVmVydGV4UHJvZ3JhbUhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9UcmF2ZXJzYWxFeHBsYW5hdGlvbi5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1RyYXZlcnNhbEV4cGxhbmF0aW9uLmphdmEKaW5kZXggYzRmYTA1Ny4uYzc5M2E5NSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1RyYXZlcnNhbEV4cGxhbmF0aW9uLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1RyYXZlcnNhbEV4cGxhbmF0aW9uLmphdmEKQEAgLTUxLDggKzUxLDggQEAKIAogICAgIHB1YmxpYyBUcmF2ZXJzYWxFeHBsYW5hdGlvbihmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7CiAgICAgICAgIHRoaXMudHJhdmVyc2FsID0gdHJhdmVyc2FsLmNsb25lKCk7Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWdpZXMgbXV0YXRpbmdTdHJhdGVnaWVzID0gbmV3IERlZmF1bHRUcmF2ZXJzYWxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiB0aGlzLnRyYXZlcnNhbC5nZXRTdHJhdGVnaWVzKCkudG9MaXN0KCkpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsU3RyYXRlZ2llcyBtdXRhdGluZ1N0cmF0ZWdpZXMgPSBuZXcgRGVmYXVsdFRyYXZlcnNhbFN0cmF0ZWdpZXMoKTsKKyAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneSBzdHJhdGVneSA6IHRoaXMudHJhdmVyc2FsLmdldFN0cmF0ZWdpZXMoKSkgewogICAgICAgICAgICAgZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IG11dGF0aW5nVHJhdmVyc2FsID0gdGhpcy50cmF2ZXJzYWwuY2xvbmUoKTsKICAgICAgICAgICAgIG11dGF0aW5nU3RyYXRlZ2llcy5hZGRTdHJhdGVnaWVzKHN0cmF0ZWd5KTsKICAgICAgICAgICAgIG11dGF0aW5nVHJhdmVyc2FsLnNldFN0cmF0ZWdpZXMobXV0YXRpbmdTdHJhdGVnaWVzKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9UcmF2ZXJzYWxIZWxwZXIuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9UcmF2ZXJzYWxIZWxwZXIuamF2YQppbmRleCAyMTMxOWY1Li40ZTdlYjkyIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvVHJhdmVyc2FsSGVscGVyLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1RyYXZlcnNhbEhlbHBlci5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5TdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuRWxlbWVudFZhbHVlVHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLlZhbHVlVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhLlRva2VuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5CeU1vZHVsYXRpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLkhhc0NvbnRhaW5lckhvbGRlcjsKQEAgLTk4LDcgKzk4LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGNoYXIgaXNMb2NhbFN0YXJHcmFwaChmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsLCBjaGFyIHN0YXRlKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSAndScgJiYKLSAgICAgICAgICAgICAgICAodHJhdmVyc2FsIGluc3RhbmNlb2YgRWxlbWVudFZhbHVlVHJhdmVyc2FsIHx8CisgICAgICAgICAgICAgICAgKHRyYXZlcnNhbCBpbnN0YW5jZW9mIFZhbHVlVHJhdmVyc2FsIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAodHJhdmVyc2FsIGluc3RhbmNlb2YgVG9rZW5UcmF2ZXJzYWwgJiYgISgoVG9rZW5UcmF2ZXJzYWwpIHRyYXZlcnNhbCkuZ2V0VG9rZW4oKS5lcXVhbHMoVC5pZCkpKSkKICAgICAgICAgICAgIHJldHVybiAneCc7CiAgICAgICAgIGZvciAoZmluYWwgU3RlcCBzdGVwIDogdHJhdmVyc2FsLmdldFN0ZXBzKCkpIHsKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcCBpbnN0YW5jZW9mIFRyYXZlcnNhbFBhcmVudCkgewogICAgICAgICAgICAgICAgIGZpbmFsIGNoYXIgY3VyclN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgU2V0PENoYXJhY3Rlcj4gc3RhdGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgICAgIGZpbmFsIFNldDxDaGFyYWN0ZXI+IHN0YXRlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBsb2NhbCA6ICgoVHJhdmVyc2FsUGFyZW50KSBzdGVwKS5nZXRMb2NhbENoaWxkcmVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBzID0gaXNMb2NhbFN0YXJHcmFwaChsb2NhbCwgY3VyclN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCd4JyA9PSBzKSByZXR1cm4gJ3gnOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2xvYmFsQ2hpbGQoVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgewotICAgICAgICB3aGlsZSAoISh0cmF2ZXJzYWwuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBFbXB0eVN0ZXApKSB7CisgICAgICAgIHdoaWxlICghKHRyYXZlcnNhbC5pc1Jvb3QoKSkpIHsKICAgICAgICAgICAgIGlmICh0cmF2ZXJzYWwuZ2V0UGFyZW50KCkuZ2V0TG9jYWxDaGlsZHJlbigpLmNvbnRhaW5zKHRyYXZlcnNhbCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgdHJhdmVyc2FsID0gdHJhdmVyc2FsLmdldFBhcmVudCgpLmFzU3RlcCgpLmdldFRyYXZlcnNhbCgpOwpAQCAtNDY1LDcgKzQ2NSwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVRyYXZlcnNhbFJlY3Vyc2l2ZWx5KGZpbmFsIENvbnN1bWVyPFRyYXZlcnNhbC5BZG1pbjw/LCA/Pj4gY29uc3VtZXIsIGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiB0cmF2ZXJzYWwpIHsKICAgICAgICAgY29uc3VtZXIuYWNjZXB0KHRyYXZlcnNhbCk7Ci0gICAgICAgIGZvciAoZmluYWwgU3RlcDw/LCA/PiBzdGVwIDogdHJhdmVyc2FsLmdldFN0ZXBzKCkpIHsKKworICAgICAgICAvLyB3ZSBnZXQgYWNjdXNlZCBvZiBjb25jdXJyZW50bW9kaWZpY2F0aW9uIGlmIHdlIHRyeSBhIGZvcihJdGVyYWJsZSkKKyAgICAgICAgZmluYWwgTGlzdDxTdGVwPiBzdGVwcyA9IHRyYXZlcnNhbC5nZXRTdGVwcygpOworICAgICAgICBmb3IgKGludCBpeCA9IDA7IGl4IDwgc3RlcHMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdGVwIHN0ZXAgPSBzdGVwcy5nZXQoaXgpOwogICAgICAgICAgICAgaWYgKHN0ZXAgaW5zdGFuY2VvZiBUcmF2ZXJzYWxQYXJlbnQpIHsKICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbC5BZG1pbjw/LCA/PiBsb2NhbCA6ICgoVHJhdmVyc2FsUGFyZW50KSBzdGVwKS5nZXRMb2NhbENoaWxkcmVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgYXBwbHlUcmF2ZXJzYWxSZWN1cnNpdmVseShjb25zdW1lciwgbG9jYWwpOwpAQCAtNjI5LDcgKzYzMyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG9uR3JhcGhDb21wdXRlcihUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhdmVyc2FsKSB7Ci0gICAgICAgIHdoaWxlICghKHRyYXZlcnNhbC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEVtcHR5U3RlcCkpIHsKKyAgICAgICAgd2hpbGUgKCEodHJhdmVyc2FsLmlzUm9vdCgpKSkgewogICAgICAgICAgICAgaWYgKHRyYXZlcnNhbC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFRyYXZlcnNhbFZlcnRleFByb2dyYW1TdGVwKQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgdHJhdmVyc2FsID0gdHJhdmVyc2FsLmdldFBhcmVudCgpLmFzU3RlcCgpLmdldFRyYXZlcnNhbCgpOwpAQCAtNjgzLDcgKzY4Nyw3IEBACiAgICAgICAgIGNoaWxkVHJhdmVyc2FsLnNldFN0cmF0ZWdpZXMocGFyZW50VHJhdmVyc2FsLmdldFN0cmF0ZWdpZXMoKSk7CiAgICAgICAgIGNoaWxkVHJhdmVyc2FsLnNldFNpZGVFZmZlY3RzKHBhcmVudFRyYXZlcnNhbC5nZXRTaWRlRWZmZWN0cygpKTsKICAgICAgICAgcGFyZW50VHJhdmVyc2FsLmdldEdyYXBoKCkuaWZQcmVzZW50KGNoaWxkVHJhdmVyc2FsOjpzZXRHcmFwaCk7Ci0gICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3k8Pz4gc3RyYXRlZ3kgOiBwYXJlbnRUcmF2ZXJzYWwuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpKSB7CisgICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3k8Pz4gc3RyYXRlZ3kgOiBwYXJlbnRUcmF2ZXJzYWwuZ2V0U3RyYXRlZ2llcygpKSB7CiAgICAgICAgICAgICBzdHJhdGVneS5hcHBseShjaGlsZFRyYXZlcnNhbCk7CiAgICAgICAgICAgICBpZiAobnVsbCAhPSBzdG9wQWZ0ZXJTdHJhdGVneSAmJiBzdG9wQWZ0ZXJTdHJhdGVneS5pc0luc3RhbmNlKHN0cmF0ZWd5KSkKICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9UcmF2ZXJzYWxSaW5nLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvVHJhdmVyc2FsUmluZy5qYXZhCmluZGV4IDA5YzM2MmUuLmJiZGY3MDEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9UcmF2ZXJzYWxSaW5nLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1RyYXZlcnNhbFJpbmcuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCiAvKioKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQpAQCAtNjIsNiArNjMsMTUgQEAKICAgICAgICAgdGhpcy50cmF2ZXJzYWxzLmFkZCh0cmF2ZXJzYWwpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VUcmF2ZXJzYWwoZmluYWwgVHJhdmVyc2FsLkFkbWluPEEsIEI+IG9sZFRyYXZlcnNhbCwgZmluYWwgVHJhdmVyc2FsLkFkbWluPEEsIEI+IG5ld1RyYXZlcnNhbCkgeworICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IHRoaXMudHJhdmVyc2Fscy5zaXplKCk7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhvbGRUcmF2ZXJzYWwsIHRoaXMudHJhdmVyc2Fscy5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzYWxzLnNldChpLCBuZXdUcmF2ZXJzYWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIExpc3Q8VHJhdmVyc2FsLkFkbWluPEEsIEI+PiBnZXRUcmF2ZXJzYWxzKCkgewogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLnRyYXZlcnNhbHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL0RpcmVjdGlvbi5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvRGlyZWN0aW9uLmphdmEKaW5kZXggZDQxMmUyNC4uMTFkYjEzZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvRGlyZWN0aW9uLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvRGlyZWN0aW9uLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKICAqIHtAbGluayBFZGdlfS4gRm9yIGV4YW1wbGU6CiAgKiA8cC8+CiAgKiA8cHJlPgotICogZ3JlbWxpbi0ta25vd3MtLT5yZXhzdGVyCisgKiBncmVtbGluLS1rbm93cy0tJmd0O3JleHN0ZXIKICAqIDwvcHJlPgogICogaXMgYW4ge0BsaW5rIERpcmVjdGlvbiNPVVR9IHtAbGluayBFZGdlfSBmb3IgR3JlbWxpbiBhbmQgYW4ge0BsaW5rIERpcmVjdGlvbiNJTn0gZWRnZSBmb3IgUmV4c3Rlci4gTW9yZW92ZXIsIGdpdmVuCiAgKiB0aGF0IHtAbGluayBFZGdlfSwgR3JlbWxpbiBpcyB0aGUge0BsaW5rIERpcmVjdGlvbiNPVVR9IHtAbGluayBWZXJ0ZXh9IGFuZCBSZXhzdGVyIGlzIHRoZSB7QGxpbmsgRGlyZWN0aW9uI0lOfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvRWRnZS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvRWRnZS5qYXZhCmluZGV4IDZkZjM4ZDIuLmZiYTlhZTcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL0VkZ2UuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9FZGdlLmphdmEKQEAgLTI5LDcgKzI5LDcgQEAKICAqIDxwLz4KICAqIERpYWdyYW1tYXRpY2FsbHk6CiAgKiA8cHJlPgotICogb3V0VmVydGV4IC0tLWxhYmVsLS0tPiBpblZlcnRleC4KKyAqIG91dFZlcnRleCAtLS1sYWJlbC0tLSZndDsgaW5WZXJ0ZXguCiAgKiA8L3ByZT4KICAqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL0dyYXBoLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9HcmFwaC5qYXZhCmluZGV4IDVkZDRmZjUuLmIxNjVjYmQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL0dyYXBoLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvR3JhcGguamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNvdXJjZTsKQEAgLTMyMyw4ICszMjMsOCBAQAogICAgIHB1YmxpYyBWYXJpYWJsZXMgdmFyaWFibGVzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAY29kZSBDb25maWd1cmF0aW9ufSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIGdyYXBoLiAgV2hhdGV2ZXIgY29uZmlndXJhdGlvbiB3YXMKLSAgICAgKiBwYXNzZWQgdG8ge0BsaW5rIEdyYXBoRmFjdG9yeSNvcGVuKENvbmZpZ3VyYXRpb24pfSBpcyB3aGF0IHNob3VsZCBiZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiBHZXQgdGhlIHtAY29kZSBDb25maWd1cmF0aW9ufSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIGdyYXBoLiBXaGF0ZXZlciBjb25maWd1cmF0aW9uIHdhcyBwYXNzZWQKKyAgICAgKiB0byB7QGxpbmsgR3JhcGhGYWN0b3J5I29wZW4oQ29uZmlndXJhdGlvbil9IGlzIHdoYXQgc2hvdWxkIGJlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLgogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiB1c2VkIGR1cmluZyBncmFwaCBjb25zdHJ1Y3Rpb24uCiAgICAgICovCkBAIC02ODYsNiArNjg2LDE3IEBACiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FOWV9JRFMgPSAiQW55SWRzIjsKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUREX1BST1BFUlRZID0gIkFkZFByb3BlcnR5IjsKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfUkVNT1ZFX1BST1BFUlRZID0gIlJlbW92ZVByb3BlcnR5IjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfTlVMTF9QUk9QRVJUWV9WQUxVRVMgPSAiTnVsbFByb3BlcnR5VmFsdWVzIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBFbGVtZW50fSBhbGxvd3MgcHJvcGVydGllcyB3aXRoIHtAY29kZSBudWxsfSBwcm9wZXJ0eSB2YWx1ZXMuIEluIHRoZSBldmVudCB0aGF0CisgICAgICAgICAgICAgKiB0aGlzIHZhbHVlIGlzIHtAY29kZSBmYWxzZX0sIHRoZSB1bmRlcmx5aW5nIGdyYXBoIG11c3QgdHJlYXQge0Bjb2RlIG51bGx9IGFzIGFuIGluZGljYXRpb24gdG8gcmVtb3ZlCisgICAgICAgICAgICAgKiB0aGUgcHJvcGVydHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBGZWF0dXJlRGVzY3JpcHRvcihuYW1lID0gRkVBVFVSRV9OVUxMX1BST1BFUlRZX1ZBTFVFUykKKyAgICAgICAgICAgIHB1YmxpYyBkZWZhdWx0IGJvb2xlYW4gc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogRGV0ZXJtaW5lcyBpZiBhbiB7QGxpbmsgRWxlbWVudH0gYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQuICBUaGlzIGZlYXR1cmUgaXMgc2V0IGluZGVwZW5kZW50bHkgZnJvbQpAQCAtODIwLDYgKzgzMSwxNSBAQAogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9VVUlEX0lEUyA9ICJVdWlkSWRzIjsKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQ1VTVE9NX0lEUyA9ICJDdXN0b21JZHMiOwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BTllfSURTID0gIkFueUlkcyI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX05VTExfUFJPUEVSVFlfVkFMVUVTID0gIk51bGxQcm9wZXJ0eVZhbHVlcyI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRGV0ZXJtaW5lcyBpZiBtZXRhLXByb3BlcnRpZXMgYWxsb3cgZm9yIHtAY29kZSBudWxsfSBwcm9wZXJ0eSB2YWx1ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBGZWF0dXJlRGVzY3JpcHRvcihuYW1lID0gRkVBVFVSRV9OVUxMX1BST1BFUlRZX1ZBTFVFUykKKyAgICAgICAgICAgIHB1YmxpYyBkZWZhdWx0IGJvb2xlYW4gc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogRGV0ZXJtaW5lcyBpZiBhIHtAbGluayBWZXJ0ZXhQcm9wZXJ0eX0gYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgcmVtb3ZlZC4KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL1Byb3BlcnR5LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9Qcm9wZXJ0eS5qYXZhCmluZGV4IDViNjdmMDcuLmVhYzgzNTUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL1Byb3BlcnR5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvUHJvcGVydHkuamF2YQpAQCAtMTM5LDEwICsxMzksNiBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5IGtleSBjYW4gbm90IGJlIG51bGwiKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHByb3BlcnR5VmFsdWVDYW5Ob3RCZU51bGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQogICAgICAgICBwdWJsaWMgc3RhdGljIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBwcm9wZXJ0eUtleUNhbk5vdEJlQUhpZGRlbktleShmaW5hbCBTdHJpbmcga2V5KSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkga2V5IGNhbiBub3QgYmUgYSBoaWRkZW4ga2V5OiAiICsga2V5KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvVmVydGV4LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9WZXJ0ZXguamF2YQppbmRleCA3YjBkMmE1Li5hOTcyYzcyIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9WZXJ0ZXguamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9WZXJ0ZXguamF2YQpAQCAtMjksNyArMjksNyBAQAogICogPHAvPgogICogRGlhZ3JhbW1hdGljYWxseToKICAqIDxwcmU+Ci0gKiAtLS1pbkVkZ2VzLS0tPiB2ZXJ0ZXggLS0tb3V0RWRnZXMtLS0+LgorICogLS0taW5FZGdlcy0tLSZndDsgdmVydGV4IC0tLW91dEVkZ2VzLS0tJmd0Oy4KICAqIDwvcHJlPgogICoKICAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vYmluYXJ5L1R5cGVTZXJpYWxpemVyUmVnaXN0cnkuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2JpbmFyeS9UeXBlU2VyaWFsaXplclJlZ2lzdHJ5LmphdmEKaW5kZXggMzlhZWFhZi4uY2VkMDA4OCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vYmluYXJ5L1R5cGVTZXJpYWxpemVyUmVnaXN0cnkuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9iaW5hcnkvVHlwZVNlcmlhbGl6ZXJSZWdpc3RyeS5qYXZhCkBAIC00Niw3ICs0Niw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uSW9SZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uTGFtYmRhOworaW1wb3J0IG9yZy5qYXZhdHVwbGVzLlBhaXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwpAQCAtMjIwLDEyICsyMjIsMjcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFByb3ZpZGVzIGEgd2F5IHRvIHJlc29sdmUgdGhlIHR5cGUgc2VyaWFsaXplciB0byB1c2Ugd2hlbiB0aGVyZSBpc24ndCBhbnkgZGlyZWN0IG1hdGNoLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgd2l0aEZhbGxiYWNrUmVzb2x2ZXIoRnVuY3Rpb248Q2xhc3M8Pz4sIFR5cGVTZXJpYWxpemVyPD8+PiBmYWxsYmFja1Jlc29sdmVyKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHdpdGhGYWxsYmFja1Jlc29sdmVyKGZpbmFsIEZ1bmN0aW9uPENsYXNzPD8+LCBUeXBlU2VyaWFsaXplcjw/Pj4gZmFsbGJhY2tSZXNvbHZlcikgewogICAgICAgICAgICAgdGhpcy5mYWxsYmFja1Jlc29sdmVyID0gZmFsbGJhY2tSZXNvbHZlcjsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCB7QGxpbmsgQ3VzdG9tVHlwZVNlcmlhbGl6ZXJ9IGJ5IHdheSBvZiBhbiB7QGxpbmsgSW9SZWdpc3RyeX0uIFRoZSByZWdpc3RyeSBlbnRyaWVzIHNob3VsZCBiZSBib3VuZCB0bworICAgICAgICAgKiB7QGxpbmsgR3JhcGhCaW5hcnlJb30uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSZWdpc3RyeShmaW5hbCBJb1JlZ2lzdHJ5IHJlZ2lzdHJ5KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSByZWdpc3RyeSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHJlZ2lzdHJ5IGNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFpcjxDbGFzcywgQ3VzdG9tVHlwZVNlcmlhbGl6ZXI+PiBjbGFzc1NlcmlhbGl6ZXJzID0gcmVnaXN0cnkuZmluZChHcmFwaEJpbmFyeUlvLmNsYXNzLCBDdXN0b21UeXBlU2VyaWFsaXplci5jbGFzcyk7CisgICAgICAgICAgICBmb3IgKFBhaXI8Q2xhc3MsQ3VzdG9tVHlwZVNlcmlhbGl6ZXI+IGNzIDogY2xhc3NTZXJpYWxpemVycykgeworICAgICAgICAgICAgICAgIGFkZEN1c3RvbVR5cGUoY3MuZ2V0VmFsdWUwKCksIGNzLmdldFZhbHVlMSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVHlwZVNlcmlhbGl6ZXJSZWdpc3RyeX0gaW5zdGFuY2UgYmFzZWQgb24gdGhlIHNlcmlhbGl6ZXJzIGFkZGVkLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFR5cGVTZXJpYWxpemVyUmVnaXN0cnkgY3JlYXRlKCkgewpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vYmluYXJ5L3R5cGVzL0dyYXBoU2VyaWFsaXplci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vYmluYXJ5L3R5cGVzL0dyYXBoU2VyaWFsaXplci5qYXZhCmluZGV4IGQ2MjdmMTguLmYxMDdiOGEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2JpbmFyeS90eXBlcy9HcmFwaFNlcmlhbGl6ZXIuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9iaW5hcnkvdHlwZXMvR3JhcGhTZXJpYWxpemVyLmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5iaW5hcnkudHlwZXM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5iaW5hcnkuRGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uYmluYXJ5LkdyYXBoQmluYXJ5UmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmJpbmFyeS5HcmFwaEJpbmFyeVdyaXRlcjsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2JpbmFyeS90eXBlcy9UcmF2ZXJzYWxTdHJhdGVneVNlcmlhbGl6ZXIuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2JpbmFyeS90eXBlcy9UcmF2ZXJzYWxTdHJhdGVneVNlcmlhbGl6ZXIuamF2YQppbmRleCAzOGVhOWM5Li4yNTZlMjVkIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9iaW5hcnkvdHlwZXMvVHJhdmVyc2FsU3RyYXRlZ3lTZXJpYWxpemVyLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vYmluYXJ5L3R5cGVzL1RyYXZlcnNhbFN0cmF0ZWd5U2VyaWFsaXplci5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uYmluYXJ5LnR5cGVzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmJpbmFyeS5EYXRhVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5iaW5hcnkuR3JhcGhCaW5hcnlSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uYmluYXJ5LkdyYXBoQmluYXJ5V3JpdGVyOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhtbC9HcmFwaE1MV3JpdGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaG1sL0dyYXBoTUxXcml0ZXIuamF2YQppbmRleCAzOTkxZTRlLi41YzcwZTk5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaG1sL0dyYXBoTUxXcml0ZXIuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaG1sL0dyYXBoTUxXcml0ZXIuamF2YQpAQCAtMjQsNyArMjQsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OTWFwcGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9HcmFwaFNPTk1hcHBlci5qYXZhCmluZGV4IDMwMTEyZjkuLmJmYTIzOWIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OTWFwcGVyLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05NYXBwZXIuamF2YQpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBsb2FkQ3VzdG9tTW9kdWxlcyA9IGZhbHNlOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbm9ybWFsaXplID0gZmFsc2U7CiAgICAgICAgIHByaXZhdGUgTGlzdDxJb1JlZ2lzdHJ5PiByZWdpc3RyaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgR3JhcGhTT05WZXJzaW9uIHZlcnNpb24gPSBHcmFwaFNPTlZlcnNpb24uVjJfMDsKKyAgICAgICAgcHJpdmF0ZSBHcmFwaFNPTlZlcnNpb24gdmVyc2lvbiA9IEdyYXBoU09OVmVyc2lvbi5WM18wOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHcmFwaFNPTiAyLjAvMy4wIHNob3VsZCBoYXZlIHR5cGVzIGFjdGl2YXRlZCBieSBkZWZhdWx0ICgzLjAgZG9lcyBub3QgaGF2ZSBhIHR5cGVsZXNzIG9wdGlvbiksIGFuZCAxLjAKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgdmVyc2lvbiBvZiBHcmFwaFNPTiB0byB1c2UuIFRoZSBkZWZhdWx0IGlzIHtAbGluayBHcmFwaFNPTlZlcnNpb24jVjJfMH0uCisgICAgICAgICAqIFNldCB0aGUgdmVyc2lvbiBvZiBHcmFwaFNPTiB0byB1c2UuIFRoZSBkZWZhdWx0IGlzIHtAbGluayBHcmFwaFNPTlZlcnNpb24jVjNfMH0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQnVpbGRlciB2ZXJzaW9uKGZpbmFsIEdyYXBoU09OVmVyc2lvbiB2ZXJzaW9uKSB7CiAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05Nb2R1bGUuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OTW9kdWxlLmphdmEKaW5kZXggY2IwZWVhZi4uZjUxYjM0YyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05Nb2R1bGUuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9HcmFwaFNPTk1vZHVsZS5qYXZhCkBAIC00MSw5ICs0MSwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5IYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uT3B0aW9uc1N0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5QYXJ0aXRpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU2VlZFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5TdWJncmFwaFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZmluYWxpemF0aW9uLk1hdGNoQWxnb3JpdGhtU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uQWRqYWNlbnRUb0luY2lkZW50U3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5FYXJseUxpbWl0U3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uRmlsdGVyUmFua2luZ1N0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLklkZW50aXR5UmVtb3ZhbFN0cmF0ZWd5OwpAQCAtMTg1LDkgKzE4NywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbHRlZFRyYXZlcnNlclN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmdyYXBoU3RyYXRlZ3kuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlZFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhenlCYXJyaWVyU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hBbGdvcml0aG1TdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGphY2VudFRvSW5jaWRlbnRTdHJhdGVneS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50U3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyUmFua2luZ1N0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aXR5UmVtb3ZhbFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5LmNsYXNzLApAQCAtMTk3LDcgKzIwMiw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uc1N0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhQcm9jZXNzb3JTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoUmV0cmFjdGlvblN0cmF0ZWd5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50U3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0VW5yb2xsU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZXJWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW1iZGFSZXN0cmljdGlvblN0cmF0ZWd5LmNsYXNzLApAQCAtMzExLDkgKzMxNSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBIYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIFN1YmdyYXBoU3RyYXRlZ3kuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFNlZWRTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgTGF6eUJhcnJpZXJTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgTWF0Y2hBbGdvcml0aG1TdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgQWRqYWNlbnRUb0luY2lkZW50U3RyYXRlZ3kuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIEJ5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3kuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIENvdW50U3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIEZpbHRlclJhbmtpbmdTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgSWRlbnRpdHlSZW1vdmFsU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIEluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5LmNsYXNzLApAQCAtMzIzLDcgKzMzMCw2IEBACiAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnNTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgUGF0aFByb2Nlc3NvclN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICBQYXRoUmV0cmFjdGlvblN0cmF0ZWd5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBDb3VudFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICBSZXBlYXRVbnJvbGxTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZXJWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgTGFtYmRhUmVzdHJpY3Rpb25TdHJhdGVneS5jbGFzcywKQEAgLTQxNyw5ICs0MjMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25TdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJncmFwaFN0cmF0ZWd5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWRTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5QmFycmllclN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoQWxnb3JpdGhtU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqYWNlbnRUb0luY2lkZW50U3RyYXRlZ3kuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclJhbmtpbmdTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGl0eVJlbW92YWxTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNpZGVudFRvQWRqYWNlbnRTdHJhdGVneS5jbGFzcywKQEAgLTQyOSw3ICs0MzgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnNTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoUHJvY2Vzc29yU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aFJldHJhY3Rpb25TdHJhdGVneS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdFVucm9sbFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGVyVmVyaWZpY2F0aW9uU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFtYmRhUmVzdHJpY3Rpb25TdHJhdGVneS5jbGFzcywKQEAgLTUzMyw5ICs1NDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgSGFsdGVkVHJhdmVyc2VyU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICBTdWJncmFwaFN0cmF0ZWd5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBTZWVkU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIExhenlCYXJyaWVyU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIE1hdGNoQWxnb3JpdGhtU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIEFkamFjZW50VG9JbmNpZGVudFN0cmF0ZWd5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBDb3VudFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICBGaWx0ZXJSYW5raW5nU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIElkZW50aXR5UmVtb3ZhbFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICBJbmNpZGVudFRvQWRqYWNlbnRTdHJhdGVneS5jbGFzcywKQEAgLTU0NSw3ICs1NTYsNiBAQAogICAgICAgICAgICAgICAgICAgICBPcHRpb25zU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIFBhdGhQcm9jZXNzb3JTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgUGF0aFJldHJhY3Rpb25TdHJhdGVneS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgQ291bnRTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgUmVwZWF0VW5yb2xsU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIENvbXB1dGVyVmVyaWZpY2F0aW9uU3RyYXRlZ3kuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIExhbWJkYVJlc3RyaWN0aW9uU3RyYXRlZ3kuY2xhc3MsCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9MZWdhY3lHcmFwaFNPTlJlYWRlci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vTGVnYWN5R3JhcGhTT05SZWFkZXIuamF2YQppbmRleCAzMTI1ZTczLi43NDMyZTIyIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9MZWdhY3lHcmFwaFNPTlJlYWRlci5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL0xlZ2FjeUdyYXBoU09OUmVhZGVyLmphdmEKQEAgLTIwNSw3ICsyMDUsNiBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbG9hZEN1c3RvbU1vZHVsZXMgPSBmYWxzZTsKICAgICAgICAgcHJpdmF0ZSBMaXN0PFNpbXBsZU1vZHVsZT4gY3VzdG9tTW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBwcml2YXRlIGxvbmcgYmF0Y2hTaXplID0gMTAwMDA7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBlbWJlZFR5cGVzID0gZmFsc2U7CiAKICAgICAgICAgcHJpdmF0ZSBCdWlsZGVyKCkgewogICAgICAgICB9CkBAIC0yMzYsOSArMjM1LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgTGVnYWN5R3JhcGhTT05SZWFkZXIgY3JlYXRlKCkgewotICAgICAgICAgICAgZmluYWwgR3JhcGhTT05NYXBwZXIuQnVpbGRlciBidWlsZGVyID0gR3JhcGhTT05NYXBwZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIC8vIG5vdCBzdXJlIHdoeSB0aGVyZSBpcyBzcGVjaWZpYyBuZWVkIGZvciBWMiBoZXJlIHdpdGggIm5vIHR5cGVzIiBhcyB3ZSBkb24ndCBldmVuIG5lZWQgVFAzIEdyYXBoU09OCisgICAgICAgICAgICAvLyBhdCBhbGwuIFNlZW1zIGxpa2UgYSBzdGFuZGFyZCBKYWNrc29uIE9iamVjdE1hcHBlciB3b3VsZCBoYXZlIHdvcmtlZCBmaW5lLCBidXQgcmF0aGVyIHRoYW4gY2hhbmdlCisgICAgICAgICAgICAvLyB0aGlzIGFuY2llbnQgY2xhc3MgYXQgdGhpcyBzdGFnZSB3ZSdsbCBqdXN0IHN0aWNrIHRvIHdoYXQgaXMgdGhlcmUuCisgICAgICAgICAgICBmaW5hbCBHcmFwaFNPTk1hcHBlci5CdWlsZGVyIGJ1aWxkZXIgPSBHcmFwaFNPTk1hcHBlci5idWlsZCgpLnZlcnNpb24oR3JhcGhTT05WZXJzaW9uLlYyXzApOwogICAgICAgICAgICAgY3VzdG9tTW9kdWxlcy5mb3JFYWNoKGJ1aWxkZXI6OmFkZEN1c3RvbU1vZHVsZSk7Ci0gICAgICAgICAgICBmaW5hbCBHcmFwaFNPTk1hcHBlciBtYXBwZXIgPSBidWlsZGVyLnR5cGVJbmZvKGVtYmVkVHlwZXMgPyBUeXBlSW5mby5QQVJUSUFMX1RZUEVTIDogVHlwZUluZm8uTk9fVFlQRVMpCisgICAgICAgICAgICBmaW5hbCBHcmFwaFNPTk1hcHBlciBtYXBwZXIgPSBidWlsZGVyLnR5cGVJbmZvKFR5cGVJbmZvLk5PX1RZUEVTKQogICAgICAgICAgICAgICAgICAgICAubG9hZEN1c3RvbU1vZHVsZXMobG9hZEN1c3RvbU1vZHVsZXMpLmNyZWF0ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lHcmFwaFNPTlJlYWRlcihtYXBwZXIuY3JlYXRlTWFwcGVyKCksIGJhdGNoU2l6ZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL1RyYXZlcnNhbFNlcmlhbGl6ZXJzVjJkMC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vVHJhdmVyc2FsU2VyaWFsaXplcnNWMmQwLmphdmEKaW5kZXggNTI5NzczMy4uYzY2YTFlOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vVHJhdmVyc2FsU2VyaWFsaXplcnNWMmQwLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vVHJhdmVyc2FsU2VyaWFsaXplcnNWMmQwLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5EZWZhdWx0UmVtb3RlVHJhdmVyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQnl0ZWNvZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5QOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vVHJhdmVyc2FsU2VyaWFsaXplcnNWM2QwLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9UcmF2ZXJzYWxTZXJpYWxpemVyc1YzZDAuamF2YQppbmRleCA1MTMyZWJkLi5jYzIyNGNiIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9UcmF2ZXJzYWxTZXJpYWxpemVyc1YzZDAuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9UcmF2ZXJzYWxTZXJpYWxpemVyc1YzZDAuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsLkRlZmF1bHRSZW1vdGVUcmF2ZXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5CeXRlY29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlA7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9WZXJzaW9uLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9WZXJzaW9uLmphdmEKaW5kZXggMzEzODQ4OC4uZWI5NTY2ZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9HcnlvVmVyc2lvbi5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vR3J5b1ZlcnNpb24uamF2YQpAQCAtNTAsOSArNTAsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uSGFsdGVkVHJhdmVyc2VyU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLk9wdGlvbnNTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uUGFydGl0aW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlNlZWRTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU3ViZ3JhcGhTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmZpbmFsaXphdGlvbi5NYXRjaEFsZ29yaXRobVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkFkamFjZW50VG9JbmNpZGVudFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkJ5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uRWFybHlMaW1pdFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkZpbHRlclJhbmtpbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5JZGVudGl0eVJlbW92YWxTdHJhdGVneTsKQEAgLTMzMywxMCArMzM1LDEzIEBACiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoSGFsdGVkVHJhdmVyc2VyU3RyYXRlZ3kuY2xhc3MsIDEzOSkpOwogICAgICAgICAgICAgYWRkKEdyeW9UeXBlUmVnLm9mKFBhcnRpdGlvblN0cmF0ZWd5LmNsYXNzLCAxNDAsIG5ldyBKYXZhU2VyaWFsaXplcigpKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoU3ViZ3JhcGhTdHJhdGVneS5jbGFzcywgMTQxLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSkpOworICAgICAgICAgICAgYWRkKEdyeW9UeXBlUmVnLm9mKFNlZWRTdHJhdGVneS5jbGFzcywgMTkyLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSkpOyAgICAgICAgICAvLyAqKipMQVNUIElEKioqCiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoVmVydGV4UHJvZ3JhbVN0cmF0ZWd5LmNsYXNzLCAxNDIsIG5ldyBKYXZhU2VyaWFsaXplcigpKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTWF0Y2hBbGdvcml0aG1TdHJhdGVneS5jbGFzcywgMTQzKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTWF0Y2hTdGVwLkdyZWVkeU1hdGNoQWxnb3JpdGhtLmNsYXNzLCAxNDQpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihBZGphY2VudFRvSW5jaWRlbnRTdHJhdGVneS5jbGFzcywgMTQ1KSk7CisgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneS5jbGFzcywgMTkxKSk7CisgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoQ291bnRTdHJhdGVneS5jbGFzcywgMTU1KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoRmlsdGVyUmFua2luZ1N0cmF0ZWd5LmNsYXNzLCAxNDYpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihJZGVudGl0eVJlbW92YWxTdHJhdGVneS5jbGFzcywgMTQ3KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoSW5jaWRlbnRUb0FkamFjZW50U3RyYXRlZ3kuY2xhc3MsIDE0OCkpOwpAQCAtMzQ3LDcgKzM1Miw2IEBACiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoT3B0aW9uc1N0cmF0ZWd5LmNsYXNzLCAxODcsIG5ldyBKYXZhU2VyaWFsaXplcigpKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoUGF0aFByb2Nlc3NvclN0cmF0ZWd5LmNsYXNzLCAxNTMpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihQYXRoUmV0cmFjdGlvblN0cmF0ZWd5LmNsYXNzLCAxNTQpKTsKLSAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihDb3VudFN0cmF0ZWd5LmNsYXNzLCAxNTUpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihSZXBlYXRVbnJvbGxTdHJhdGVneS5jbGFzcywgMTU2KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoR3JhcGhGaWx0ZXJTdHJhdGVneS5jbGFzcywgMTU3KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTGFtYmRhUmVzdHJpY3Rpb25TdHJhdGVneS5jbGFzcywgMTU4KSk7CkBAIC0zNTYsNyArMzYwLDcgQEAKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihNYXRjaFN0ZXAuQ291bnRNYXRjaEFsZ29yaXRobS5jbGFzcywgMTYwKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTWF0Y2hTdGVwLkdyZWVkeU1hdGNoQWxnb3JpdGhtLmNsYXNzLCAxNjQpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihFZGdlTGFiZWxWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcywgMTg5KSk7Ci0gICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoUmVzZXJ2ZWRLZXlzVmVyaWZpY2F0aW9uU3RyYXRlZ3kuY2xhc3MsIDE5MCkpOyAgIC8vICoqKkxBU1QgSUQqKioKKyAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihSZXNlcnZlZEtleXNWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcywgMTkwKSk7CiAKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihUcmF2ZXJzZXJTZXQuY2xhc3MsIDU4KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoVHJlZS5jbGFzcywgNjEpKTsKQEAgLTU3MCwxMCArNTc0LDEzIEBACiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoSGFsdGVkVHJhdmVyc2VyU3RyYXRlZ3kuY2xhc3MsIDEzOSkpOwogICAgICAgICAgICAgYWRkKEdyeW9UeXBlUmVnLm9mKFBhcnRpdGlvblN0cmF0ZWd5LmNsYXNzLCAxNDAsIG5ldyBKYXZhU2VyaWFsaXplcigpKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoU3ViZ3JhcGhTdHJhdGVneS5jbGFzcywgMTQxLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSkpOworICAgICAgICAgICAgYWRkKEdyeW9UeXBlUmVnLm9mKFNlZWRTdHJhdGVneS5jbGFzcywgMTkyLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSkpOyAgICAgICAgICAvLyAqKipMQVNUIElEKioqCiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoVmVydGV4UHJvZ3JhbVN0cmF0ZWd5LmNsYXNzLCAxNDIsIG5ldyBKYXZhU2VyaWFsaXplcigpKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTWF0Y2hBbGdvcml0aG1TdHJhdGVneS5jbGFzcywgMTQzKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTWF0Y2hTdGVwLkdyZWVkeU1hdGNoQWxnb3JpdGhtLmNsYXNzLCAxNDQpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihBZGphY2VudFRvSW5jaWRlbnRTdHJhdGVneS5jbGFzcywgMTQ1KSk7CisgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneS5jbGFzcywgMTkxKSk7CisgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoQ291bnRTdHJhdGVneS5jbGFzcywgMTU1KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoRmlsdGVyUmFua2luZ1N0cmF0ZWd5LmNsYXNzLCAxNDYpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihJZGVudGl0eVJlbW92YWxTdHJhdGVneS5jbGFzcywgMTQ3KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoSW5jaWRlbnRUb0FkamFjZW50U3RyYXRlZ3kuY2xhc3MsIDE0OCkpOwpAQCAtNTg0LDcgKzU5MSw2IEBACiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoT3B0aW9uc1N0cmF0ZWd5LmNsYXNzLCAxODcsIG5ldyBKYXZhU2VyaWFsaXplcigpKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoUGF0aFByb2Nlc3NvclN0cmF0ZWd5LmNsYXNzLCAxNTMpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihQYXRoUmV0cmFjdGlvblN0cmF0ZWd5LmNsYXNzLCAxNTQpKTsKLSAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihDb3VudFN0cmF0ZWd5LmNsYXNzLCAxNTUpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihSZXBlYXRVbnJvbGxTdHJhdGVneS5jbGFzcywgMTU2KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoR3JhcGhGaWx0ZXJTdHJhdGVneS5jbGFzcywgMTU3KSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTGFtYmRhUmVzdHJpY3Rpb25TdHJhdGVneS5jbGFzcywgMTU4KSk7CkBAIC01OTMsNyArNTk5LDcgQEAKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihNYXRjaFN0ZXAuQ291bnRNYXRjaEFsZ29yaXRobS5jbGFzcywgMTYwKSk7CiAgICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoTWF0Y2hTdGVwLkdyZWVkeU1hdGNoQWxnb3JpdGhtLmNsYXNzLCAxNjcpKTsKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihFZGdlTGFiZWxWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcywgMTg5KSk7Ci0gICAgICAgICAgICBhZGQoR3J5b1R5cGVSZWcub2YoUmVzZXJ2ZWRLZXlzVmVyaWZpY2F0aW9uU3RyYXRlZ3kuY2xhc3MsIDE5MCkpOyAgIC8vICoqKkxBU1QgSUQqKioKKyAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihSZXNlcnZlZEtleXNWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcywgMTkwKSk7CiAgICAgICAgICAgICAvLyBza2lwIDE3MSwgMTcyIHRvIHN5bmMgd2l0aCB0aGUgMy4zLngKICAgICAgICAgICAgIGFkZChHcnlvVHlwZVJlZy5vZihJbmRleGVkVHJhdmVyc2VyU2V0LlZlcnRleEluZGV4ZWRUcmF2ZXJzZXJTZXQuY2xhc3MsIDE3MykpOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL2tyeW9zaGltL0tyeW9TaGltU2VydmljZS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9rcnlvc2hpbS9LcnlvU2hpbVNlcnZpY2UuamF2YQppbmRleCA0NDIyZTFiLi42ZTdiYWZmIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL2tyeW9zaGltL0tyeW9TaGltU2VydmljZS5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8va3J5b3NoaW0vS3J5b1NoaW1TZXJ2aWNlLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncnlvLmtyeW9zaGltOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL2tyeW9zaGltL0tyeW9TaGltU2VydmljZUxvYWRlci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9rcnlvc2hpbS9LcnlvU2hpbVNlcnZpY2VMb2FkZXIuamF2YQppbmRleCA5N2U2ZDE2Li4zMTc5OTA1IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL2tyeW9zaGltL0tyeW9TaGltU2VydmljZUxvYWRlci5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8va3J5b3NoaW0vS3J5b1NoaW1TZXJ2aWNlTG9hZGVyLmphdmEKQEAgLTE4LDkgKzE4LDkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncnlvLmtyeW9zaGltOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLlN5c3RlbVV0aWw7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL3V0aWwvSW9SZWdpc3RyeUhlbHBlci5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vdXRpbC9Jb1JlZ2lzdHJ5SGVscGVyLmphdmEKaW5kZXggZjg3OGNmYy4uMWRiMjE5NyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vdXRpbC9Jb1JlZ2lzdHJ5SGVscGVyLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vdXRpbC9Jb1JlZ2lzdHJ5SGVscGVyLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby51dGlsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5Jb1JlZ2lzdHJ5OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9FbGVtZW50SGVscGVyLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0VsZW1lbnRIZWxwZXIuamF2YQppbmRleCAwZWY3YTYzLi42YmE1YjI5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0VsZW1lbnRIZWxwZXIuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0VsZW1lbnRIZWxwZXIuamF2YQpAQCAtODgsMTMgKzg4LDExIEBACiAgICAgICogYSBwcmUtY29uZGl0aW9uIGNoZWNrIHByaW9yIHRvIHNldHRpbmcgYSBwcm9wZXJ0eS4KICAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgICB0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hldGhlciB0aGUga2V5L3ZhbHVlIHBhaXIgaXMgbGVnYWwgYW5kIGlmIG5vdCwgYSBjbGVhciByZWFzb24gZXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpcyBwcm92aWRlZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVByb3BlcnR5KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChudWxsID09IHZhbHVlKQotICAgICAgICAgICAgdGhyb3cgUHJvcGVydHkuRXhjZXB0aW9ucy5wcm9wZXJ0eVZhbHVlQ2FuTm90QmVOdWxsKCk7CiAgICAgICAgIGlmIChudWxsID09IGtleSkKICAgICAgICAgICAgIHRocm93IFByb3BlcnR5LkV4Y2VwdGlvbnMucHJvcGVydHlLZXlDYW5Ob3RCZU51bGwoKTsKICAgICAgICAgaWYgKGtleS5pc0VtcHR5KCkpCkBAIC0xMDUsNyArMTAzLDcgQEAKIAogICAgIC8qKgogICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGxpc3Qgb2Yga2V5L3ZhbHVlcyBhcmUgbGVnYWwsIGVuc3VyaW5nIHRoYXQgdGhlcmUgYXJlIGFuIGV2ZW4gbnVtYmVyIG9mIHZhbHVlcyBzdWJtaXR0ZWQKLSAgICAgKiBhbmQgdGhhdCB0aGUga2V5IHZhbHVlcyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMgYXJlIHtAbGluayBTdHJpbmd9IG9yIHtAbGluayBFbGVtZW50fSBvYmplY3RzLgorICAgICAqIGFuZCB0aGF0IHRoZSBrZXlzIGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBhcmUge0BsaW5rIFN0cmluZ30gb3Ige0BsaW5rIFR9IG9iamVjdHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXlWYWx1ZXMgYSBsaXN0IG9mIGtleS92YWx1ZSBwYWlycwogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNvbWV0aGluZyBpbiB0aGUgcGFpcnMgaXMgaWxsZWdhbApAQCAtMTE2LDEwICsxMTQsNiBAQAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5S2V5VmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAyKSB7CiAgICAgICAgICAgICBpZiAoIShwcm9wZXJ0eUtleVZhbHVlc1tpXSBpbnN0YW5jZW9mIFN0cmluZykgJiYgIShwcm9wZXJ0eUtleVZhbHVlc1tpXSBpbnN0YW5jZW9mIFQpKQogICAgICAgICAgICAgICAgIHRocm93IEVsZW1lbnQuRXhjZXB0aW9ucy5wcm92aWRlZEtleVZhbHVlc011c3RIYXZlQUxlZ2FsS2V5T25FdmVuSW5kaWNlcygpOwotCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wZXJ0eUtleVZhbHVlc1tpICsgMV0pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBQcm9wZXJ0eS5FeGNlcHRpb25zLnByb3BlcnR5VmFsdWVDYW5Ob3RCZU51bGwoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTI4LDEyICsxMjIsMTEgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBrZXlWYWx1ZXMgYSBsaXN0IG9mIGtleS92YWx1ZSBwYWlycwogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB7QGxpbmsgVCNpZH0KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBmb3IgdGhlIHtAbGluayBUI2lkfSBrZXkgaXMge0Bjb2RlIG51bGx9CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxPYmplY3Q+IGdldElkVmFsdWUoZmluYWwgT2JqZWN0Li4uIGtleVZhbHVlcykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMikgewogICAgICAgICAgICAgaWYgKGtleVZhbHVlc1tpXS5lcXVhbHMoVC5pZCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKGtleVZhbHVlc1tpICsgMV0pOworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGtleVZhbHVlc1tpICsgMV0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOwogICAgIH0KQEAgLTI4MCwxNiArMjczLDI0IEBACiAgICAgICAgIGlmIChudWxsID09IGVsZW1lbnQpCiAgICAgICAgICAgICB0aHJvdyBHcmFwaC5FeGNlcHRpb25zLmFyZ3VtZW50Q2FuTm90QmVOdWxsKCJlbGVtZW50Iik7CiAKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd051bGxQcm9wZXJ0eVZhbHVlcyA9IGVsZW1lbnQgaW5zdGFuY2VvZiBWZXJ0ZXggPworICAgICAgICAgICAgICAgIGVsZW1lbnQuZ3JhcGgoKS5mZWF0dXJlcygpLnZlcnRleCgpLnN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCkgOiBlbGVtZW50IGluc3RhbmNlb2YgRWRnZSA/CisgICAgICAgICAgICAgICAgZWxlbWVudC5ncmFwaCgpLmZlYXR1cmVzKCkuZWRnZSgpLnN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCkgOgorICAgICAgICAgICAgICAgIGVsZW1lbnQuZ3JhcGgoKS5mZWF0dXJlcygpLnZlcnRleCgpLnByb3BlcnRpZXMoKS5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpOworCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlLZXlWYWx1ZXMubGVuZ3RoOyBpID0gaSArIDIpIHsKICAgICAgICAgICAgIGlmICghcHJvcGVydHlLZXlWYWx1ZXNbaV0uZXF1YWxzKFQuaWQpICYmICFwcm9wZXJ0eUtleVZhbHVlc1tpXS5lcXVhbHMoVC5sYWJlbCkpCi0gICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0eSgoU3RyaW5nKSBwcm9wZXJ0eUtleVZhbHVlc1tpXSwgcHJvcGVydHlLZXlWYWx1ZXNbaSArIDFdKTsKKyAgICAgICAgICAgICAgICBpZiAoIWFsbG93TnVsbFByb3BlcnR5VmFsdWVzICYmIG51bGwgPT0gcHJvcGVydHlLZXlWYWx1ZXNbaSArIDFdKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXMoKChTdHJpbmcpIHByb3BlcnR5S2V5VmFsdWVzW2ldKSkuZm9yRWFjaFJlbWFpbmluZyhQcm9wZXJ0eTo6cmVtb3ZlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydHkoKFN0cmluZykgcHJvcGVydHlLZXlWYWx1ZXNbaV0sIHByb3BlcnR5S2V5VmFsdWVzW2kgKyAxXSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBc3NpZ24ga2V5L3ZhbHVlIHBhaXJzIGFzIHByb3BlcnRpZXMgdG8gYW4ge0BsaW5rIFZlcnRleH0uICBJZiB0aGUgdmFsdWUgb2Yge0BsaW5rIFQjaWR9IG9yCi0gICAgICoge0BsaW5rIFQjbGFiZWx9IGlzIGluIHRoZSBzZXQgb2YgcGFpcnMsIHRoZW4gdGhleSBhcmUgaWdub3JlZC4KLSAgICAgKiBUaGUge0BsaW5rIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5fSBvZiB0aGUga2V5IGlzIGRldGVybWluZWQgZnJvbSB0aGUge0BsaW5rIEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzfS4KKyAgICAgKiBBc3NpZ24ga2V5L3ZhbHVlIHBhaXJzIGFzIHByb3BlcnRpZXMgdG8gYW4ge0BsaW5rIFZlcnRleH0uICBJZiB0aGUgdmFsdWUgb2Yge0BsaW5rIFQjaWR9IG9yIHtAbGluayBUI2xhYmVsfSBpcworICAgICAqIGluIHRoZSBzZXQgb2YgcGFpcnMsIHRoZW4gdGhleSBhcmUgaWdub3JlZC4gVGhlIHtAbGluayBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eX0gb2YgdGhlIGtleSBpcyBkZXRlcm1pbmVkIGZyb20KKyAgICAgKiB0aGUge0BsaW5rIEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzfS4KICAgICAgKgogICAgICAqIEBwYXJhbSB2ZXJ0ZXggICAgICAgICAgICB0aGUgZ3JhcGggdmVydGV4IHRvIGFzc2lnbiB0aGUge0Bjb2RlIHByb3BlcnR5S2V5VmFsdWVzfQogICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleVZhbHVlcyB0aGUga2V5L3ZhbHVlIHBhaXJzIHRvIGFzc2lnbiB0byB0aGUge0Bjb2RlIGVsZW1lbnR9CkBAIC0zMDAsMTUgKzMwMSwyMCBAQAogICAgICAgICBpZiAobnVsbCA9PSB2ZXJ0ZXgpCiAgICAgICAgICAgICB0aHJvdyBHcmFwaC5FeGNlcHRpb25zLmFyZ3VtZW50Q2FuTm90QmVOdWxsKCJ2ZXJ0ZXgiKTsKIAorICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzID0gdmVydGV4LmdyYXBoKCkuZmVhdHVyZXMoKS52ZXJ0ZXgoKS5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpOworCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlLZXlWYWx1ZXMubGVuZ3RoOyBpID0gaSArIDIpIHsKICAgICAgICAgICAgIGlmICghcHJvcGVydHlLZXlWYWx1ZXNbaV0uZXF1YWxzKFQuaWQpICYmICFwcm9wZXJ0eUtleVZhbHVlc1tpXS5lcXVhbHMoVC5sYWJlbCkpCi0gICAgICAgICAgICAgICAgdmVydGV4LnByb3BlcnR5KHZlcnRleC5ncmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkuZ2V0Q2FyZGluYWxpdHkoKFN0cmluZykgcHJvcGVydHlLZXlWYWx1ZXNbaV0pLCAoU3RyaW5nKSBwcm9wZXJ0eUtleVZhbHVlc1tpXSwgcHJvcGVydHlLZXlWYWx1ZXNbaSArIDFdKTsKKyAgICAgICAgICAgICAgICBpZiAoIWFsbG93TnVsbFByb3BlcnR5VmFsdWVzICYmIG51bGwgPT0gcHJvcGVydHlLZXlWYWx1ZXNbaSArIDFdKQorICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgucHJvcGVydGllcygoKFN0cmluZykgcHJvcGVydHlLZXlWYWx1ZXNbaV0pKS5mb3JFYWNoUmVtYWluaW5nKFZlcnRleFByb3BlcnR5OjpyZW1vdmUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdmVydGV4LnByb3BlcnR5KHZlcnRleC5ncmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkuZ2V0Q2FyZGluYWxpdHkoKFN0cmluZykgcHJvcGVydHlLZXlWYWx1ZXNbaV0pLCAoU3RyaW5nKSBwcm9wZXJ0eUtleVZhbHVlc1tpXSwgcHJvcGVydHlLZXlWYWx1ZXNbaSArIDFdKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFzc2lnbiBrZXkvdmFsdWUgcGFpcnMgYXMgcHJvcGVydGllcyB0byBhIHtAbGluayBWZXJ0ZXh9LgotICAgICAqIElmIHRoZSB2YWx1ZSBvZiB7QGxpbmsgVCNpZH0gb3Ige0BsaW5rIFQjbGFiZWx9IGlzIGluIHRoZSBzZXQgb2YgcGFpcnMsIHRoZW4gdGhleSBhcmUgaWdub3JlZC4KKyAgICAgKiBBc3NpZ24ga2V5L3ZhbHVlIHBhaXJzIGFzIHByb3BlcnRpZXMgdG8gYSB7QGxpbmsgVmVydGV4fS4gSWYgdGhlIHZhbHVlIG9mIHtAbGluayBUI2lkfSBvciB7QGxpbmsgVCNsYWJlbH0gaXMKKyAgICAgKiBpbiB0aGUgc2V0IG9mIHBhaXJzLCB0aGVuIHRoZXkgYXJlIGlnbm9yZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmVydGV4ICAgICAgICAgICAgdGhlIHZlcnRleCB0byBhdHRhY2ggdGhlIHByb3BlcnRpZXMgdG8KICAgICAgKiBAcGFyYW0gY2FyZGluYWxpdHkgICAgICAgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBrZXkgdmFsdWUgcGFpciBzZXR0aW5ncwpAQCAtMzE2LDE4ICszMjIsMjQgQEAKICAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiAgICAgICBpZiB0aGUgdmFsdWUgb2YgdGhlIGtleSBpcyBub3QgYSB7QGxpbmsgU3RyaW5nfQogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBvZiB7QGNvZGUgZWxlbWVudH0gaXMgbnVsbAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hQcm9wZXJ0aWVzKGZpbmFsIFZlcnRleCB2ZXJ0ZXgsIGZpbmFsIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5IGNhcmRpbmFsaXR5LCBmaW5hbCBPYmplY3QuLi4gcHJvcGVydHlLZXlWYWx1ZXMpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0YWNoUHJvcGVydGllcyhmaW5hbCBWZXJ0ZXggdmVydGV4LCBmaW5hbCBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QuLi4gcHJvcGVydHlLZXlWYWx1ZXMpIHsKICAgICAgICAgaWYgKG51bGwgPT0gdmVydGV4KQogICAgICAgICAgICAgdGhyb3cgR3JhcGguRXhjZXB0aW9ucy5hcmd1bWVudENhbk5vdEJlTnVsbCgidmVydGV4Iik7CiAKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd051bGxQcm9wZXJ0eVZhbHVlcyA9IHZlcnRleC5ncmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkuc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKTsKKwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5S2V5VmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAyKSB7CiAgICAgICAgICAgICBpZiAoIXByb3BlcnR5S2V5VmFsdWVzW2ldLmVxdWFscyhULmlkKSAmJiAhcHJvcGVydHlLZXlWYWx1ZXNbaV0uZXF1YWxzKFQubGFiZWwpKQotICAgICAgICAgICAgICAgIHZlcnRleC5wcm9wZXJ0eShjYXJkaW5hbGl0eSwgKFN0cmluZykgcHJvcGVydHlLZXlWYWx1ZXNbaV0sIHByb3BlcnR5S2V5VmFsdWVzW2kgKyAxXSk7CisgICAgICAgICAgICAgICAgaWYgKCFhbGxvd051bGxQcm9wZXJ0eVZhbHVlcyAmJiBudWxsID09IHByb3BlcnR5S2V5VmFsdWVzW2kgKyAxXSkKKyAgICAgICAgICAgICAgICAgICAgdmVydGV4LnByb3BlcnRpZXMoKChTdHJpbmcpIHByb3BlcnR5S2V5VmFsdWVzW2ldKSkuZm9yRWFjaFJlbWFpbmluZyhWZXJ0ZXhQcm9wZXJ0eTo6cmVtb3ZlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHZlcnRleC5wcm9wZXJ0eShjYXJkaW5hbGl0eSwgKFN0cmluZykgcHJvcGVydHlLZXlWYWx1ZXNbaV0sIHByb3BlcnR5S2V5VmFsdWVzW2kgKyAxXSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZGVhbGluZyB3aXRoIHZlcnRleCBwcm9wZXJ0eSBjYXJkaW5hbGl0eSBhbmQgdHlwaWNhbGx5IHVzZWQgaW4ge0BsaW5rIFZlcnRleCNwcm9wZXJ0eShvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eSwgU3RyaW5nLCBPYmplY3QsIE9iamVjdC4uLil9LgorICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBkZWFsaW5nIHdpdGggdmVydGV4IHByb3BlcnR5IGNhcmRpbmFsaXR5IGFuZCB0eXBpY2FsbHkgdXNlZCBpbiB7QGxpbmsgVmVydGV4I3Byb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LCBTdHJpbmcsIE9iamVjdCwgT2JqZWN0Li4uKX0uCiAgICAgICogSWYgdGhlIGNhcmRpbmFsaXR5IGlzIGxpc3QsIHNpbXBseSByZXR1cm4ge0BsaW5rIE9wdGlvbmFsI2VtcHR5fS4KICAgICAgKiBJZiB0aGUgY2FyZGluYWxpdHkgaXMgc2luZ2xlLCBkZWxldGUgYWxsIGV4aXN0aW5nIHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIGtleSBhbmQgcmV0dXJuIHtAbGluayBPcHRpb25hbCNlbXB0eX0uCiAgICAgICogSWYgdGhlIGNhcmRpbmFsaXR5IGlzIHNldCwgZmluZCBvbmUgdGhhdCBoYXMgdGhlIHNhbWUga2V5L3ZhbHVlIGFuZCBhdHRhY2hlZCB0aGUgcHJvcGVydGllcyB0byBpdCBhbmQgcmV0dXJuIGl0LiBFbHNlLCBpZiBubyBlcXVhbCB2YWx1ZSBpcyBmb3VuZCwgcmV0dXJuIHtAbGluayBPcHRpb25hbCNlbXB0eX0uCkBAIC0zNDAsNyArMzUyLDkgQEAKICAgICAgKiBAcGFyYW0gPFY+ICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHZlcnRleCBwcm9wZXJ0eSB2YWx1ZQogICAgICAqIEByZXR1cm4gYSB2ZXJ0ZXggcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZm91bmQgaW4gc2V0IHdpdGggZXF1YWwgdmFsdWUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxWPiBPcHRpb25hbDxWZXJ0ZXhQcm9wZXJ0eTxWPj4gc3RhZ2VWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBWZXJ0ZXggdmVydGV4LCBmaW5hbCBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgViB2YWx1ZSwgZmluYWwgT2JqZWN0Li4uIGtleVZhbHVlcykgeworICAgIHB1YmxpYyBzdGF0aWMgPFY+IE9wdGlvbmFsPFZlcnRleFByb3BlcnR5PFY+PiBzdGFnZVZlcnRleFByb3BlcnR5KGZpbmFsIFZlcnRleCB2ZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkgY2FyZGluYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgViB2YWx1ZSwgZmluYWwgT2JqZWN0Li4uIGtleVZhbHVlcykgewogICAgICAgICBpZiAoY2FyZGluYWxpdHkuZXF1YWxzKFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZSkpCiAgICAgICAgICAgICB2ZXJ0ZXgucHJvcGVydGllcyhrZXkpLmZvckVhY2hSZW1haW5pbmcoVmVydGV4UHJvcGVydHk6OnJlbW92ZSk7CiAgICAgICAgIGVsc2UgaWYgKGNhcmRpbmFsaXR5LmVxdWFscyhWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5zZXQpKSB7CkBAIC0zODcsNyArNDAxLDggQEAKIAogICAgIC8qKgogICAgICAqIEEgc3RhbmRhcmQgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiB0d28ge0BsaW5rIEVsZW1lbnR9IG9iamVjdHMgYXJlIGVxdWFsLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieSBhbnkKLSAgICAgKiB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBpbXBsZW1lbnRhdGlvbiB0byBlbnN1cmUgY29uc2lzdGVudCBiZWhhdmlvci4gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgVmVydGV4LCBFZGdlLCBhbmQgVmVydGV4UHJvcGVydHkuCisgICAgICoge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGNvbnNpc3RlbnQgYmVoYXZpb3IuIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIFZlcnRleCwKKyAgICAgKiBFZGdlLCBhbmQgVmVydGV4UHJvcGVydHkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYSBUaGUgZmlyc3Qge0BsaW5rIEVsZW1lbnR9CiAgICAgICogQHBhcmFtIGIgVGhlIHNlY29uZCB7QGxpbmsgRWxlbWVudH0gKGFzIGFuIHtAbGluayBPYmplY3R9KQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9HcmFwaEZhY3RvcnkuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL3V0aWwvR3JhcGhGYWN0b3J5LmphdmEKaW5kZXggNjE4MDhhYS4uYjY3MDAzNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9HcmFwaEZhY3RvcnkuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0dyYXBoRmFjdG9yeS5qYXZhCkBAIC0xOCwxMyArMTgsMTYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuRmlsZUJhc2VkQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuWUFNTENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLmJ1aWxkZXIuRmlsZUJhc2VkQ29uZmlndXJhdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLmJ1aWxkZXIuZmx1ZW50LkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5idWlsZGVyLmZsdWVudC5QYXJhbWV0ZXJzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5jb25maWcuWWFtbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uUHJvcGVydGllc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uWE1MQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuZXguQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMTA2LDggKzEwOSw5IEBACiAgICAgLyoqCiAgICAgICogT3BlbiBhIGdyYXBoLiBTZWUgZWFjaCB7QGxpbmsgR3JhcGh9IGluc3RhbmNlIGZvciBpdHMgY29uZmlndXJhdGlvbiBvcHRpb25zLgogICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gQSB7QGNvZGUgTWFwfSBiYXNlZCBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4ge0Bjb2RlIENvbmZpZ3VyYXRpb259IG9iamVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZpYSB7QGNvZGUgTWFwQ29uZmlndXJhdGlvbn0gYW5kIHBhc3NlZCB0byB0aGUgYXBwcm9wcmlhdGUgb3ZlcmxvYWQuCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gQSB7QGNvZGUgTWFwfSBiYXNlZCBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgQ29uZmlndXJhdGlvbn0gb2JqZWN0IHZpYSB7QGNvZGUgTWFwQ29uZmlndXJhdGlvbn0gYW5kIHBhc3NlZCB0byB0aGUgYXBwcm9wcmlhdGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvdmVybG9hZC4KICAgICAgKiBAcmV0dXJuIEEgR3JhcGggaW5zdGFuY2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBHcmFwaCBvcGVuKGZpbmFsIE1hcCBjb25maWd1cmF0aW9uKSB7CkBAIC0xMTUsNyArMTE5LDcgQEAKICAgICAgICAgcmV0dXJuIG9wZW4obmV3IE1hcENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihmaW5hbCBGaWxlIGNvbmZpZ3VyYXRpb25GaWxlKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihmaW5hbCBGaWxlIGNvbmZpZ3VyYXRpb25GaWxlKSB7CiAgICAgICAgIGlmICghY29uZmlndXJhdGlvbkZpbGUuaXNGaWxlKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlRoZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uIG11c3QgcmVzb2x2ZSB0byBhIGZpbGUgYW5kIFslc10gZG9lcyBub3QiLCBjb25maWd1cmF0aW9uRmlsZSkpOwogCkBAIC0xMjMsMTggKzEyNywyOSBAQAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gY29uZmlndXJhdGlvbkZpbGUuZ2V0TmFtZSgpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwogCisgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmY7CisgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9ucyBjb25maWdzID0gbmV3IENvbmZpZ3VyYXRpb25zKCk7CisKICAgICAgICAgICAgIHN3aXRjaCAoZmlsZUV4dGVuc2lvbikgewogICAgICAgICAgICAgICAgIGNhc2UgInltbCI6CiAgICAgICAgICAgICAgICAgY2FzZSAieWFtbCI6Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFlhbWxDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBZYW1sQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjb25maWcubG9hZChjb25maWd1cmF0aW9uRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZUJhc2VkQ29uZmlndXJhdGlvbkJ1aWxkZXI8RmlsZUJhc2VkQ29uZmlndXJhdGlvbj4gYnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVCYXNlZENvbmZpZ3VyYXRpb25CdWlsZGVyPEZpbGVCYXNlZENvbmZpZ3VyYXRpb24+KFlBTUxDb25maWd1cmF0aW9uLmNsYXNzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZShwYXJhbXMuZmlsZUJhc2VkKCkuc2V0RmlsZShjb25maWd1cmF0aW9uRmlsZSkpOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uIGNvcHkgPSBuZXcgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25VdGlscy5jb3B5KGJ1aWxkZXIuY29uZmlndXJlKHBhcmFtcy5maWxlQmFzZWQoKS5zZXRGaWxlKGNvbmZpZ3VyYXRpb25GaWxlKSkuZ2V0Q29uZmlndXJhdGlvbigpLCBjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgY29uZiA9IGNvcHk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgInhtbCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWE1MQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uRmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbmYgPSBjb25maWdzLnhtbChjb25maWd1cmF0aW9uRmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydGllc0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbkZpbGUpOworICAgICAgICAgICAgICAgICAgICBjb25mID0gY29uZmlncy5wcm9wZXJ0aWVzKGNvbmZpZ3VyYXRpb25GaWxlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gY29uZjsKKyAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvdWxkIG5vdCBsb2FkIGNvbmZpZ3VyYXRpb24gYXQ6ICVzIiwgY29uZmlndXJhdGlvbkZpbGUpLCBlKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL3V0aWwvU3RyaW5nRmFjdG9yeS5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9TdHJpbmdGYWN0b3J5LmphdmEKaW5kZXggODE0YmMwOS4uM2ZjMzU5MSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9TdHJpbmdGYWN0b3J5LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9TdHJpbmdGYWN0b3J5LmphdmEKQEAgLTQ5LDYgKzQ5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKQEAgLTI1NSw2ICsyNTYsNiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhTdHJpbmcoZmluYWwgUGF0aCBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBQQVRIICsgTF9CUkFDS0VUICsgU3RyaW5nLmpvaW4oIiwgIiwgSXRlcmF0b3JVdGlscy5tYXAocGF0aCwgT2JqZWN0Ojp0b1N0cmluZykpICsgUl9CUkFDS0VUOworICAgICAgICByZXR1cm4gUEFUSCArIExfQlJBQ0tFVCArIFN0cmluZy5qb2luKCIsICIsIEl0ZXJhdG9yVXRpbHMubWFwKHBhdGgsIE9iamVjdHM6OnRvU3RyaW5nKSkgKyBSX0JSQUNLRVQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9lbXB0eS9FbXB0eUdyYXBoLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL2VtcHR5L0VtcHR5R3JhcGguamF2YQppbmRleCBmYTEwYzk5Li43ZDRlODM2IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL2VtcHR5L0VtcHR5R3JhcGguamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL2VtcHR5L0VtcHR5R3JhcGguamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZW1wdHk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL3N0YXIvU3RhckdyYXBoLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL3N0YXIvU3RhckdyYXBoLmphdmEKaW5kZXggYWE4N2QxMS4uM2JjZGI3ZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9zdGFyL1N0YXJHcmFwaC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL3V0aWwvc3Rhci9TdGFyR3JhcGguamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuc3RhcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaEZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CkBAIC0yMjQsMTQgKzIyNCw2IEBACiAgICAgICAgIHJldHVybiBzdGFyR3JhcGg7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuNSwgcmVwbGFjZWQgYnkge0BsaW5rICNidWlsZCgpfS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgU3RhckdyYXBoLkJ1aWxkZXIgYnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkKCk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBTdGFyR3JhcGguQnVpbGRlciBidWlsZCgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCk7CiAgICAgfQpAQCAtMjQ0LDcgKzIzNiw3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlSWRzVXNpbmdTdHJpbmdzID0gdHJ1ZTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCB7QGxpbmsgI2J1aWxkZXIoKX0gdG8gaW5zdGFudGlhdGUKKyAgICAgICAgICogQ2FsbCB7QGxpbmsgI2J1aWxkKCl9IHRvIGluc3RhbnRpYXRlCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEJ1aWxkZXIoKSB7IH0KIApAQCAtMjcwLDkgKzI2Miw2IEBACiAgICAgICAgICAqIEhvd2V2ZXIsIGlmIHRoaXMgYnVpbGRlciBtZXRob2QgaXMgbmV2ZXIgaW52b2tlZCwgdGhlbiB0aGUgYnVpbGRlciBpcyBndWFyYW50ZWVkIHRvIHVzZQogICAgICAgICAgKiB3aGF0ZXZlciBkZWZhdWx0IHZhbHVlIFN0YXJHcmFwaCdzIG90aGVyIHB1YmxpYyBjb25zdHJ1Y3RvcnMgb3IgZmFjdG9yeSBtZXRob2RzIHdvdWxkIHVzZS4KICAgICAgICAgICogVGhpcyBvcHRpb24gZXhpc3RzIHNvbGVseSBmb3IgcGVyZm9ybWFuY2UgdHVuaW5nIGluIHNwZWNpYWxpemVkIHVzZS1jYXNlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGIKLSAgICAgICAgICogQHJldHVybgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEJ1aWxkZXIgY29tcGFyZUlkc1VzaW5nU3RyaW5ncyhmaW5hbCBib29sZWFuIGIpIHsKICAgICAgICAgICAgIHRoaXMuY29tcGFyZUlkc1VzaW5nU3RyaW5ncyA9IGI7CkBAIC0yODEsMTUgKzI3MCw2IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEByZXR1cm4gYSBuZXcgU3RhckdyYXBoCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjUsIHJlcGxhY2VkIGJ5IHtAbGluayAjY3JlYXRlKCl9LgotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIFN0YXJHcmFwaCBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IFN0YXJHcmFwaAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0YXJHcmFwaCBjcmVhdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXJHcmFwaChpbnRlcm5TdHJpbmdzLCBjb21wYXJlSWRzVXNpbmdTdHJpbmdzKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9TeXN0ZW1VdGlsLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvU3lzdGVtVXRpbC5qYXZhCmluZGV4IGJjMmM1ZmYuLmJlNmM4MTMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9TeXN0ZW1VdGlsLmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi91dGlsL1N5c3RlbVV0aWwuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtNDMsNyArNDMsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbiBnZXRTeXN0ZW1Qcm9wZXJ0aWVzQ29uZmlndXJhdGlvbihmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBib29sZWFuIHRyaW1QcmVmaXgpIHsKICAgICAgICAgZmluYWwgQmFzZUNvbmZpZ3VyYXRpb24gYXBhY2hlQ29uZmlndXJhdGlvbiA9IG5ldyBCYXNlQ29uZmlndXJhdGlvbigpOwotICAgICAgICBhcGFjaGVDb25maWd1cmF0aW9uLnNldERlbGltaXRlclBhcnNpbmdEaXNhYmxlZCh0cnVlKTsKICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogU3lzdGVtLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvVGVzdFN1cHBvcnQuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9UZXN0U3VwcG9ydC5qYXZhCmluZGV4IDY2ODIwZDYuLjBmODkyMDAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9UZXN0U3VwcG9ydC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9UZXN0U3VwcG9ydC5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLlN0b3JhZ2U7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC0yOCw3ICsyNiw2IEBACiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKQEAgLTE2MCw3ICsxNTcsNyBAQAogCiAgICAgLyoqCiAgICAgICogQ29waWVzIGEgZmlsZSBzdG9yZWQgYXMgcGFydCBvZiBhIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUgcGF0aCByZXR1cm5lZCBmcm9tCi0gICAgICoge0BsaW5rIFRlc3RIZWxwZXIjbWFrZVRlc3REYXRhUGF0aH0gaW4gYSBzdWJkaXJlY3RvcnkgY2FsbGVkIHtAY29kZSB0ZW1wL3Jlc291cmNlc30uCisgICAgICoge0BsaW5rIFRlc3RTdXBwb3J0I21ha2VUZXN0RGF0YVBhdGh9IGluIGEgc3ViZGlyZWN0b3J5IGNhbGxlZCB7QGNvZGUgdGVtcC9yZXNvdXJjZXN9LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZW5lcmF0ZVRlbXBGaWxlRnJvbVJlc291cmNlKGZpbmFsIENsYXNzIGdyYXBoQ2xhc3MsIGZpbmFsIENsYXNzIHJlc291cmNlQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlTmFtZSwgZmluYWwgU3RyaW5nIGV4dGVuc2lvbiwgZmluYWwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uLmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjY2RiNDEuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi91dGlsL2NvbmZpZy9ZYW1sQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuY29uZmlnOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQWJzdHJhY3RIaWVyYXJjaGljYWxGaWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLnRyZWUuQ29uZmlndXJhdGlvbk5vZGU7Ci1pbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLkR1bXBlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKLQotLyoqCi0gKiBBcGFjaGUgQ29tbW9ucyBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgWUFNTC4gIEFkYXB0ZWQgZnJvbSBjb2RlIG9yaWdpbmFsbHkgZm91bmQgaGVyZToKLSAqIGh0dHBzOi8vZ2l0aHViLmNvbS9QRVhQbHVnaW5zL1NpbXBsZUNvbmZpZ3MKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBZYW1sQ29uZmlndXJhdGlvbiBleHRlbmRzIEFic3RyYWN0SGllcmFyY2hpY2FsRmlsZUNvbmZpZ3VyYXRpb24gewotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfSURFTlQgPSA0OwotICAgIHByaXZhdGUgZmluYWwgRHVtcGVyT3B0aW9ucyB5YW1sT3B0aW9ucyA9IG5ldyBEdW1wZXJPcHRpb25zKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBZYW1sIHlhbWwgPSBuZXcgWWFtbCh5YW1sT3B0aW9ucyk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHhtbENvbXBhdGliaWxpdHkgPSB0cnVlOwotCi0gICAgcHVibGljIFlhbWxDb25maWd1cmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIHlhbWxPcHRpb25zLnNldEluZGVudChERUZBVUxUX0lERU5UKTsKLSAgICAgICAgeWFtbE9wdGlvbnMuc2V0RGVmYXVsdEZsb3dTdHlsZShEdW1wZXJPcHRpb25zLkZsb3dTdHlsZS5CTE9DSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sQ29tcGF0aWJpbGl0eShmaW5hbCBib29sZWFuIHhtbENvbXBhdGliaWxpdHkpIHsKLSAgICAgICAgdGhpcy54bWxDb21wYXRpYmlsaXR5ID0geG1sQ29tcGF0aWJpbGl0eTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBsb2FkKGZpbmFsIFJlYWRlciBpbikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5sb2FkSGllcmFyY2h5KHRoaXMuZ2V0Um9vdE5vZGUoKSwgeWFtbC5sb2FkKGluKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgY29uZmlndXJhdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNhdmUoZmluYWwgV3JpdGVyIG91dCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgeWFtbC5kdW1wKHRoaXMuc2F2ZUhpZXJhcmNoeSh0aGlzLmdldFJvb3ROb2RlKCkpLCBvdXQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBzYXZlIGNvbmZpZ3VyYXRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkSGllcmFyY2h5KGZpbmFsIENvbmZpZ3VyYXRpb25Ob2RlIHBhcmVudE5vZGUsIGZpbmFsIE9iamVjdCBvYmopIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcDw/LCA/PikgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBvYmopLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBOb2RlIGNoaWxkTm9kZSA9IG5ldyBOb2RlKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHBhcmVudCBub2RlIGlzIGxvb2sgbGlrZSAidGFibGVTIiwgInVzZXJTIiBvciAiZ3JvdXBTIgotICAgICAgICAgICAgICAgIGlmICh0aGlzLnhtbENvbXBhdGliaWxpdHkgJiYgcGFyZW50TmFtZSAhPSBudWxsICYmIHBhcmVudE5hbWUuZW5kc1dpdGgoInMiKSkgewotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgZG9uZSB0byBoYXZlICJ1c2Vycy51c2VyW0BuYW1lPSdzbWl0aCddIGluc3RlYWQgb2YgInVzZXJzLnNtaXRoIgotICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuc2V0TmFtZShwYXJlbnROYW1lLnN1YnN0cmluZygwLCBwYXJlbnROYW1lLmxlbmd0aCgpIC0gMSkpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYWRkQXR0cmlidXRlKG5ldyBOb2RlKCJuYW1lIiwgZW50cnkuZ2V0S2V5KCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGlsZE5vZGUuc2V0UmVmZXJlbmNlKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBsb2FkSGllcmFyY2h5KGNoaWxkTm9kZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGNoaWxkIDogKENvbGxlY3Rpb24pIG9iaikgewotICAgICAgICAgICAgICAgIGZpbmFsIE5vZGUgY2hpbGROb2RlID0gbmV3IE5vZGUoIml0ZW0iKTsKLSAgICAgICAgICAgICAgICBjaGlsZE5vZGUuc2V0UmVmZXJlbmNlKGNoaWxkKTsKLSAgICAgICAgICAgICAgICBsb2FkSGllcmFyY2h5KGNoaWxkTm9kZSwgY2hpbGQpOwotICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQoY2hpbGROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBhcmVudE5vZGUuc2V0VmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHNhdmVIaWVyYXJjaHkoZmluYWwgQ29uZmlndXJhdGlvbk5vZGUgcGFyZW50Tm9kZSkgewotICAgICAgICBpZiAocGFyZW50Tm9kZS5nZXRDaGlsZHJlbkNvdW50KCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnROb2RlLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKHBhcmVudE5vZGUuZ2V0Q2hpbGRyZW5Db3VudCgiaXRlbSIpID09IHBhcmVudE5vZGUuZ2V0Q2hpbGRyZW5Db3VudCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpLnN0cmVhbSgpLm1hcCh0aGlzOjpzYXZlSGllcmFyY2h5KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbmZpZ3VyYXRpb25Ob2RlIGNoaWxkTm9kZSA6IHBhcmVudE5vZGUuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGNoaWxkTm9kZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMueG1sQ29tcGF0aWJpbGl0eSAmJiBjaGlsZE5vZGUuZ2V0QXR0cmlidXRlcygibmFtZSIpLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gU3RyaW5nLnZhbHVlT2YoY2hpbGROb2RlLmdldEF0dHJpYnV0ZXMoIm5hbWUiKS5nZXQoMCkuZ2V0VmFsdWUoKSk7Ci0KLQotICAgICAgICAgICAgICAgIG1hcC5wdXQobm9kZU5hbWUsIHNhdmVIaWVyYXJjaHkoY2hpbGROb2RlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvVHJhdmVyc2FsU3RyYXRlZ2llc1Rlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9UcmF2ZXJzYWxTdHJhdGVnaWVzVGVzdC5qYXZhCmluZGV4IDFiOTA0MzUuLjEyNDc5ODYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9UcmF2ZXJzYWxTdHJhdGVnaWVzVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9UcmF2ZXJzYWxTdHJhdGVnaWVzVGVzdC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkNvbXB1dGVyUmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5NYXBSZWR1Y2U7CkBAIC02NiwxMCArNjYsMTEgQEAKICAgICAgICAgVGVzdEdyYXBoIGdyYXBoID0gbmV3IFRlc3RHcmFwaCgpOwogICAgICAgICBUcmF2ZXJzYWxTdHJhdGVnaWVzIHN0cmF0ZWdpZXMgPSBncmFwaC50cmF2ZXJzYWwoKS5nZXRTdHJhdGVnaWVzKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhHcmFwaC5jbGFzcykudG9MaXN0KCkuaXNFbXB0eSgpKTsKLSAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneSBzdHJhdGVneSA6IFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhHcmFwaC5jbGFzcykudG9MaXN0KCkpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKKyAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneSBzdHJhdGVneSA6IFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhHcmFwaC5jbGFzcykpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoc3RyYXRlZ2llcy5nZXRTdHJhdGVneShzdHJhdGVneS5nZXRDbGFzcygpKS5pc1ByZXNlbnQoKSk7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneSBzdHJhdGVneSA6IFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhUZXN0R3JhcGhDb21wdXRlci5jbGFzcykudG9MaXN0KCkpIHsKKyAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneSBzdHJhdGVneSA6IFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhUZXN0R3JhcGhDb21wdXRlci5jbGFzcykpIHsKICAgICAgICAgICAgIGFzc2VydEZhbHNlKHN0cmF0ZWdpZXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3kuZ2V0Q2xhc3MoKSkuaXNQcmVzZW50KCkpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydFRydWUoc3RyYXRlZ2llcy5nZXRTdHJhdGVneShTdHJhdGVneUEuY2xhc3MpLmlzUHJlc2VudCgpKTsKQEAgLTgzLDEwICs4NCwxMCBAQAogICAgICAgICAvLy8KICAgICAgICAgZ3JhcGggPSBuZXcgVGVzdEdyYXBoKCk7CiAgICAgICAgIHN0cmF0ZWdpZXMgPSBncmFwaC50cmF2ZXJzYWwoKS5nZXRTdHJhdGVnaWVzKCk7Ci0gICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpLnRvTGlzdCgpKSB7CisgICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpKSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKHN0cmF0ZWdpZXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3kuZ2V0Q2xhc3MoKSkuaXNQcmVzZW50KCkpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoVGVzdEdyYXBoQ29tcHV0ZXIuY2xhc3MpLnRvTGlzdCgpKSB7CisgICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoVGVzdEdyYXBoQ29tcHV0ZXIuY2xhc3MpKSB7CiAgICAgICAgICAgICBhc3NlcnRGYWxzZShzdHJhdGVnaWVzLmdldFN0cmF0ZWd5KHN0cmF0ZWd5LmdldENsYXNzKCkpLmlzUHJlc2VudCgpKTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRGYWxzZShzdHJhdGVnaWVzLmdldFN0cmF0ZWd5KFN0cmF0ZWd5QS5jbGFzcykuaXNQcmVzZW50KCkpOwpAQCAtOTgsMTAgKzk5LDEwIEBACiAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgc3RyYXRlZ2llcyA9IFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhUZXN0R3JhcGhDb21wdXRlci5jbGFzcyk7CiAgICAgICAgIGFzc2VydEZhbHNlKFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhHcmFwaENvbXB1dGVyLmNsYXNzKS50b0xpc3QoKS5pc0VtcHR5KCkpOwotICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbFN0cmF0ZWd5IHN0cmF0ZWd5IDogVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKEdyYXBoQ29tcHV0ZXIuY2xhc3MpLnRvTGlzdCgpKSB7CisgICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGhDb21wdXRlci5jbGFzcykpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoc3RyYXRlZ2llcy5nZXRTdHJhdGVneShzdHJhdGVneS5nZXRDbGFzcygpKS5pc1ByZXNlbnQoKSk7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneSBzdHJhdGVneSA6IFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhUZXN0R3JhcGguY2xhc3MpLnRvTGlzdCgpKSB7CisgICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoVGVzdEdyYXBoLmNsYXNzKSkgewogICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3RyYXRlZ2llcy5nZXRTdHJhdGVneShzdHJhdGVneS5nZXRDbGFzcygpKS5pc1ByZXNlbnQoKSk7CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0RmFsc2Uoc3RyYXRlZ2llcy5nZXRTdHJhdGVneShTdHJhdGVneUEuY2xhc3MpLmlzUHJlc2VudCgpKTsKQEAgLTExMiwxMCArMTEzLDEwIEBACiAgICAgICAgIC8vCiAgICAgICAgIHN0cmF0ZWdpZXMgPSBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoVGVzdEdyYXBoQ29tcHV0ZXIuY2xhc3MpOwogICAgICAgICBhc3NlcnRGYWxzZShUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGhDb21wdXRlci5jbGFzcykudG9MaXN0KCkuaXNFbXB0eSgpKTsKLSAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneSBzdHJhdGVneSA6IFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhHcmFwaENvbXB1dGVyLmNsYXNzKS50b0xpc3QoKSkgeworICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbFN0cmF0ZWd5IHN0cmF0ZWd5IDogVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKEdyYXBoQ29tcHV0ZXIuY2xhc3MpKSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKHN0cmF0ZWdpZXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3kuZ2V0Q2xhc3MoKSkuaXNQcmVzZW50KCkpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3kgc3RyYXRlZ3kgOiBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoVGVzdEdyYXBoLmNsYXNzKS50b0xpc3QoKSkgeworICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbFN0cmF0ZWd5IHN0cmF0ZWd5IDogVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKFRlc3RHcmFwaC5jbGFzcykpIHsKICAgICAgICAgICAgIGFzc2VydEZhbHNlKHN0cmF0ZWdpZXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3kuZ2V0Q2xhc3MoKSkuaXNQcmVzZW50KCkpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydEZhbHNlKHN0cmF0ZWdpZXMuZ2V0U3RyYXRlZ3koU3RyYXRlZ3lBLmNsYXNzKS5pc1ByZXNlbnQoKSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL09yZGVyVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9PcmRlclRlc3QuamF2YQppbmRleCBiMmQzMDg0Li4wMjA0Mzk5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL09yZGVyVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvT3JkZXJUZXN0LmphdmEKQEAgLTQ0LDEzICs0NCwxNyBAQAogICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0udGVzdCh7MX0sezJ9KSIpCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxPYmplY3RbXT4gZGF0YSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXsKKyAgICAgICAgICAgICAgICB7T3JkZXIuYXNjLCBBcnJheXMuYXNMaXN0KCJhIiwgImMiLCBudWxsLCAiZCIpLCBBcnJheXMuYXNMaXN0KG51bGwsICJhIiwgImMiLCAiZCIpfSwKICAgICAgICAgICAgICAgICB7T3JkZXIuYXNjLCBBcnJheXMuYXNMaXN0KCJiIiwgImEiLCAiYyIsICJkIiksIEFycmF5cy5hc0xpc3QoImEiLCAiYiIsICJjIiwgImQiKX0sCiAgICAgICAgICAgICAgICAge09yZGVyLmRlc2MsIEFycmF5cy5hc0xpc3QoImIiLCAiYSIsICJjIiwgImQiKSwgQXJyYXlzLmFzTGlzdCgiZCIsICJjIiwgImIiLCAiYSIpfSwKKyAgICAgICAgICAgICAgICB7T3JkZXIuZGVzYywgQXJyYXlzLmFzTGlzdCgiYyIsICJhIiwgbnVsbCwgImQiKSwgQXJyYXlzLmFzTGlzdCgiZCIsICJjIiwgImEiLCBudWxsKX0sCiAgICAgICAgICAgICAgICAge09yZGVyLmFzYywgQXJyYXlzLmFzTGlzdChmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMTgiKSwgZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDIwIiksIGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAwOCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAwOCIpLCBmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMTgiKSwgZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDIwIikpfSwKICAgICAgICAgICAgICAgICB7T3JkZXIuZGVzYywgQXJyYXlzLmFzTGlzdChmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMTgiKSwgZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDIwIiksIGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAwOCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMjAiKSwgZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDE4IiksIGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAwOCIpKX0sCisgICAgICAgICAgICAgICAge09yZGVyLmRlc2MsIEFycmF5cy5hc0xpc3QoMTAwTCwgMUwsIG51bGwsIC0xTCwgMEwpLCBBcnJheXMuYXNMaXN0KDEwMEwsIDFMLCAwTCwgLTFMLCBudWxsKX0sCiAgICAgICAgICAgICAgICAge09yZGVyLmRlc2MsIEFycmF5cy5hc0xpc3QoMTAwTCwgMUwsIC0xTCwgMEwpLCBBcnJheXMuYXNMaXN0KDEwMEwsIDFMLCAwTCwgLTFMKX0sCisgICAgICAgICAgICAgICAge09yZGVyLmFzYywgQXJyYXlzLmFzTGlzdCgxMDBMLCAxTCwgbnVsbCwgLTFMLCAwTCksIEFycmF5cy5hc0xpc3QobnVsbCwgLTFMLCAwTCwgMUwsIDEwMEwpfSwKICAgICAgICAgICAgICAgICB7T3JkZXIuYXNjLCBBcnJheXMuYXNMaXN0KDEwMC4xZiwgMS4xZiwgLTEuMWYsIDAuMWYpLCBBcnJheXMuYXNMaXN0KC0xLjFmLCAwLjFmLCAxLjFmLCAxMDAuMWYpfSwKICAgICAgICAgICAgICAgICB7T3JkZXIuZGVzYywgQXJyYXlzLmFzTGlzdCgxMDAuMWYsIDEuMWYsIC0xLjFmLCAwLjFmKSwgQXJyYXlzLmFzTGlzdCgxMDAuMWYsIDEuMWYsIDAuMWYsIC0xLjFmKX0sCiAgICAgICAgICAgICAgICAge09yZGVyLmFzYywgQXJyYXlzLmFzTGlzdCgxMDAuMWQsIDEuMWQsIC0xLjFkLCAwLjFkKSwgQXJyYXlzLmFzTGlzdCgtMS4xZCwgMC4xZCwgMS4xZCwgMTAwLjFkKX0sCkBAIC02MCwyMiArNjQsNyBAQAogICAgICAgICAgICAgICAgIHtPcmRlci5hc2MsIEFycmF5cy5hc0xpc3QoMTAwLCAxLCAtMSwgMCksIEFycmF5cy5hc0xpc3QoLTEsIDAsIDEsIDEwMCl9LAogICAgICAgICAgICAgICAgIHtPcmRlci5kZXNjLCBBcnJheXMuYXNMaXN0KDEwMCwgMSwgLTEsIDApLCBBcnJheXMuYXNMaXN0KDEwMCwgMSwgMCwgLTEpfSwKICAgICAgICAgICAgICAgICB7T3JkZXIuYXNjLCBBcnJheXMuYXNMaXN0KCJiIiwgImEiLCBULmlkLCAiYyIsICJkIiksIEFycmF5cy5hc0xpc3QoImEiLCAiYiIsICJjIiwgImQiLCBULmlkKX0sCi0gICAgICAgICAgICAgICAge09yZGVyLmRlc2MsIEFycmF5cy5hc0xpc3QoImIiLCAiYSIsIFQuaWQsICJjIiwgImQiKSwgQXJyYXlzLmFzTGlzdChULmlkLCAiZCIsICJjIiwgImIiLCAiYSIpfSwKLSAgICAgICAgICAgICAgICB7T3JkZXIuaW5jciwgQXJyYXlzLmFzTGlzdCgiYiIsICJhIiwgImMiLCAiZCIpLCBBcnJheXMuYXNMaXN0KCJhIiwgImIiLCAiYyIsICJkIil9LAotICAgICAgICAgICAgICAgIHtPcmRlci5kZWNyLCBBcnJheXMuYXNMaXN0KCJiIiwgImEiLCAiYyIsICJkIiksIEFycmF5cy5hc0xpc3QoImQiLCAiYyIsICJiIiwgImEiKX0sCi0gICAgICAgICAgICAgICAge09yZGVyLmluY3IsIEFycmF5cy5hc0xpc3QoZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDE4IiksIGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAyMCIpLCBmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMDgiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDA4IiksIGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAxOCIpLCBmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMjAiKSl9LAotICAgICAgICAgICAgICAgIHtPcmRlci5kZWNyLCBBcnJheXMuYXNMaXN0KGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAxOCIpLCBmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMjAiKSwgZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDA4IikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGZvcm1hdHRlci5wYXJzZSgiMS1KYW4tMjAyMCIpLCBmb3JtYXR0ZXIucGFyc2UoIjEtSmFuLTIwMTgiKSwgZm9ybWF0dGVyLnBhcnNlKCIxLUphbi0yMDA4IikpfSwKLSAgICAgICAgICAgICAgICB7T3JkZXIuZGVjciwgQXJyYXlzLmFzTGlzdCgxMDBMLCAxTCwgLTFMLCAwTCksIEFycmF5cy5hc0xpc3QoMTAwTCwgMUwsIDBMLCAtMUwpfSwKLSAgICAgICAgICAgICAgICB7T3JkZXIuaW5jciwgQXJyYXlzLmFzTGlzdCgxMDAuMWYsIDEuMWYsIC0xLjFmLCAwLjFmKSwgQXJyYXlzLmFzTGlzdCgtMS4xZiwgMC4xZiwgMS4xZiwgMTAwLjFmKX0sCi0gICAgICAgICAgICAgICAge09yZGVyLmRlY3IsIEFycmF5cy5hc0xpc3QoMTAwLjFmLCAxLjFmLCAtMS4xZiwgMC4xZiksIEFycmF5cy5hc0xpc3QoMTAwLjFmLCAxLjFmLCAwLjFmLCAtMS4xZil9LAotICAgICAgICAgICAgICAgIHtPcmRlci5pbmNyLCBBcnJheXMuYXNMaXN0KDEwMC4xZCwgMS4xZCwgLTEuMWQsIDAuMWQpLCBBcnJheXMuYXNMaXN0KC0xLjFkLCAwLjFkLCAxLjFkLCAxMDAuMWQpfSwKLSAgICAgICAgICAgICAgICB7T3JkZXIuZGVjciwgQXJyYXlzLmFzTGlzdCgxMDAuMWQsIDEuMWQsIC0xLjFkLCAwLjFkKSwgQXJyYXlzLmFzTGlzdCgxMDAuMWQsIDEuMWQsIDAuMWQsIC0xLjFkKX0sCi0gICAgICAgICAgICAgICAge09yZGVyLmluY3IsIEFycmF5cy5hc0xpc3QoMTAwTCwgMUwsIC0xTCwgMEwpLCBBcnJheXMuYXNMaXN0KC0xTCwgMEwsIDFMLCAxMDBMKX0sCi0gICAgICAgICAgICAgICAge09yZGVyLmRlY3IsIEFycmF5cy5hc0xpc3QoMTAwTCwgMUwsIC0xTCwgMEwpLCBBcnJheXMuYXNMaXN0KDEwMEwsIDFMLCAwTCwgLTFMKX0sCi0gICAgICAgICAgICAgICAge09yZGVyLmluY3IsIEFycmF5cy5hc0xpc3QoMTAwLCAxLCAtMSwgMCksIEFycmF5cy5hc0xpc3QoLTEsIDAsIDEsIDEwMCl9LAotICAgICAgICAgICAgICAgIHtPcmRlci5kZWNyLCBBcnJheXMuYXNMaXN0KDEwMCwgMSwgLTEsIDApLCBBcnJheXMuYXNMaXN0KDEwMCwgMSwgMCwgLTEpfX0pKTsKKyAgICAgICAgICAgICAgICB7T3JkZXIuZGVzYywgQXJyYXlzLmFzTGlzdCgiYiIsICJhIiwgVC5pZCwgImMiLCAiZCIpLCBBcnJheXMuYXNMaXN0KFQuaWQsICJkIiwgImMiLCAiYiIsICJhIil9fSkpOwogICAgIH0KIAogICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcih2YWx1ZSA9IDApCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL1RyYXZlcnNhbFRlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsVGVzdC5qYXZhCmluZGV4IDgwZDUwMjQuLjkwZWFiMTQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvVHJhdmVyc2FsVGVzdC5qYXZhCkBAIC0xOSwxMCArMTksMTMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsLkRlZmF1bHRSZW1vdGVUcmF2ZXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5UcmF2ZXJzZXJSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsSW50ZXJydXB0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5lbXB0eS5FbXB0eUdyYXBoOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTM1LDExICszOCwxMyBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkFub255bW91c1RyYXZlcnNhbFNvdXJjZS50cmF2ZXJzYWw7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jc0NvbGxlY3Rpb25Db250YWluaW5nLmhhc0l0ZW1zOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCkBAIC0xMjgsNiArMTMzLDE2IEBACiAgICAgICAgIGFzc2VydFRoYXQodC5pc0Nsb3NlZCgpLCBpcyh0cnVlKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRPbmx5QWxsb3dBbm9ueW1vdXNDaGlsZHJlbigpIHsKKyAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IHRyYXZlcnNhbCgpLndpdGhHcmFwaChFbXB0eUdyYXBoLmluc3RhbmNlKCkpOworICAgICAgICBnLlYoMSkuYWRkRSgic2VsZiIpLnRvKF9fLlYoMSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZy5WKDEpLmFkZEUoInNlbGYiKS50byhnLlYoMSkpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBhbGxvdyBjaGlsZCB0cmF2ZXJzYWxzIHNwYXduZWQgZnJvbSAnZyciKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlnbm9yZWQpIHt9CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0Nsb3NlU3RlcDxFPiBleHRlbmRzIE1vY2tTdGVwPEU+IGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvR3JlbWxpbkRzbFByb2Nlc3NvclRlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvZHNsL0dyZW1saW5Ec2xQcm9jZXNzb3JUZXN0LmphdmEKaW5kZXggMjM4NzZjNi4uNTNmZjg3NCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvR3JlbWxpbkRzbFByb2Nlc3NvclRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2RzbC9HcmVtbGluRHNsUHJvY2Vzc29yVGVzdC5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgIGZpbmFsIENvbXBpbGF0aW9uIGNvbXBpbGF0aW9uID0gamF2YWMoKQogICAgICAgICAgICAgICAgIC53aXRoUHJvY2Vzc29ycyhuZXcgR3JlbWxpbkRzbFByb2Nlc3NvcigpKQogICAgICAgICAgICAgICAgIC5jb21waWxlKEphdmFGaWxlT2JqZWN0cy5mb3JSZXNvdXJjZShHcmVtbGluRHNsLmNsYXNzLmdldFJlc291cmNlKCJTb2NpYWxUcmF2ZXJzYWxEc2wuamF2YSIpKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoY29tcGlsYXRpb24pLnN1Y2NlZWRlZFdpdGhvdXRXYXJuaW5ncygpOworICAgICAgICBhc3NlcnRDb21waWxhdGlvblN1Y2Nlc3MoY29tcGlsYXRpb24pOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgIGZpbmFsIENvbXBpbGF0aW9uIGNvbXBpbGF0aW9uID0gamF2YWMoKQogICAgICAgICAgICAgICAgIC53aXRoUHJvY2Vzc29ycyhuZXcgR3JlbWxpbkRzbFByb2Nlc3NvcigpKQogICAgICAgICAgICAgICAgIC5jb21waWxlKEphdmFGaWxlT2JqZWN0cy5mb3JSZXNvdXJjZShHcmVtbGluRHNsLmNsYXNzLmdldFJlc291cmNlKCJTb2NpYWxNb3ZlVHJhdmVyc2FsRHNsLmphdmEiKSkpOwotICAgICAgICBhc3NlcnRUaGF0KGNvbXBpbGF0aW9uKS5zdWNjZWVkZWRXaXRob3V0V2FybmluZ3MoKTsKKyAgICAgICAgYXNzZXJ0Q29tcGlsYXRpb25TdWNjZXNzKGNvbXBpbGF0aW9uKTsKICAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvbikKICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVkRmlsZShTdGFuZGFyZExvY2F0aW9uLlNPVVJDRV9PVVRQVVQsICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5zb2NpYWwiLCAiU29jaWFsTW92ZVRyYXZlcnNhbC5qYXZhIik7CiAgICAgfQpAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICBmaW5hbCBDb21waWxhdGlvbiBjb21waWxhdGlvbiA9IGphdmFjKCkKICAgICAgICAgICAgICAgICAud2l0aFByb2Nlc3NvcnMobmV3IEdyZW1saW5Ec2xQcm9jZXNzb3IoKSkKICAgICAgICAgICAgICAgICAuY29tcGlsZShKYXZhRmlsZU9iamVjdHMuZm9yUmVzb3VyY2UoR3JlbWxpbkRzbC5jbGFzcy5nZXRSZXNvdXJjZSgiU29jaWFsUGFja2FnZVRyYXZlcnNhbERzbC5qYXZhIikpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvbikuc3VjY2VlZGVkV2l0aG91dFdhcm5pbmdzKCk7CisgICAgICAgIGFzc2VydENvbXBpbGF0aW9uU3VjY2Vzcyhjb21waWxhdGlvbik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgZmluYWwgQ29tcGlsYXRpb24gY29tcGlsYXRpb24gPSBqYXZhYygpCiAgICAgICAgICAgICAgICAgLndpdGhQcm9jZXNzb3JzKG5ldyBHcmVtbGluRHNsUHJvY2Vzc29yKCkpCiAgICAgICAgICAgICAgICAgLmNvbXBpbGUoSmF2YUZpbGVPYmplY3RzLmZvclJlc291cmNlKEdyZW1saW5Ec2wuY2xhc3MuZ2V0UmVzb3VyY2UoIlNvY2lhbE5vRGVmYXVsdE1ldGhvZHNUcmF2ZXJzYWxEc2wuamF2YSIpKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoY29tcGlsYXRpb24pLnN1Y2NlZWRlZFdpdGhvdXRXYXJuaW5ncygpOworICAgICAgICBhc3NlcnRDb21waWxhdGlvblN1Y2Nlc3MoY29tcGlsYXRpb24pOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC05MCw2ICs5MCwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbXBpbGF0aW9uU3VjY2VzcyhmaW5hbCBDb21waWxhdGlvbiBjb21waWxhdGlvbikgeworICAgICAgICBpZiAoaXNKYXZhOCgpKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvbikuc3VjY2VlZGVkV2l0aG91dFdhcm5pbmdzKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvbikuaGFkV2FybmluZ0NvbnRhaW5pbmcoIlN1cHBvcnRlZCBzb3VyY2UgdmVyc2lvbiAnUkVMRUFTRV84JyBmcm9tIGFubm90YXRpb24gcHJvY2Vzc29yIik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbXBpbGF0aW9uKS5zdWNjZWVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0phdmE4KCkgeworICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7CisgICAgICAgIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoIjEuIik7CisgICAgfQorCiAgICAgc3RhdGljIGNsYXNzIEphdmFGaWxlT2JqZWN0Q2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CiAgICAgICAgIE1hcDxTdHJpbmcsIEphdmFGaWxlT2JqZWN0PiBjbGFzc0ZpbGVNYXA7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvZHNsL2dyYXBoL0dyYXBoVHJhdmVyc2FsU291cmNlVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvZ3JhcGgvR3JhcGhUcmF2ZXJzYWxTb3VyY2VUZXN0LmphdmEKaW5kZXggZWRlNjZjYy4uZmU2MGQ2YiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvZ3JhcGgvR3JhcGhUcmF2ZXJzYWxTb3VyY2VUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvZ3JhcGgvR3JhcGhUcmF2ZXJzYWxTb3VyY2VUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLk1hcENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS5SZW1vdGVDb25uZWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5TdWJncmFwaFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kudmVyaWZpY2F0aW9uLlJlYWRPbmx5U3RyYXRlZ3k7CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9FbGVtZW50VmFsdWVUcmF2ZXJzYWxUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9FbGVtZW50VmFsdWVUcmF2ZXJzYWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTJhM2QuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9sYW1iZGEvRWxlbWVudFZhbHVlVHJhdmVyc2FsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwubGFtYmRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIuQl9PX1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXhQcm9wZXJ0eTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudFZhbHVlVHJhdmVyc2FsVGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPblZlcnRleCgpIHsKLSAgICAgICAgZmluYWwgRWxlbWVudFZhbHVlVHJhdmVyc2FsPEludGVnZXI+IHQgPSBuZXcgRWxlbWVudFZhbHVlVHJhdmVyc2FsPD4oImFnZSIpOwotICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IG1vY2soVmVydGV4LmNsYXNzKTsKLSAgICAgICAgd2hlbih2LnZhbHVlKCJhZ2UiKSkudGhlblJldHVybigyOSk7Ci0gICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXIodiwgMSkuYXNBZG1pbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDI5LCB0Lm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPbkVkZ2UoKSB7Ci0gICAgICAgIGZpbmFsIEVsZW1lbnRWYWx1ZVRyYXZlcnNhbDxEb3VibGU+IHQgPSBuZXcgRWxlbWVudFZhbHVlVHJhdmVyc2FsPD4oIndlaWdodCIpOwotICAgICAgICBmaW5hbCBFZGdlIGUgPSBtb2NrKEVkZ2UuY2xhc3MpOwotICAgICAgICB3aGVuKGUudmFsdWUoIndlaWdodCIpKS50aGVuUmV0dXJuKDEuMGQpOwotICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyKGUsIDEpLmFzQWRtaW4oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLjBkLCB0Lm5leHQoKSwgMC4wMDAwMWQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkV29ya09uVmVydGV4UHJvcGVydHkoKSB7Ci0gICAgICAgIGZpbmFsIEVsZW1lbnRWYWx1ZVRyYXZlcnNhbDxJbnRlZ2VyPiB0ID0gbmV3IEVsZW1lbnRWYWx1ZVRyYXZlcnNhbDw+KCJhZ2UiKTsKLSAgICAgICAgZmluYWwgVmVydGV4UHJvcGVydHkgdnAgPSBtb2NrKFZlcnRleFByb3BlcnR5LmNsYXNzKTsKLSAgICAgICAgd2hlbih2cC52YWx1ZSgiYWdlIikpLnRoZW5SZXR1cm4oMjkpOwotICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyKHZwLCAxKS5hc0FkbWluKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjksIHQubmV4dCgpLmludFZhbHVlKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkV29ya09uTWFwKCkgewotICAgICAgICBmaW5hbCBFbGVtZW50VmFsdWVUcmF2ZXJzYWw8SW50ZWdlcj4gdCA9IG5ldyBFbGVtZW50VmFsdWVUcmF2ZXJzYWw8PigiYWdlIik7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsSW50ZWdlcj4gbSA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbS5wdXQoImFnZSIsIDI5KTsKLSAgICAgICAgdC5hZGRTdGFydChuZXcgQl9PX1RyYXZlcnNlcihtLCAxKS5hc0FkbWluKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjksIHQubmV4dCgpLmludFZhbHVlKCkpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHNob3VsZFRocm93RXhjZXB0aW9uV2hlblRyeWluZ1Vuc3VwcG9ydGVkVHlwZSgpIHsKLSAgICAgICAgZmluYWwgRWxlbWVudFZhbHVlVHJhdmVyc2FsPEludGVnZXI+IHQgPSBuZXcgRWxlbWVudFZhbHVlVHJhdmVyc2FsPD4oImFnZSIpOwotICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyKDI5LCAxKS5hc0FkbWluKCkpOwotICAgICAgICB0Lm5leHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9Ub2tlblRyYXZlcnNhbFRlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvbGFtYmRhL1Rva2VuVHJhdmVyc2FsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMWFkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL2xhbWJkYS9Ub2tlblRyYXZlcnNhbFRlc3QuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5CX09fVHJhdmVyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitwdWJsaWMgY2xhc3MgVG9rZW5UcmF2ZXJzYWxUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPblZlcnRleCgpIHsKKyAgICAgICAgZmluYWwgVG9rZW5UcmF2ZXJzYWw8VmVydGV4LCBJbnRlZ2VyPiB0ID0gbmV3IFRva2VuVHJhdmVyc2FsPD4oVC5pZCk7CisgICAgICAgIGZpbmFsIFZlcnRleCB2ID0gbW9jayhWZXJ0ZXguY2xhc3MpOworICAgICAgICB3aGVuKHYuaWQoKSkudGhlblJldHVybigxMDApOworICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyPD4odiwgMSkuYXNBZG1pbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdC5uZXh0KCkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRXb3JrT25WZXJ0ZXhQcm9wZXJ0eSgpIHsKKyAgICAgICAgZmluYWwgVG9rZW5UcmF2ZXJzYWw8VmVydGV4UHJvcGVydHksIEludGVnZXI+IHQgPSBuZXcgVG9rZW5UcmF2ZXJzYWw8PihULmlkKTsKKyAgICAgICAgZmluYWwgVmVydGV4UHJvcGVydHkgdm8gPSBtb2NrKFZlcnRleFByb3BlcnR5LmNsYXNzKTsKKyAgICAgICAgd2hlbih2by5pZCgpKS50aGVuUmV0dXJuKDEwMCk7CisgICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXI8Pih2bywgMSkuYXNBZG1pbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdC5uZXh0KCkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRXb3JrT25FZGdlKCkgeworICAgICAgICBmaW5hbCBUb2tlblRyYXZlcnNhbDxFZGdlLCBJbnRlZ2VyPiB0ID0gbmV3IFRva2VuVHJhdmVyc2FsPD4oVC5pZCk7CisgICAgICAgIGZpbmFsIEVkZ2UgZSA9IG1vY2soRWRnZS5jbGFzcyk7CisgICAgICAgIHdoZW4oZS5pZCgpKS50aGVuUmV0dXJuKDEwMCk7CisgICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXI8PihlLCAxKS5hc0FkbWluKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCB0Lm5leHQoKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPblByb3BlcnR5S2V5KCkgeworICAgICAgICBmaW5hbCBUb2tlblRyYXZlcnNhbDxQcm9wZXJ0eTxTdHJpbmc+LCBTdHJpbmc+IHQgPSBuZXcgVG9rZW5UcmF2ZXJzYWw8PihULmtleSk7CisgICAgICAgIGZpbmFsIFByb3BlcnR5PFN0cmluZz4gcCA9IG1vY2soUHJvcGVydHkuY2xhc3MpOworICAgICAgICB3aGVuKHAua2V5KCkpLnRoZW5SZXR1cm4oIm5hbWUiKTsKKyAgICAgICAgdC5hZGRTdGFydChuZXcgQl9PX1RyYXZlcnNlcjw+KHAsIDEpLmFzQWRtaW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIHQubmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPblByb3BlcnR5VmFsdWUoKSB7CisgICAgICAgIGZpbmFsIFRva2VuVHJhdmVyc2FsPFByb3BlcnR5PFN0cmluZz4sIFN0cmluZz4gdCA9IG5ldyBUb2tlblRyYXZlcnNhbDw+KFQudmFsdWUpOworICAgICAgICBmaW5hbCBQcm9wZXJ0eTxTdHJpbmc+IHAgPSBtb2NrKFByb3BlcnR5LmNsYXNzKTsKKyAgICAgICAgd2hlbihwLnZhbHVlKCkpLnRoZW5SZXR1cm4oIm1hcmtvIik7CisgICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXI8PihwLCAxKS5hc0FkbWluKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtvIiwgdC5uZXh0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvbGFtYmRhL1ZhbHVlVHJhdmVyc2FsVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9sYW1iZGEvVmFsdWVUcmF2ZXJzYWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxZDBiNgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvbGFtYmRhL1ZhbHVlVHJhdmVyc2FsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci5CX09fVHJhdmVyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleFByb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZGV0YWNoZWQuRGV0YWNoZWRQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkVmVydGV4UHJvcGVydHk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitwdWJsaWMgY2xhc3MgVmFsdWVUcmF2ZXJzYWxUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkV29ya09uVmVydGV4KCkgeworICAgICAgICBmaW5hbCBWYWx1ZVRyYXZlcnNhbDxWZXJ0ZXgsIEludGVnZXI+IHQgPSBuZXcgVmFsdWVUcmF2ZXJzYWw8PigiYWdlIik7CisgICAgICAgIGZpbmFsIFZlcnRleCB2ID0gbW9jayhWZXJ0ZXguY2xhc3MpOworICAgICAgICB3aGVuKHYucHJvcGVydHkoImFnZSIpKS50aGVuUmV0dXJuKG5ldyBEZXRhY2hlZFZlcnRleFByb3BlcnR5PD4oMSwgImFnZSIsIDI5LCBudWxsKSk7CisgICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXI8Pih2LCAxKS5hc0FkbWluKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjksIHQubmV4dCgpLmludFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkV29ya09uVmVydGV4V2l0aE1pc3NpbmdLZXkoKSB7CisgICAgICAgIGZpbmFsIFZhbHVlVHJhdmVyc2FsPFZlcnRleCwgSW50ZWdlcj4gdCA9IG5ldyBWYWx1ZVRyYXZlcnNhbDw+KCJhZ2UiKTsKKyAgICAgICAgZmluYWwgVmVydGV4IHYgPSBtb2NrKFZlcnRleC5jbGFzcyk7CisgICAgICAgIHdoZW4odi5wcm9wZXJ0eSgiYWdlIikpLnRoZW5SZXR1cm4oVmVydGV4UHJvcGVydHkuZW1wdHkoKSk7CisgICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXI8Pih2LCAxKS5hc0FkbWluKCkpOworICAgICAgICBhc3NlcnROdWxsKHQubmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPbkVkZ2UoKSB7CisgICAgICAgIGZpbmFsIFZhbHVlVHJhdmVyc2FsPEVkZ2UsIERvdWJsZT4gdCA9IG5ldyBWYWx1ZVRyYXZlcnNhbDw+KCJ3ZWlnaHQiKTsKKyAgICAgICAgZmluYWwgRWRnZSBlID0gbW9jayhFZGdlLmNsYXNzKTsKKyAgICAgICAgd2hlbihlLnByb3BlcnR5KCJ3ZWlnaHQiKSkudGhlblJldHVybihuZXcgRGV0YWNoZWRQcm9wZXJ0eTw+KCJ3ZWlnaHQiLCAxLjBkKSk7CisgICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXI8PihlLCAxKS5hc0FkbWluKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZCwgdC5uZXh0KCksIDAuMDAwMDFkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPbkVkZ2VXaXRoTWlzc2luZ0tleSgpIHsKKyAgICAgICAgZmluYWwgVmFsdWVUcmF2ZXJzYWw8RWRnZSwgRG91YmxlPiB0ID0gbmV3IFZhbHVlVHJhdmVyc2FsPD4oIndlaWdodCIpOworICAgICAgICBmaW5hbCBFZGdlIGUgPSBtb2NrKEVkZ2UuY2xhc3MpOworICAgICAgICB3aGVuKGUucHJvcGVydHkoIndlaWdodCIpKS50aGVuUmV0dXJuKFByb3BlcnR5LmVtcHR5KCkpOworICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyPD4oZSwgMSkuYXNBZG1pbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCh0Lm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRXb3JrT25WZXJ0ZXhQcm9wZXJ0eSgpIHsKKyAgICAgICAgZmluYWwgVmFsdWVUcmF2ZXJzYWw8VmVydGV4UHJvcGVydHksIEludGVnZXI+IHQgPSBuZXcgVmFsdWVUcmF2ZXJzYWw8PigiYWdlIik7CisgICAgICAgIGZpbmFsIFZlcnRleFByb3BlcnR5IHZwID0gbW9jayhWZXJ0ZXhQcm9wZXJ0eS5jbGFzcyk7CisgICAgICAgIHdoZW4odnAucHJvcGVydHkoImFnZSIpKS50aGVuUmV0dXJuKG5ldyBEZXRhY2hlZFByb3BlcnR5PD4oImFnZSIsIDI5KSk7CisgICAgICAgIHQuYWRkU3RhcnQobmV3IEJfT19UcmF2ZXJzZXI8Pih2cCwgMSkuYXNBZG1pbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI5LCB0Lm5leHQoKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPblZlcnRleFByb3BlcnR5V2l0aE1pc3NpbmdLZXkoKSB7CisgICAgICAgIGZpbmFsIFZhbHVlVHJhdmVyc2FsPFZlcnRleFByb3BlcnR5LCBJbnRlZ2VyPiB0ID0gbmV3IFZhbHVlVHJhdmVyc2FsPD4oImFnZSIpOworICAgICAgICBmaW5hbCBWZXJ0ZXhQcm9wZXJ0eSB2cCA9IG1vY2soVmVydGV4UHJvcGVydHkuY2xhc3MpOworICAgICAgICB3aGVuKHZwLnByb3BlcnR5KCJhZ2UiKSkudGhlblJldHVybihQcm9wZXJ0eS5lbXB0eSgpKTsKKyAgICAgICAgdC5hZGRTdGFydChuZXcgQl9PX1RyYXZlcnNlcjw+KHZwLCAxKS5hc0FkbWluKCkpOworICAgICAgICBhc3NlcnROdWxsKHQubmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPbk1hcCgpIHsKKyAgICAgICAgZmluYWwgVmFsdWVUcmF2ZXJzYWw8TWFwPFN0cmluZyxJbnRlZ2VyPiwgSW50ZWdlcj4gdCA9IG5ldyBWYWx1ZVRyYXZlcnNhbDw+KCJhZ2UiKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZyxJbnRlZ2VyPiBtID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBtLnB1dCgiYWdlIiwgMjkpOworICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyPD4obSwgMSkuYXNBZG1pbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI5LCB0Lm5leHQoKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtPbk1hcFdpdGhNaXNzaW5nS2V5KCkgeworICAgICAgICBmaW5hbCBWYWx1ZVRyYXZlcnNhbDxNYXA8U3RyaW5nLEludGVnZXI+LCBJbnRlZ2VyPiB0ID0gbmV3IFZhbHVlVHJhdmVyc2FsPD4oIm5vdC1hZ2UiKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZyxJbnRlZ2VyPiBtID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBtLnB1dCgiYWdlIiwgMjkpOworICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyPD4obSwgMSkuYXNBZG1pbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCh0Lm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgc2hvdWxkVGhyb3dFeGNlcHRpb25XaGVuVHJ5aW5nVW5zdXBwb3J0ZWRUeXBlKCkgeworICAgICAgICBmaW5hbCBWYWx1ZVRyYXZlcnNhbDxJbnRlZ2VyLCBJbnRlZ2VyPiB0ID0gbmV3IFZhbHVlVHJhdmVyc2FsPD4oImFnZSIpOworICAgICAgICB0LmFkZFN0YXJ0KG5ldyBCX09fVHJhdmVyc2VyPD4oMjksIDEpLmFzQWRtaW4oKSk7CisgICAgICAgIHQubmV4dCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkVmVydGV4U3RlcFRlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkVmVydGV4U3RlcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWFlMGVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRWZXJ0ZXhTdGVwVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLlRyYXZlcnNlclNldFN1cHBsaWVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworcHVibGljIGNsYXNzIEFkZFZlcnRleFN0ZXBUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkRGVmYXVsdFRoZUxhYmVsSWZOdWxsU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBUcmF2ZXJzYWwuQWRtaW4gdCA9IG1vY2soVHJhdmVyc2FsLkFkbWluLmNsYXNzKTsKKyAgICAgICAgd2hlbih0LmdldFRyYXZlcnNlclNldFN1cHBsaWVyKCkpLnRoZW5SZXR1cm4oVHJhdmVyc2VyU2V0U3VwcGxpZXIuaW5zdGFuY2UoKSk7CisgICAgICAgIGZpbmFsIEFkZFZlcnRleFN0YXJ0U3RlcCBzdGFyU3RlcCA9IG5ldyBBZGRWZXJ0ZXhTdGFydFN0ZXAodCwgKFN0cmluZykgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhWZXJ0ZXguREVGQVVMVF9MQUJFTCwgc3RhclN0ZXAuZ2V0UGFyYW1ldGVycygpLmdldFJhdygpLmdldChULmxhYmVsKS5nZXQoMCkpOworICAgICAgICBmaW5hbCBBZGRWZXJ0ZXhTdGVwIHN0ZXAgPSBuZXcgQWRkVmVydGV4U3RlcCh0LCAoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFZlcnRleC5ERUZBVUxUX0xBQkVMLCBzdGFyU3RlcC5nZXRQYXJhbWV0ZXJzKCkuZ2V0UmF3KCkuZ2V0KFQubGFiZWwpLmdldCgwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGREZWZhdWx0VGhlTGFiZWxJZk51bGxUcmF2ZXJzYWwoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0ID0gbW9jayhUcmF2ZXJzYWwuQWRtaW4uY2xhc3MpOworICAgICAgICB3aGVuKHQuZ2V0VHJhdmVyc2VyU2V0U3VwcGxpZXIoKSkudGhlblJldHVybihUcmF2ZXJzZXJTZXRTdXBwbGllci5pbnN0YW5jZSgpKTsKKyAgICAgICAgZmluYWwgQWRkVmVydGV4U3RhcnRTdGVwIHN0YXJTdGVwID0gbmV3IEFkZFZlcnRleFN0YXJ0U3RlcCh0LCAoVHJhdmVyc2FsPD8sU3RyaW5nPikgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhWZXJ0ZXguREVGQVVMVF9MQUJFTCwgc3RhclN0ZXAuZ2V0UGFyYW1ldGVycygpLmdldFJhdygpLmdldChULmxhYmVsKS5nZXQoMCkpOworICAgICAgICBmaW5hbCBBZGRWZXJ0ZXhTdGVwIHN0ZXAgPSBuZXcgQWRkVmVydGV4U3RlcCh0LCAoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFZlcnRleC5ERUZBVUxUX0xBQkVMLCBzdGFyU3RlcC5nZXRQYXJhbWV0ZXJzKCkuZ2V0UmF3KCkuZ2V0KFQubGFiZWwpLmdldCgwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9PcmRlckdsb2JhbFN0ZXBUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyR2xvYmFsU3RlcFRlc3QuamF2YQppbmRleCAzMTQ1N2ZjLi44YmEyYzUyIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyR2xvYmFsU3RlcFRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyR2xvYmFsU3RlcFRlc3QuamF2YQpAQCAtNDAsMTIgKzQwLDYgQEAKICAgICBwcm90ZWN0ZWQgTGlzdDxUcmF2ZXJzYWw+IGdldFRyYXZlcnNhbHMoKSB7CiAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAogICAgICAgICAgICAgICAgIF9fLm9yZGVyKCksCi0gICAgICAgICAgICAgICAgX18ub3JkZXIoKS5ieShPcmRlci5kZWNyKSwKLSAgICAgICAgICAgICAgICBfXy5vcmRlcigpLmJ5KCJhZ2UiLCBPcmRlci5pbmNyKSwKLSAgICAgICAgICAgICAgICBfXy5vcmRlcigpLmJ5KCJhZ2UiLCBPcmRlci5kZWNyKSwKLSAgICAgICAgICAgICAgICBfXy5vcmRlcigpLmJ5KG91dEUoKS5jb3VudCgpLCBPcmRlci5pbmNyKSwKLSAgICAgICAgICAgICAgICBfXy5vcmRlcigpLmJ5KCJhZ2UiLCBPcmRlci5pbmNyKS5ieShvdXRFKCkuY291bnQoKSwgT3JkZXIuaW5jciksCi0gICAgICAgICAgICAgICAgX18ub3JkZXIoKS5ieShvdXRFKCkuY291bnQoKSwgT3JkZXIuaW5jcikuYnkoImFnZSIsIE9yZGVyLmluY3IpLAogICAgICAgICAgICAgICAgIF9fLm9yZGVyKCkuYnkoT3JkZXIuZGVzYyksCiAgICAgICAgICAgICAgICAgX18ub3JkZXIoKS5ieSgiYWdlIiwgT3JkZXIuYXNjKSwKICAgICAgICAgICAgICAgICBfXy5vcmRlcigpLmJ5KCJhZ2UiLCBPcmRlci5kZXNjKSwKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvT3JkZXJMb2NhbFN0ZXBUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyTG9jYWxTdGVwVGVzdC5qYXZhCmluZGV4IDU5OTk3OTMuLmVjNWU1MzkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvT3JkZXJMb2NhbFN0ZXBUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9PcmRlckxvY2FsU3RlcFRlc3QuamF2YQpAQCAtNDIsMTIgKzQyLDYgQEAKICAgICBwcm90ZWN0ZWQgTGlzdDxUcmF2ZXJzYWw+IGdldFRyYXZlcnNhbHMoKSB7CiAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAogICAgICAgICAgICAgICAgIF9fLm9yZGVyKFNjb3BlLmxvY2FsKSwKLSAgICAgICAgICAgICAgICBfXy5vcmRlcihTY29wZS5sb2NhbCkuYnkoT3JkZXIuZGVjciksCi0gICAgICAgICAgICAgICAgX18ub3JkZXIoU2NvcGUubG9jYWwpLmJ5KCJhZ2UiLCBPcmRlci5pbmNyKSwKLSAgICAgICAgICAgICAgICBfXy5vcmRlcihTY29wZS5sb2NhbCkuYnkoImFnZSIsIE9yZGVyLmRlY3IpLAotICAgICAgICAgICAgICAgIF9fLm9yZGVyKFNjb3BlLmxvY2FsKS5ieShvdXRFKCkuY291bnQoKSwgT3JkZXIuaW5jciksCi0gICAgICAgICAgICAgICAgX18ub3JkZXIoU2NvcGUubG9jYWwpLmJ5KCJhZ2UiLCBPcmRlci5pbmNyKS5ieShvdXRFKCkuY291bnQoKSwgT3JkZXIuaW5jciksCi0gICAgICAgICAgICAgICAgX18ub3JkZXIoU2NvcGUubG9jYWwpLmJ5KG91dEUoKS5jb3VudCgpLCBPcmRlci5pbmNyKS5ieSgiYWdlIiwgT3JkZXIuaW5jciksCiAgICAgICAgICAgICAgICAgX18ub3JkZXIoU2NvcGUubG9jYWwpLmJ5KE9yZGVyLmRlc2MpLAogICAgICAgICAgICAgICAgIF9fLm9yZGVyKFNjb3BlLmxvY2FsKS5ieSgiYWdlIiwgT3JkZXIuYXNjKSwKICAgICAgICAgICAgICAgICBfXy5vcmRlcihTY29wZS5sb2NhbCkuYnkoImFnZSIsIE9yZGVyLmRlc2MpLApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvQWdncmVnYXRlR2xvYmFsU3RlcFRlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZUdsb2JhbFN0ZXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0ZjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZUdsb2JhbFN0ZXBUZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlN0ZXBUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIERhbmllbCBLdXBwaXR6IChodHRwOi8vZ3JlbWxpbi5ndXJ1KQorICovCitwdWJsaWMgY2xhc3MgQWdncmVnYXRlR2xvYmFsU3RlcFRlc3QgZXh0ZW5kcyBTdGVwVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxUcmF2ZXJzYWw+IGdldFRyYXZlcnNhbHMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIF9fLmFnZ3JlZ2F0ZSgieCIpLAorICAgICAgICAgICAgICAgIF9fLmFnZ3JlZ2F0ZSgieCIpLmJ5KCJuYW1lIiksCisgICAgICAgICAgICAgICAgX18uYWdncmVnYXRlKCJ4IikuYnkoImFnZSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9BZ2dyZWdhdGVMb2NhbFN0ZXBUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9BZ2dyZWdhdGVMb2NhbFN0ZXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyODI5MgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZUxvY2FsU3RlcFRlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuU3RlcFRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGVMb2NhbFN0ZXBUZXN0IGV4dGVuZHMgU3RlcFRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8VHJhdmVyc2FsPiBnZXRUcmF2ZXJzYWxzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBfXy5zdG9yZSgieCIpLAorICAgICAgICAgICAgICAgIF9fLnN0b3JlKCJ4IikuYnkoIm5hbWUiKSwKKyAgICAgICAgICAgICAgICBfXy5zdG9yZSgieCIpLmJ5KCJhZ2UiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvQWdncmVnYXRlU3RlcFRlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0FnZ3JlZ2F0ZVN0ZXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMDEwMWMuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvQWdncmVnYXRlU3RlcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5TdGVwVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqLwotcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZVN0ZXBUZXN0IGV4dGVuZHMgU3RlcFRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3Q8VHJhdmVyc2FsPiBnZXRUcmF2ZXJzYWxzKCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBfXy5hZ2dyZWdhdGUoIngiKSwKLSAgICAgICAgICAgICAgICBfXy5hZ2dyZWdhdGUoIngiKS5ieSgibmFtZSIpLAotICAgICAgICAgICAgICAgIF9fLmFnZ3JlZ2F0ZSgieCIpLmJ5KCJhZ2UiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvU3RvcmVTdGVwVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvU3RvcmVTdGVwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTNlYzhlLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L1N0b3JlU3RlcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5TdGVwVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqLwotcHVibGljIGNsYXNzIFN0b3JlU3RlcFRlc3QgZXh0ZW5kcyBTdGVwVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTGlzdDxUcmF2ZXJzYWw+IGdldFRyYXZlcnNhbHMoKSB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgIF9fLnN0b3JlKCJ4IiksCi0gICAgICAgICAgICAgICAgX18uc3RvcmUoIngiKS5ieSgibmFtZSIpLAotICAgICAgICAgICAgICAgIF9fLnN0b3JlKCJ4IikuYnkoImFnZSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvdXRpbC9QYXJhbWV0ZXJzVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3V0aWwvUGFyYW1ldGVyc1Rlc3QuamF2YQppbmRleCBlYmU0MGFmLi4yN2Q4ZTQ0IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvdXRpbC9QYXJhbWV0ZXJzVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC91dGlsL1BhcmFtZXRlcnNUZXN0LmphdmEKQEAgLTQzLDYgKzQzLDcgQEAKICAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKICAqLwogcHVibGljIGNsYXNzIFBhcmFtZXRlcnNUZXN0IHsKKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkR2V0S2V5VmFsdWVzRW1wdHkoKSB7CiAgICAgICAgIGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCk7CkBAIC01MCw2ICs1MSwxNiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkQWxsb3dOdWxsVmFsdWVzKCkgeworICAgICAgICBmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbWV0ZXJzLnNldChudWxsLCAiYSIsIG51bGwsICJiIiwgImJhdCIsICJjIiwgImNhdCIpOworCisgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhcmFtcyA9IHBhcmFtZXRlcnMuZ2V0S2V5VmFsdWVzKG1vY2soVHJhdmVyc2VyLkFkbWluLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBwYXJhbXMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ImEiLCBudWxsLCAiYiIsICJiYXQiLCAiYyIsICJjYXQifSwgcGFyYW1zKSwgaXModHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkR2V0S2V5VmFsdWVzKCkgewogICAgICAgICBmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVycygpOwogICAgICAgICBwYXJhbWV0ZXJzLnNldChudWxsLCAiYSIsICJheGUiLCAiYiIsICJiYXQiLCAiYyIsICJjYXQiKTsKQEAgLTIxMCw2ICsyMjEsMTQgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZENvbnRhaW5LZXlWYWx1ZSgpIHsKKyAgICAgICAgZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1ldGVycy5zZXQobnVsbCwgImEiLCAiYXhlIiwgImIiLCAiYmF0IiwgImMiLCAiY2F0Iik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChwYXJhbWV0ZXJzLmNvbnRhaW5zKCJiIiwgImJhdCIpLCBpcyh0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RDb250YWluS2V5KCkgewogICAgICAgICBmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVycygpOwogICAgICAgICBwYXJhbWV0ZXJzLnNldChudWxsLCAiYSIsICJheGUiLCAiYiIsICJiYXQiLCAiYyIsICJjYXQiKTsKQEAgLTIxOCw2ICsyMzcsMTQgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdENvbnRhaW5LZXlBbmRWYWx1ZSgpIHsKKyAgICAgICAgZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1ldGVycy5zZXQobnVsbCwgImEiLCAiYXhlIiwgImIiLCAiYmF0IiwgImMiLCAiY2F0Iik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChwYXJhbWV0ZXJzLmNvbnRhaW5zKCJiIiwgIm1hdCIpLCBpcyhmYWxzZSkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkR2V0U2V0TXVsdGlwbGUoKSB7CiAgICAgICAgIGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCk7CiAgICAgICAgIHBhcmFtZXRlcnMuc2V0KG51bGwsICJhIiwgImF4ZSIsICJhIiwgImFudCIsICJiIiwgImJhdCIsICJiIiwgImJhbGwiLCAiYyIsICJjYXQiKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL0J5TW9kdWxhdG9yT3B0aW1pemF0aW9uU3RyYXRlZ3lUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9CeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTAwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9CeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5TY29wZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLkRlZmF1bHRUcmF2ZXJzYWxTdHJhdGVnaWVzOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuT3BlcmF0b3IuYXNzaWduOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXy52YWx1ZXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgRGFuaWVsIEt1cHBpdHogKGh0dHA6Ly9ncmVtbGluLmd1cnUpCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgcHVibGljIFRyYXZlcnNhbCBvcmlnaW5hbDsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcih2YWx1ZSA9IDEpCisgICAgcHVibGljIFRyYXZlcnNhbCBvcHRpbWl6ZWQ7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPE9iamVjdFtdPiBnZW5lcmF0ZVRlc3RQYXJhbWV0ZXJzKCkgeworCisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0W10+IG9yaWdpbmFsQW5kT3B0aW1pemVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsW10gYmFzZVRyYXZlcnNhbHMgPSBuZXcgR3JhcGhUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICBfXy5hZ2dyZWdhdGUoIngiKSwKKyAgICAgICAgICAgICAgICBfXy5kZWR1cCgpLAorICAgICAgICAgICAgICAgIF9fLmRlZHVwKCJhIiksCisgICAgICAgICAgICAgICAgX18uZ3JvdXAoKSwKKyAgICAgICAgICAgICAgICBfXy5ncm91cCgieCIpLAorICAgICAgICAgICAgICAgIF9fLmdyb3VwQ291bnQoKSwKKyAgICAgICAgICAgICAgICBfXy5ncm91cENvdW50KCJ4IiksCisgICAgICAgICAgICAgICAgX18ub3JkZXIoKSwKKyAgICAgICAgICAgICAgICBfXy5vcmRlcihTY29wZS5sb2NhbCksCisgICAgICAgICAgICAgICAgX18ucHJvamVjdCgiYSIpLAorICAgICAgICAgICAgICAgIF9fLnBhdGgoKSwKKyAgICAgICAgICAgICAgICBfXy5wYXRoKCkuZnJvbSgiYSIpLnRvKCJiIiksCisgICAgICAgICAgICAgICAgX18uc2Fjayhhc3NpZ24pLAorICAgICAgICAgICAgICAgIF9fLnNhbXBsZSgxMCksCisgICAgICAgICAgICAgICAgX18uc2VsZWN0KCJhIiksCisgICAgICAgICAgICAgICAgX18uc2VsZWN0KCJhIiwgImIiKSwKKyAgICAgICAgICAgICAgICBfXy5zdG9yZSgieCIpLAorICAgICAgICAgICAgICAgIF9fLnRyZWUoKSwKKyAgICAgICAgICAgICAgICBfXy50cmVlKCJ4IiksCisgICAgICAgICAgICAgICAgX18ud2hlcmUoUC5lcSgiYSIpKSwKKyAgICAgICAgICAgICAgICBfXy53aGVyZSgiYSIsIFAuZXEoImIiKSkKKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKGZpbmFsIFRyYXZlcnNhbCB0cmF2ZXJzYWwgOiBiYXNlVHJhdmVyc2FscykgeworICAgICAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbDw/LCA/PikgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieSh2YWx1ZXMoIm5hbWUiKSksCisgICAgICAgICAgICAgICAgICAgICgoR3JhcGhUcmF2ZXJzYWwpIHRyYXZlcnNhbC5hc0FkbWluKCkuY2xvbmUoKSkuYnkoIm5hbWUiKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbDw/LCA/PikgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShfXy5pZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbCkgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShULmlkKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbDw/LCA/PikgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShfXy5sYWJlbCgpKSwKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbCkgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShULmxhYmVsKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbDw/LCA/PikgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShfXy5rZXkoKSksCisgICAgICAgICAgICAgICAgICAgICgoR3JhcGhUcmF2ZXJzYWwpIHRyYXZlcnNhbC5hc0FkbWluKCkuY2xvbmUoKSkuYnkoVC5rZXkpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBvcmlnaW5hbEFuZE9wdGltaXplZC5hZGQobmV3IFRyYXZlcnNhbFtdeworICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsPD8sID8+KSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KF9fLnZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KFQudmFsdWUpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBvcmlnaW5hbEFuZE9wdGltaXplZC5hZGQobmV3IFRyYXZlcnNhbFtdeworICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsPD8sID8+KSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KF9fLmlkZW50aXR5KCkpLAorICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KCksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIG9yaWdpbmFsQW5kT3B0aW1pemVkLmFkZChuZXcgVHJhdmVyc2FsW117CisgICAgICAgICAgICAgICAgX18ucHJvamVjdCgiYSIsICJiIiwgImMiLCAiZCIsICJlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ieSh2YWx1ZXMoIm5hbWUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ieShfXy5pZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ5KF9fLmxhYmVsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnkoX18uaWRlbnRpdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ieShfXy5vdXRFKCkuY291bnQoKSksCisgICAgICAgICAgICAgICAgX18ucHJvamVjdCgiYSIsICJiIiwgImMiLCAiZCIsICJlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ieSgibmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnkoVC5pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ieShULmxhYmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ieShfXy5vdXRFKCkuY291bnQoKSkKKyAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWxbXSBiYXNlR3JvdXBUcmF2ZXJzYWxzID0gbmV3IEdyYXBoVHJhdmVyc2FsW117CisgICAgICAgICAgICAgICAgX18uZ3JvdXAoKS5ieSgiYWdlIiksCisgICAgICAgICAgICAgICAgX18uZ3JvdXAoIngiKS5ieSgiYWdlIiksCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChmaW5hbCBUcmF2ZXJzYWwgdHJhdmVyc2FsIDogYmFzZUdyb3VwVHJhdmVyc2FscykgeworICAgICAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbDw/LCA/PikgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieSh2YWx1ZXMoIm5hbWUiKS5mb2xkKCkpLAorICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KCJuYW1lIiksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG9yaWdpbmFsQW5kT3B0aW1pemVkLmFkZChuZXcgVHJhdmVyc2FsW117CisgICAgICAgICAgICAgICAgICAgICgoR3JhcGhUcmF2ZXJzYWw8PywgPz4pIHRyYXZlcnNhbC5hc0FkbWluKCkuY2xvbmUoKSkuYnkoX18uaWQoKS5mb2xkKCkpLAorICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KFQuaWQpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBvcmlnaW5hbEFuZE9wdGltaXplZC5hZGQobmV3IFRyYXZlcnNhbFtdeworICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsPD8sID8+KSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KF9fLmxhYmVsKCkuZm9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbCkgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShULmxhYmVsKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbDw/LCA/PikgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShfXy5rZXkoKS5mb2xkKCkpLAorICAgICAgICAgICAgICAgICAgICAoKEdyYXBoVHJhdmVyc2FsKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmNsb25lKCkpLmJ5KFQua2V5KSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICAgICAgKChHcmFwaFRyYXZlcnNhbDw/LCA/PikgdHJhdmVyc2FsLmFzQWRtaW4oKS5jbG9uZSgpKS5ieShfXy52YWx1ZSgpLmZvbGQoKSksCisgICAgICAgICAgICAgICAgICAgICgoR3JhcGhUcmF2ZXJzYWwpIHRyYXZlcnNhbC5hc0FkbWluKCkuY2xvbmUoKSkuYnkoVC52YWx1ZSksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG9yaWdpbmFsQW5kT3B0aW1pemVkLmFkZChuZXcgVHJhdmVyc2FsW117CisgICAgICAgICAgICAgICAgICAgICgoR3JhcGhUcmF2ZXJzYWw8PywgPz4pIHRyYXZlcnNhbC5hc0FkbWluKCkuY2xvbmUoKSkuYnkoX18uaWRlbnRpdHkoKSksCisgICAgICAgICAgICAgICAgICAgICgoR3JhcGhUcmF2ZXJzYWwpIHRyYXZlcnNhbC5hc0FkbWluKCkuY2xvbmUoKSkuYnkoKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICBfXy5ncm91cCgpLmJ5KHZhbHVlcygiYWdlIikpLmJ5KHZhbHVlcygibmFtZSIpKSwKKyAgICAgICAgICAgICAgICBfXy5ncm91cCgpLmJ5KCJhZ2UiKS5ieSh2YWx1ZXMoIm5hbWUiKSkKKyAgICAgICAgfSk7CisKKyAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICBfXy5ncm91cCgieCIpLmJ5KHZhbHVlcygiYWdlIikpLmJ5KHZhbHVlcygibmFtZSIpKSwKKyAgICAgICAgICAgICAgICBfXy5ncm91cCgieCIpLmJ5KCJhZ2UiKS5ieSh2YWx1ZXMoIm5hbWUiKSkKKyAgICAgICAgfSk7CisKKyAgICAgICAgb3JpZ2luYWxBbmRPcHRpbWl6ZWQuYWRkKG5ldyBUcmF2ZXJzYWxbXXsKKyAgICAgICAgICAgICAgICBfXy5ncm91cCgpLmJ5KHZhbHVlcygiYWdlIikpLmJ5KHZhbHVlcygibmFtZSIpLmZvbGQoKSksCisgICAgICAgICAgICAgICAgX18uZ3JvdXAoKS5ieSgiYWdlIikuYnkoIm5hbWUiKQorICAgICAgICB9KTsKKworICAgICAgICBvcmlnaW5hbEFuZE9wdGltaXplZC5hZGQobmV3IFRyYXZlcnNhbFtdeworICAgICAgICAgICAgICAgIF9fLmdyb3VwKCJ4IikuYnkodmFsdWVzKCJhZ2UiKSkuYnkodmFsdWVzKCJuYW1lIikuZm9sZCgpKSwKKyAgICAgICAgICAgICAgICBfXy5ncm91cCgieCIpLmJ5KCJhZ2UiKS5ieSgibmFtZSIpCisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBvcmlnaW5hbEFuZE9wdGltaXplZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwbHlCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5KGZpbmFsIFRyYXZlcnNhbCB0cmF2ZXJzYWwpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsU3RyYXRlZ2llcyBzdHJhdGVnaWVzID0gbmV3IERlZmF1bHRUcmF2ZXJzYWxTdHJhdGVnaWVzKCk7CisgICAgICAgIHN0cmF0ZWdpZXMuYWRkU3RyYXRlZ2llcyhCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5Lmluc3RhbmNlKCkpOworICAgICAgICB0cmF2ZXJzYWwuYXNBZG1pbigpLnNldFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgIHRyYXZlcnNhbC5hc0FkbWluKCkuYXBwbHlTdHJhdGVnaWVzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkb1Rlc3QoKSB7CisgICAgICAgIGFwcGx5QnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneShvcmlnaW5hbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcHRpbWl6ZWQsIG9yaWdpbmFsKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vSW5saW5lRmlsdGVyU3RyYXRlZ3lUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9JbmxpbmVGaWx0ZXJTdHJhdGVneVRlc3QuamF2YQppbmRleCBjZjU0ZjUwLi45N2Q2NDA3IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9JbmxpbmVGaWx0ZXJTdHJhdGVneVRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9JbmxpbmVGaWx0ZXJTdHJhdGVneVRlc3QuamF2YQpAQCAtOTgsNyArOTgsOCBAQAogICAgICAgICAgICAgICAgIHtmaWx0ZXIoaGFzKCJhZ2UiLCBndCgxMCkpLmFzKCJiIikpLmFzKCJhIiksIGhhcygiYWdlIiwgZ3QoMTApKS5hcygiYiIsICJhIiksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpfSwKICAgICAgICAgICAgICAgICB7ZmlsdGVyKGhhcygiYWdlIiwgZ3QoMTApKS5hcygiYSIpKSwgaGFzKCJhZ2UiLCBndCgxMCkpLmFzKCJhIiksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpfSwKICAgICAgICAgICAgICAgICB7ZmlsdGVyKGFuZChoYXMoImFnZSIsIGd0KDEwKSkuYXMoImEiKSwgaGFzKCJuYW1lIiwgIm1hcmtvIikpKSwgYWRkSGFzKF9fLnN0YXJ0KCksICJhZ2UiLCBndCgxMCksICJuYW1lIiwgZXEoIm1hcmtvIikpLmFzKCJhIiksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpfSwKLSAgICAgICAgICAgICAgICB7ZmlsdGVyKG91dCgiY3JlYXRlZCIpLmFuZCgpLm91dCgia25vd3MiKS5vcigpLmluKCJrbm93cyIpKSwgZmlsdGVyKG9yKGFuZChvdXQoImNyZWF0ZWQiKSwgb3V0KCJrbm93cyIpKSwgX18uaW4oImtub3dzIikpKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChDb25uZWN0aXZlU3RyYXRlZ3kuaW5zdGFuY2UoKSl9LAorICAgICAgICAgICAgICAgIHtmaWx0ZXIob3V0KCJjcmVhdGVkIikuYW5kKCkub3V0KCJrbm93cyIpLm9yKCkuaW4oImtub3dzIikpLCBvcihhbmQob3V0KCJjcmVhdGVkIiksIG91dCgia25vd3MiKSksIF9fLmluKCJrbm93cyIpKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChDb25uZWN0aXZlU3RyYXRlZ3kuaW5zdGFuY2UoKSl9LAorICAgICAgICAgICAgICAgIHtmaWx0ZXIob3V0KCJjcmVhdGVkIikuYW5kKCkub3V0KCJrbm93cyIpLm9yKCkuaW4oImtub3dzIikpLmFuZChoYXNMYWJlbCgicGVyc29uIikpLCBvcihhbmQob3V0KCJjcmVhdGVkIiksIG91dCgia25vd3MiKSksIF9fLmluKCJrbm93cyIpKS5oYXNMYWJlbCgicGVyc29uIiksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQ29ubmVjdGl2ZVN0cmF0ZWd5Lmluc3RhbmNlKCkpfSwKICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgIHtvcihoYXMoIm5hbWUiLCAibWFya28iKSwgaGFzKCJhZ2UiLCAzMikpLCBvcihoYXMoIm5hbWUiLCAibWFya28iKSwgaGFzKCJhZ2UiLCAzMikpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKX0sCiAgICAgICAgICAgICAgICAge29yKGhhcygibmFtZSIsICJtYXJrbyIpLCBoYXMoIm5hbWUiLCAiYm9iIikpLCBoYXMoIm5hbWUiLCBlcSgibWFya28iKS5vcihlcSgiYm9iIikpKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCl9LApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vUGF0aFByb2Nlc3NvclN0cmF0ZWd5VGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vUGF0aFByb2Nlc3NvclN0cmF0ZWd5VGVzdC5qYXZhCmluZGV4IDk2MTZkNWEuLmVjMGI4OWMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1BhdGhQcm9jZXNzb3JTdHJhdGVneVRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9QYXRoUHJvY2Vzc29yU3RyYXRlZ3lUZXN0LmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkRlZmF1bHRHcmFwaFRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXzsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmxhbWJkYS5FbGVtZW50VmFsdWVUcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuVmFsdWVUcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5sYW1iZGEuSWRlbnRpdHlUcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbFBhcmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuRGVmYXVsdFRyYXZlcnNhbFN0cmF0ZWdpZXM7CkBAIC04MiwyMCArODIsMjAgQEAKICAgICAgICAgICAgICAgICB7X18uc2VsZWN0KCJhIiksIF9fLnNlbGVjdCgiYSIpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKX0sCiAgICAgICAgICAgICAgICAge19fLnNlbGVjdCgiYSIpLmJ5KCksIF9fLnNlbGVjdCgiYSIpLmJ5KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpfSwKICAgICAgICAgICAgICAgICB7X18uc2VsZWN0KCJhIikuYnkoX18ub3V0RSgpLmNvdW50KCkpLCBfXy5zZWxlY3QoImEiKS5tYXAoX18ub3V0RSgpLmNvdW50KCkpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKX0sCi0gICAgICAgICAgICAgICAge19fLnNlbGVjdCgiYSIpLmJ5KCJuYW1lIiksIF9fLnNlbGVjdCgiYSIpLm1hcChuZXcgRWxlbWVudFZhbHVlVHJhdmVyc2FsPD4oIm5hbWUiKSksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpfSwKKyAgICAgICAgICAgICAgICB7X18uc2VsZWN0KCJhIikuYnkoIm5hbWUiKSwgX18uc2VsZWN0KCJhIikubWFwKG5ldyBWYWx1ZVRyYXZlcnNhbDw+KCJuYW1lIikpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKX0sCiAgICAgICAgICAgICAgICAge19fLnNlbGVjdCgiYSIpLm91dCgpLCBfXy5zZWxlY3QoImEiKS5vdXQoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCl9LAotICAgICAgICAgICAgICAgIHtfXy5zZWxlY3QoUG9wLmFsbCwgImEiKS5ieShfXy52YWx1ZXMoIm5hbWUiKSksIF9fLnNlbGVjdChQb3AuYWxsLCAiYSIpLmJ5KF9fLnZhbHVlcygibmFtZSIpKSwgVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKEdyYXBoLmNsYXNzKS50b0xpc3QoKX0sCisgICAgICAgICAgICAgICAge19fLnNlbGVjdChQb3AuYWxsLCAiYSIpLmJ5KF9fLnZhbHVlcygibmFtZSIpKSwgX18uc2VsZWN0KFBvcC5hbGwsICJhIikuYnkoIm5hbWUiKSwgVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKEdyYXBoLmNsYXNzKS50b0xpc3QoKX0sCiAgICAgICAgICAgICAgICAge19fLnNlbGVjdChQb3AubGFzdCwgImEiKS5ieShfXy52YWx1ZXMoIm5hbWUiKSksIF9fLnNlbGVjdChQb3AubGFzdCwgImEiKS5tYXAoX18udmFsdWVzKCJuYW1lIikpLCBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpLnRvTGlzdCgpfSwKICAgICAgICAgICAgICAgICB7X18uc2VsZWN0KFBvcC5maXJzdCwgImEiKS5ieShfXy52YWx1ZXMoIm5hbWUiKSksIF9fLnNlbGVjdChQb3AuZmlyc3QsICJhIikubWFwKF9fLnZhbHVlcygibmFtZSIpKSwgVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKEdyYXBoLmNsYXNzKS50b0xpc3QoKX0sCiAgICAgICAgICAgICAgICAgLy8gc2VsZWN0KCJhIiwiYiIpCiAgICAgICAgICAgICAgICAge19fLnNlbGVjdCgiYSIsICJiIiksIF9fLnNlbGVjdCgiYSIsICJiIiksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpfSwKICAgICAgICAgICAgICAgICB7X18uc2VsZWN0KCJhIiwgImIiKS5ieSgpLCBfXy5zZWxlY3QoImEiLCAiYiIpLmJ5KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpfSwKICAgICAgICAgICAgICAgICB7X18uc2VsZWN0KCJhIiwgImIiLCAiYyIpLmJ5KCksIF9fLnNlbGVjdCgiYSIsICJiIiwgImMiKS5ieSgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKX0sCi0gICAgICAgICAgICAgICAge19fLnNlbGVjdCgiYSIsICJiIikuYnkoKS5ieSgiYWdlIiksIF9fLnNlbGVjdCgiYiIpLm1hcChuZXcgRWxlbWVudFZhbHVlVHJhdmVyc2FsPD4oImFnZSIpKS5hcygiYiIpLnNlbGVjdCgiYSIpLm1hcChuZXcgSWRlbnRpdHlUcmF2ZXJzYWw8PigpKS5hcygiYSIpLnNlbGVjdChQb3AubGFzdCwgImEiLCAiYiIpLCBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpLnRvTGlzdCgpfSwKLSAgICAgICAgICAgICAgICB7X18uc2VsZWN0KCJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgX18uc2VsZWN0KCJiIikubWFwKG5ldyBFbGVtZW50VmFsdWVUcmF2ZXJzYWw8PigiYWdlIikpLmFzKCJiIikuc2VsZWN0KCJhIikubWFwKG5ldyBFbGVtZW50VmFsdWVUcmF2ZXJzYWw8PigibmFtZSIpKS5hcygiYSIpLnNlbGVjdChQb3AubGFzdCwgImEiLCAiYiIpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKX0sCi0gICAgICAgICAgICAgICAge19fLnNlbGVjdCgiYSIsICJiIiwgImMiKS5ieSgibmFtZSIpLmJ5KF9fLm91dEUoKS5jb3VudCgpKSwgX18uc2VsZWN0KCJjIikubWFwKG5ldyBFbGVtZW50VmFsdWVUcmF2ZXJzYWw8PigibmFtZSIpKS5hcygiYyIpLnNlbGVjdCgiYiIpLm1hcChfXy5vdXRFKCkuY291bnQoKSkuYXMoImIiKS5zZWxlY3QoImEiKS5tYXAobmV3IEVsZW1lbnRWYWx1ZVRyYXZlcnNhbDw+KCJuYW1lIikpLmFzKCJhIikuc2VsZWN0KFBvcC5sYXN0LCAiYSIsICJiIiwgImMiKSwgVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKEdyYXBoLmNsYXNzKS50b0xpc3QoKX0sCi0gICAgICAgICAgICAgICAge19fLnNlbGVjdChQb3AuZmlyc3QsICJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgX18uc2VsZWN0KFBvcC5maXJzdCwgImIiKS5tYXAobmV3IEVsZW1lbnRWYWx1ZVRyYXZlcnNhbDw+KCJhZ2UiKSkuYXMoImIiKS5zZWxlY3QoUG9wLmZpcnN0LCAiYSIpLm1hcChuZXcgRWxlbWVudFZhbHVlVHJhdmVyc2FsPD4oIm5hbWUiKSkuYXMoImEiKS5zZWxlY3QoUG9wLmxhc3QsICJhIiwgImIiKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCl9LAotICAgICAgICAgICAgICAgIHtfXy5zZWxlY3QoUG9wLmxhc3QsICJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgX18uc2VsZWN0KFBvcC5sYXN0LCAiYiIpLm1hcChuZXcgRWxlbWVudFZhbHVlVHJhdmVyc2FsPD4oImFnZSIpKS5hcygiYiIpLnNlbGVjdChQb3AubGFzdCwgImEiKS5tYXAobmV3IEVsZW1lbnRWYWx1ZVRyYXZlcnNhbDw+KCJuYW1lIikpLmFzKCJhIikuc2VsZWN0KFBvcC5sYXN0LCAiYSIsICJiIiksIFRyYXZlcnNhbFN0cmF0ZWdpZXMuR2xvYmFsQ2FjaGUuZ2V0U3RyYXRlZ2llcyhHcmFwaC5jbGFzcykudG9MaXN0KCl9LAorICAgICAgICAgICAgICAgIHtfXy5zZWxlY3QoImEiLCAiYiIpLmJ5KCkuYnkoImFnZSIpLCBfXy5zZWxlY3QoImIiKS5tYXAobmV3IFZhbHVlVHJhdmVyc2FsPD4oImFnZSIpKS5hcygiYiIpLnNlbGVjdCgiYSIpLm1hcChuZXcgSWRlbnRpdHlUcmF2ZXJzYWw8PigpKS5hcygiYSIpLnNlbGVjdChQb3AubGFzdCwgImEiLCAiYiIpLCBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpLnRvTGlzdCgpfSwKKyAgICAgICAgICAgICAgICB7X18uc2VsZWN0KCJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgX18uc2VsZWN0KCJiIikubWFwKG5ldyBWYWx1ZVRyYXZlcnNhbDw+KCJhZ2UiKSkuYXMoImIiKS5zZWxlY3QoImEiKS5tYXAobmV3IFZhbHVlVHJhdmVyc2FsPD4oIm5hbWUiKSkuYXMoImEiKS5zZWxlY3QoUG9wLmxhc3QsICJhIiwgImIiKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCl9LAorICAgICAgICAgICAgICAgIHtfXy5zZWxlY3QoImEiLCAiYiIsICJjIikuYnkoIm5hbWUiKS5ieShfXy5vdXRFKCkuY291bnQoKSksIF9fLnNlbGVjdCgiYyIpLm1hcChuZXcgVmFsdWVUcmF2ZXJzYWw8PigibmFtZSIpKS5hcygiYyIpLnNlbGVjdCgiYiIpLm1hcChfXy5vdXRFKCkuY291bnQoKSkuYXMoImIiKS5zZWxlY3QoImEiKS5tYXAobmV3IFZhbHVlVHJhdmVyc2FsPD4oIm5hbWUiKSkuYXMoImEiKS5zZWxlY3QoUG9wLmxhc3QsICJhIiwgImIiLCAiYyIpLCBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpLnRvTGlzdCgpfSwKKyAgICAgICAgICAgICAgICB7X18uc2VsZWN0KFBvcC5maXJzdCwgImEiLCAiYiIpLmJ5KCJuYW1lIikuYnkoImFnZSIpLCBfXy5zZWxlY3QoUG9wLmZpcnN0LCAiYiIpLm1hcChuZXcgVmFsdWVUcmF2ZXJzYWw8PigiYWdlIikpLmFzKCJiIikuc2VsZWN0KFBvcC5maXJzdCwgImEiKS5tYXAobmV3IFZhbHVlVHJhdmVyc2FsPD4oIm5hbWUiKSkuYXMoImEiKS5zZWxlY3QoUG9wLmxhc3QsICJhIiwgImIiKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCl9LAorICAgICAgICAgICAgICAgIHtfXy5zZWxlY3QoUG9wLmxhc3QsICJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgX18uc2VsZWN0KFBvcC5sYXN0LCAiYiIpLm1hcChuZXcgVmFsdWVUcmF2ZXJzYWw8PigiYWdlIikpLmFzKCJiIikuc2VsZWN0KFBvcC5sYXN0LCAiYSIpLm1hcChuZXcgVmFsdWVUcmF2ZXJzYWw8PigibmFtZSIpKS5hcygiYSIpLnNlbGVjdChQb3AubGFzdCwgImEiLCAiYiIpLCBUcmF2ZXJzYWxTdHJhdGVnaWVzLkdsb2JhbENhY2hlLmdldFN0cmF0ZWdpZXMoR3JhcGguY2xhc3MpLnRvTGlzdCgpfSwKICAgICAgICAgICAgICAgICB7X18uc2VsZWN0KFBvcC5hbGwsICJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgX18uc2VsZWN0KFBvcC5hbGwsICJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCl9LAogICAgICAgICAgICAgICAgIHtfXy5zZWxlY3QoUG9wLm1peGVkLCAiYSIsICJiIikuYnkoIm5hbWUiKS5ieSgiYWdlIiksIF9fLnNlbGVjdChQb3AubWl4ZWQsICJhIiwgImIiKS5ieSgibmFtZSIpLmJ5KCJhZ2UiKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCl9LAogICAgICAgICAgICAgICAgIC8vIHdoZXJlKGFzKCJhIikuLi4pCmRpZmYgLS1naXQgYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3RyYXZlcnNlci91dGlsL0VtcHR5VHJhdmVyc2VyVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvdXRpbC9FbXB0eVRyYXZlcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQxOTAwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvdXRpbC9FbXB0eVRyYXZlcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC50cmF2ZXJzZXIudXRpbDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKK3B1YmxpYyBjbGFzcyBFbXB0eVRyYXZlcnNlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRIYXZlU2FtZUluc3RhbmNlKCkgeworICAgICAgICBhc3NlcnRTYW1lKEVtcHR5VHJhdmVyc2VyLmluc3RhbmNlKCksIEVtcHR5VHJhdmVyc2VyLmluc3RhbmNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGF2ZVplcm9CdWxrKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgRW1wdHlUcmF2ZXJzZXIuaW5zdGFuY2UoKS5idWxrKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdHJhdmVyc2VyL3V0aWwvSW5kZXhlZFRyYXZlcnNlclNldFRlc3QuamF2YSBiL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdHJhdmVyc2VyL3V0aWwvSW5kZXhlZFRyYXZlcnNlclNldFRlc3QuamF2YQppbmRleCAwZDc2NWY0Li42ZjBiNDkwIDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3RyYXZlcnNlci91dGlsL0luZGV4ZWRUcmF2ZXJzZXJTZXRUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC90cmF2ZXJzZXIvdXRpbC9JbmRleGVkVHJhdmVyc2VyU2V0VGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5udWxsVmFsdWU7CkBAIC0xMTEsNyArMTEyLDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vcGVUcmF2ZXJzZXJzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBub3BlVHJhdmVyc2Vycy5nZXQoMCkuYnVsaygpKTsKIAotICAgICAgICB0cy5zaHVmZmxlKCk7CisgICAgICAgIHRzLnNodWZmbGUobmV3IFJhbmRvbSgpKTsKIAogICAgICAgICBmaW5hbCBMaXN0PFRyYXZlcnNlci5BZG1pbjxTdHJpbmc+PiB0ZXN0VHJhdmVyc2Vyc0FmdGVyU2h1ZmZsZSA9IG5ldyBBcnJheUxpc3Q8Pih0cy5nZXQoInRlc3QiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0VHJhdmVyc2Vyc0FmdGVyU2h1ZmZsZS5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1RyYXZlcnNhbEV4cGxhbmF0aW9uVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC91dGlsL1RyYXZlcnNhbEV4cGxhbmF0aW9uVGVzdC5qYXZhCmluZGV4IDBhODEyMzguLjg5YTM3ZDUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvdXRpbC9UcmF2ZXJzYWxFeHBsYW5hdGlvblRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3V0aWwvVHJhdmVyc2FsRXhwbGFuYXRpb25UZXN0LmphdmEKQEAgLTEzMCw4ICsxMzAsOSBAQAogICAgICAgICB9CiAgICAgICAgIGFzc2VydEVxdWFscyg0LCBmb3VuZCk7CiAgICAgICAgIC8vCisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHRyYXZlcnNhbC5leHBsYWluKCkucHJldHR5UHJpbnQoMTYwKSk7CiAgICAgICAgIGZvdW5kID0gMDsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbGluZSA6IHRyYXZlcnNhbC5leHBsYWluKCkucHJldHR5UHJpbnQoMTU4KS5zcGxpdCgiXVxuIikpIHsgLy8gbmVlZCB0byBzcGxpdCBjYXVzZSBvZiB3b3JkIHdyYXAKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbGluZSA6IHRyYXZlcnNhbC5leHBsYWluKCkucHJldHR5UHJpbnQoMTcwKS5zcGxpdCgiXVxuIikpIHsgLy8gbmVlZCB0byBzcGxpdCBjYXVzZSBvZiB3b3JkIHdyYXAKICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKCJJbmNpZGVudFRvQWRqYWNlbnRTdHJhdGVneSIpICYmIGxpbmUuY29udGFpbnMoIltWZXJ0ZXhTdGVwKElOLHZlcnRleCkiKSkKICAgICAgICAgICAgICAgICBmb3VuZCsrOwogICAgICAgICAgICAgaWYgKGxpbmUuY29udGFpbnMoIkluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5IikgJiYgbGluZS5jb250YWlucygiW1ZlcnRleFN0ZXAoT1VULHZlcnRleCkiKSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vR3J5b1Bvb2xUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9Qb29sVGVzdC5qYXZhCmluZGV4IGY5MDI5YmIuLmFhZGVkMDcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vR3J5b1Bvb2xUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9HcnlvUG9vbFRlc3QuamF2YQpAQCAtMTgsOCArMTgsOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyeW87CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuY29udmVydC5MZWdhY3lMaXN0RGVsaW1pdGVySGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5Jb1JlZ2lzdHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLklvWDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5Jb1hJb1JlZ2lzdHJ5OwpAQCAtMTAzLDYgKzEwNCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRDb25maWdQb29sT25Db25zdHJ1Y3Rpb25XaXRoTXVsdGlwbGVDdXN0b21Jb1JlZ2lzdHJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7CisgICAgICAgICgoQmFzZUNvbmZpZ3VyYXRpb24pIGNvbmYpLnNldExpc3REZWxpbWl0ZXJIYW5kbGVyKG5ldyBMZWdhY3lMaXN0RGVsaW1pdGVySGFuZGxlcignLCcpKTsKICAgICAgICAgY29uZi5zZXRQcm9wZXJ0eShJb1JlZ2lzdHJ5LklPX1JFR0lTVFJZLAogICAgICAgICAgICAgICAgIElvWElvUmVnaXN0cnkuSW5zdGFuY2VCYXNlZC5jbGFzcy5nZXROYW1lKCkgKyAiLCIgKyBJb1lJb1JlZ2lzdHJ5Lkluc3RhbmNlQmFzZWQuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgZmluYWwgR3J5b1Bvb2wgcG9vbCA9IEdyeW9Qb29sLmJ1aWxkKCkuaW9SZWdpc3RyaWVzKGNvbmYuZ2V0TGlzdChJb1JlZ2lzdHJ5LklPX1JFR0lTVFJZLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpLmNyZWF0ZSgpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9FbGVtZW50SGVscGVyVGVzdC5qYXZhIGIvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9FbGVtZW50SGVscGVyVGVzdC5qYXZhCmluZGV4IDYzNjg1OWQuLmU5YjA2NmQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL3V0aWwvRWxlbWVudEhlbHBlclRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0VsZW1lbnRIZWxwZXJUZXN0LmphdmEKQEAgLTU0LDEzICs1NCw4IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRWYWxpZGF0ZVByb3BlcnR5QW5kTm90QWxsb3dOdWxsVmFsdWUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFbGVtZW50SGVscGVyLnZhbGlkYXRlUHJvcGVydHkoInRlc3QiLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBmYWlsIGFzIHByb3BlcnR5IHZhbHVlIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9wZXJ0eS5FeGNlcHRpb25zLnByb3BlcnR5VmFsdWVDYW5Ob3RCZU51bGwoKS5nZXRNZXNzYWdlKCksIGlhZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgc2hvdWxkVmFsaWRhdGVQcm9wZXJ0eUFuZEFsbG93TnVsbFZhbHVlKCkgeworICAgICAgICBFbGVtZW50SGVscGVyLnZhbGlkYXRlUHJvcGVydHkoInRlc3QiLCBudWxsKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTI1LDE1ICsxMjAsNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkTm90QWxsb3dFdmVuTnVtYmVyT2ZLZXlWYWx1ZXNBbmRJbnZhbGlkVmFsdWVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRWxlbWVudEhlbHBlci5sZWdhbFByb3BlcnR5S2V5VmFsdWVBcnJheSgiYUtleSIsICJ0ZXN0IiwgInZhbHVlLWZvci10aGlzLW9uZSIsIDEsICIxIiwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcm9wZXJ0eS5FeGNlcHRpb25zLnByb3BlcnR5VmFsdWVDYW5Ob3RCZU51bGwoKS5nZXRNZXNzYWdlKCksIGlhZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRGaW5kVGhlSWRWYWx1ZUFsb25lKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoMTIzbCwgRWxlbWVudEhlbHBlci5nZXRJZFZhbHVlKFQuaWQsIDEyM2wpLmdldCgpKTsKICAgICB9CkBAIC0xNDgsOSArMTM0LDkgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoRWxlbWVudEhlbHBlci5nZXRJZFZhbHVlKCJ0ZXN0IiwgMzIxLCAieHl6IiwgMTIzbCwgInRlc3RhZ2FpbiIsICJ0aGF0IikuaXNQcmVzZW50KCkpOwogICAgIH0KIAotICAgIEBUZXN0KGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RGaW5kQW5JZFZhbHVlQmVjYXVzZUl0SXNOdWxsKCkgewotICAgICAgICBFbGVtZW50SGVscGVyLmdldElkVmFsdWUoInRlc3QiLCAzMjEsIFQuaWQsIG51bGwsICJ0ZXN0YWdhaW4iLCAidGhhdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmF1bHQiLCBFbGVtZW50SGVscGVyLmdldElkVmFsdWUoInRlc3QiLCAzMjEsIFQuaWQsIG51bGwsICJ0ZXN0YWdhaW4iLCAidGhhdCIpLm9yRWxzZSgiZGVmYXVsdCIpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTkxLDYgKzE3NywxNSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkQXR0YWNoUHJvcGVydGllc0J1dE5vdExhYmVsc09ySWQoKSB7CiAgICAgICAgIGZpbmFsIEVsZW1lbnQgbW9ja0VsZW1lbnQgPSBtb2NrKEVsZW1lbnQuY2xhc3MpOworICAgICAgICBmaW5hbCBHcmFwaCBtb2NrR3JhcGggPSBtb2NrKEdyYXBoLmNsYXNzKTsKKyAgICAgICAgZmluYWwgR3JhcGguRmVhdHVyZXMgbW9ja0dyYXBoRmVhdHVyZXMgPSBtb2NrKEdyYXBoLkZlYXR1cmVzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMgbW9ja1ZlcnRleEZlYXR1cmVzID0gbW9jayhHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcyk7CisgICAgICAgIGZpbmFsIEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMgbW9ja1ZlcnRleFByb3BlcnR5RmVhdHVyZXMgPSBtb2NrKEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMuY2xhc3MpOworICAgICAgICB3aGVuKG1vY2tFbGVtZW50LmdyYXBoKCkpLnRoZW5SZXR1cm4obW9ja0dyYXBoKTsKKyAgICAgICAgd2hlbihtb2NrR3JhcGguZmVhdHVyZXMoKSkudGhlblJldHVybihtb2NrR3JhcGhGZWF0dXJlcyk7CisgICAgICAgIHdoZW4obW9ja0dyYXBoRmVhdHVyZXMudmVydGV4KCkpLnRoZW5SZXR1cm4obW9ja1ZlcnRleEZlYXR1cmVzKTsKKyAgICAgICAgd2hlbihtb2NrVmVydGV4RmVhdHVyZXMucHJvcGVydGllcygpKS50aGVuUmV0dXJuKG1vY2tWZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzKTsKKyAgICAgICAgd2hlbihtb2NrVmVydGV4UHJvcGVydHlGZWF0dXJlcy5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICBFbGVtZW50SGVscGVyLmF0dGFjaFByb3BlcnRpZXMobW9ja0VsZW1lbnQsICJ0ZXN0IiwgMTIzLCBULmlkLCAzMjEsIFQubGFiZWwsICJmcmllbmRzIik7CiAgICAgICAgIHZlcmlmeShtb2NrRWxlbWVudCwgdGltZXMoMSkpLnByb3BlcnR5KCJ0ZXN0IiwgMTIzKTsKICAgICAgICAgdmVyaWZ5KG1vY2tFbGVtZW50LCB0aW1lcygwKSkucHJvcGVydHkoVC5pZC5nZXRBY2Nlc3NvcigpLCAzMjEpOwpAQCAtMjAwLDYgKzE5NSwxNSBAQAogICAgIEBUZXN0KGV4cGVjdGVkID0gQ2xhc3NDYXN0RXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWxUcnlpbmdUb0F0dGFjaFByb3BlcnRpZXNOb25TdHJpbmdLZXkoKSB7CiAgICAgICAgIGZpbmFsIEVsZW1lbnQgbW9ja0VsZW1lbnQgPSBtb2NrKEVsZW1lbnQuY2xhc3MpOworICAgICAgICBmaW5hbCBHcmFwaCBtb2NrR3JhcGggPSBtb2NrKEdyYXBoLmNsYXNzKTsKKyAgICAgICAgZmluYWwgR3JhcGguRmVhdHVyZXMgbW9ja0dyYXBoRmVhdHVyZXMgPSBtb2NrKEdyYXBoLkZlYXR1cmVzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMgbW9ja1ZlcnRleEZlYXR1cmVzID0gbW9jayhHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcyk7CisgICAgICAgIGZpbmFsIEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMgbW9ja1ZlcnRleFByb3BlcnR5RmVhdHVyZXMgPSBtb2NrKEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMuY2xhc3MpOworICAgICAgICB3aGVuKG1vY2tFbGVtZW50LmdyYXBoKCkpLnRoZW5SZXR1cm4obW9ja0dyYXBoKTsKKyAgICAgICAgd2hlbihtb2NrR3JhcGguZmVhdHVyZXMoKSkudGhlblJldHVybihtb2NrR3JhcGhGZWF0dXJlcyk7CisgICAgICAgIHdoZW4obW9ja0dyYXBoRmVhdHVyZXMudmVydGV4KCkpLnRoZW5SZXR1cm4obW9ja1ZlcnRleEZlYXR1cmVzKTsKKyAgICAgICAgd2hlbihtb2NrVmVydGV4RmVhdHVyZXMucHJvcGVydGllcygpKS50aGVuUmV0dXJuKG1vY2tWZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzKTsKKyAgICAgICAgd2hlbihtb2NrVmVydGV4UHJvcGVydHlGZWF0dXJlcy5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICBFbGVtZW50SGVscGVyLmF0dGFjaFByb3BlcnRpZXMobW9ja0VsZW1lbnQsICJ0ZXN0IiwgMTIzLCAzMjEsICJ0ZXN0Iik7CiAgICAgfQogCkBAIC0yMTYsNiArMjIwLDE1IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRBdHRhY2hQcm9wZXJ0aWVzV2l0aENhcmRpbmFsaXR5QnV0Tm90TGFiZWxzT3JJZCgpIHsKICAgICAgICAgZmluYWwgVmVydGV4IG1vY2tFbGVtZW50ID0gbW9jayhWZXJ0ZXguY2xhc3MpOworICAgICAgICBmaW5hbCBHcmFwaCBtb2NrR3JhcGggPSBtb2NrKEdyYXBoLmNsYXNzKTsKKyAgICAgICAgZmluYWwgR3JhcGguRmVhdHVyZXMgbW9ja0dyYXBoRmVhdHVyZXMgPSBtb2NrKEdyYXBoLkZlYXR1cmVzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMgbW9ja1ZlcnRleEZlYXR1cmVzID0gbW9jayhHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcyk7CisgICAgICAgIGZpbmFsIEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMgbW9ja1ZlcnRleFByb3BlcnR5RmVhdHVyZXMgPSBtb2NrKEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMuY2xhc3MpOworICAgICAgICB3aGVuKG1vY2tFbGVtZW50LmdyYXBoKCkpLnRoZW5SZXR1cm4obW9ja0dyYXBoKTsKKyAgICAgICAgd2hlbihtb2NrR3JhcGguZmVhdHVyZXMoKSkudGhlblJldHVybihtb2NrR3JhcGhGZWF0dXJlcyk7CisgICAgICAgIHdoZW4obW9ja0dyYXBoRmVhdHVyZXMudmVydGV4KCkpLnRoZW5SZXR1cm4obW9ja1ZlcnRleEZlYXR1cmVzKTsKKyAgICAgICAgd2hlbihtb2NrVmVydGV4RmVhdHVyZXMucHJvcGVydGllcygpKS50aGVuUmV0dXJuKG1vY2tWZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzKTsKKyAgICAgICAgd2hlbihtb2NrVmVydGV4UHJvcGVydHlGZWF0dXJlcy5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICBFbGVtZW50SGVscGVyLmF0dGFjaFByb3BlcnRpZXMobW9ja0VsZW1lbnQsIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZSwgInRlc3QiLCAxMjMsIFQuaWQsIDMyMSwgVC5sYWJlbCwgImZyaWVuZHMiKTsKICAgICAgICAgdmVyaWZ5KG1vY2tFbGVtZW50LCB0aW1lcygxKSkucHJvcGVydHkoVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkuc2luZ2xlLCAidGVzdCIsIDEyMyk7CiAgICAgICAgIHZlcmlmeShtb2NrRWxlbWVudCwgdGltZXMoMCkpLnByb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZSwgVC5pZC5nZXRBY2Nlc3NvcigpLCAzMjEpOwpAQCAtMjI1LDYgKzIzOCwxNSBAQAogICAgIEBUZXN0KGV4cGVjdGVkID0gQ2xhc3NDYXN0RXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWxUcnlpbmdUb0F0dGFjaFByb3BlcnRpZXNXaXRoQ2FyZGluYWxpdHlOb25TdHJpbmdLZXkoKSB7CiAgICAgICAgIGZpbmFsIEVsZW1lbnQgbW9ja0VsZW1lbnQgPSBtb2NrKFZlcnRleC5jbGFzcyk7CisgICAgICAgIGZpbmFsIEdyYXBoIG1vY2tHcmFwaCA9IG1vY2soR3JhcGguY2xhc3MpOworICAgICAgICBmaW5hbCBHcmFwaC5GZWF0dXJlcyBtb2NrR3JhcGhGZWF0dXJlcyA9IG1vY2soR3JhcGguRmVhdHVyZXMuY2xhc3MpOworICAgICAgICBmaW5hbCBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcyBtb2NrVmVydGV4RmVhdHVyZXMgPSBtb2NrKEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgR3JhcGguRmVhdHVyZXMuVmVydGV4UHJvcGVydHlGZWF0dXJlcyBtb2NrVmVydGV4UHJvcGVydHlGZWF0dXJlcyA9IG1vY2soR3JhcGguRmVhdHVyZXMuVmVydGV4UHJvcGVydHlGZWF0dXJlcy5jbGFzcyk7CisgICAgICAgIHdoZW4obW9ja0VsZW1lbnQuZ3JhcGgoKSkudGhlblJldHVybihtb2NrR3JhcGgpOworICAgICAgICB3aGVuKG1vY2tHcmFwaC5mZWF0dXJlcygpKS50aGVuUmV0dXJuKG1vY2tHcmFwaEZlYXR1cmVzKTsKKyAgICAgICAgd2hlbihtb2NrR3JhcGhGZWF0dXJlcy52ZXJ0ZXgoKSkudGhlblJldHVybihtb2NrVmVydGV4RmVhdHVyZXMpOworICAgICAgICB3aGVuKG1vY2tWZXJ0ZXhGZWF0dXJlcy5wcm9wZXJ0aWVzKCkpLnRoZW5SZXR1cm4obW9ja1ZlcnRleFByb3BlcnR5RmVhdHVyZXMpOworICAgICAgICB3aGVuKG1vY2tWZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzLnN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIEVsZW1lbnRIZWxwZXIuYXR0YWNoUHJvcGVydGllcyhtb2NrRWxlbWVudCwgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkuc2luZ2xlLCAidGVzdCIsIDEyMywgMzIxLCAidGVzdCIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9HcmFwaEZhY3RvcnlUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0dyYXBoRmFjdG9yeVRlc3QuamF2YQppbmRleCA3MDFlMTU5Li40YTkzM2Q1IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0dyYXBoRmFjdG9yeVRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL0dyYXBoRmFjdG9yeVRlc3QuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkFzc2VydEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi91dGlsL1N5c3RlbVV0aWxUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvU3lzdGVtVXRpbFRlc3QuamF2YQppbmRleCBlNWRjNzA1Li4zNzA1Yjk5IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvU3lzdGVtVXRpbFRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvU3lzdGVtVXRpbFRlc3QuamF2YQpAQCAtMTksNyArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9jb25maWcvWWFtbENvbmZpZ3VyYXRpb25UZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIzZGQzLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9jb25maWcvWWFtbENvbmZpZ3VyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5jb25maWc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5EdW1wZXJPcHRpb25zOwotaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi0vKioKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFlhbWxDb25maWd1cmF0aW9uVGVzdCB7Ci0KLSAgICBAVGVzdChleHBlY3RlZCA9IENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpCi0gICAgcHVibGljIHZvaWQgc2hvdWxkVGhyb3dDb25maWd1cmF0aW9uRXhjZXB0aW9uSWZMb2FkRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgWWFtbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFlhbWxDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGNvbmZpZy5sb2FkKChSZWFkZXIpIG51bGwpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRUaHJvd0NvbmZpZ3VyYXRpb25FeGNlcHRpb25JZlNhdmVGYWlscygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBZYW1sQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgWWFtbENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgY29uZmlnLnNhdmUoKFdyaXRlcikgbnVsbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRMb2FkU2F2ZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgWWFtbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFlhbWxDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0RGF0YSA9IHRoaXMuZ2V0VGVzdElucHV0RGF0YSgpOwotICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBjb25maWcubG9hZChuZXcgU3RyaW5nUmVhZGVyKHRlc3REYXRhKSk7Ci0gICAgICAgIGNvbmZpZy5zYXZlKHdyaXRlcik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3REYXRhLCB3cml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHRlc3REYXRhID0gdGhpcy5nZXRUZXN0RGF0YSgpOwotICAgICAgICBmaW5hbCBZYW1sQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgWWFtbENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgY29uZmlnLmxvYWQobmV3IFN0cmluZ1JlYWRlcih0aGlzLmdldFRlc3RJbnB1dERhdGEoKSkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0RGF0YS5nZXQoImludGVnZXIiKSwgY29uZmlnLmdldEludCgiaW50ZWdlciIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3REYXRhLmdldCgic3RyaW5nIiksIGNvbmZpZy5nZXRTdHJpbmcoInN0cmluZyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3REYXRhLmdldCgibG9uZyIpLCBjb25maWcuZ2V0TG9uZygibG9uZyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3REYXRhLmdldCgidHJ1ZS1ib29sZWFuIiksIGNvbmZpZy5nZXRCb29sZWFuKCJ0cnVlLWJvb2xlYW4iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0RGF0YS5nZXQoImZhbHNlLWJvb2xlYW4iKSwgY29uZmlnLmdldEJvb2xlYW4oImZhbHNlLWJvb2xlYW4iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0RGF0YS5nZXQoImxpc3QiKSwgY29uZmlnLmdldExpc3QoImxpc3QuaXRlbSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3REYXRhLmdldCgiNDIiKSwgY29uZmlnLmdldFN0cmluZygiNDIiKSk7Ci0KLSAgICAgICAgZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzdWJEYXRhID0gdGhpcy5nZXRTdWJNYXAoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1YkRhdGEuZ2V0KCJzdWItc3RyaW5nIiksIGNvbmZpZy5nZXRTdHJpbmcoIm1hcC5zdWItc3RyaW5nIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0cmluZzEiLCBjb25maWcuZ2V0U3RyaW5nKCJtYXAuc3ViLWxpc3QuaXRlbSgxKS5pdGVtKDApIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkU3VwcG9ydFhNTENvbXBhdGliaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgWWFtbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFlhbWxDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGNvbmZpZy5zZXRYbWxDb21wYXRpYmlsaXR5KHRydWUpOwotICAgICAgICBjb25maWcubG9hZChuZXcgU3RyaW5nUmVhZGVyKHRoaXMuZ2V0VGVzdElucHV0RGF0YSgpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJ0ZXN0VXNlcjEtRGF0YSIsICJ0ZXN0VXNlcjItRGF0YSIpLCBjb25maWcuZ2V0TGlzdCgidXNlcnMudXNlci5pdGVtIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRlc3RJbnB1dERhdGEoKSB7Ci0gICAgICAgIGZpbmFsIER1bXBlck9wdGlvbnMgeWFtbE9wdGlvbnMgPSBuZXcgRHVtcGVyT3B0aW9ucygpOwotICAgICAgICBZYW1sIHlhbWwgPSBuZXcgWWFtbCh5YW1sT3B0aW9ucyk7Ci0KLSAgICAgICAgeWFtbE9wdGlvbnMuc2V0SW5kZW50KFlhbWxDb25maWd1cmF0aW9uLkRFRkFVTFRfSURFTlQpOwotICAgICAgICB5YW1sT3B0aW9ucy5zZXREZWZhdWx0Rmxvd1N0eWxlKER1bXBlck9wdGlvbnMuRmxvd1N0eWxlLkJMT0NLKTsKLQotICAgICAgICByZXR1cm4geWFtbC5kdW1wKHRoaXMuZ2V0VGVzdERhdGEoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBPYmplY3Q+IGdldFRlc3REYXRhKCkgewotICAgICAgICBmaW5hbCBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgcmVzdWx0LnB1dCgiaW50ZWdlciIsIEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAgICAgcmVzdWx0LnB1dCgic3RyaW5nIiwgIlN0cmluZyBWYWx1ZSIpOwotICAgICAgICByZXN1bHQucHV0KCJsb25nIiwgTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICByZXN1bHQucHV0KCJ0cnVlLWJvb2xlYW4iLCB0cnVlKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiZmFsc2UtYm9vbGVhbiIsIGZhbHNlKTsKLSAgICAgICAgcmVzdWx0LnB1dCgibGlzdCIsIEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCwgNSkpOwotICAgICAgICByZXN1bHQucHV0KCI0MiIsICJUaGUgQW5zd2VyIik7Ci0gICAgICAgIHJlc3VsdC5wdXQoIm1hcCIsIGdldFN1Yk1hcCgpKTsKLQotICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHVzZXJzID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwotICAgICAgICB1c2Vycy5wdXQoInRlc3RVc2VyMSIsIEFycmF5cy5hc0xpc3QoInRlc3RVc2VyMS1EYXRhIikpOwotICAgICAgICB1c2Vycy5wdXQoInRlc3RVc2VyMiIsIEFycmF5cy5hc0xpc3QoInRlc3RVc2VyMi1EYXRhIikpOwotICAgICAgICByZXN1bHQucHV0KCJ1c2VycyIsIHVzZXJzKTsKLQotICAgICAgICAvL3Jlc3VsdC5wdXQoInRyaWNreS1saXN0IiwgQXJyYXlzLmFzTGlzdChBcnJheXMuYXNMaXN0KEFycmF5cy5hc0xpc3QobGVhZk1hcC5rZXlTZXQoKSksIGxlYWZNYXAudmFsdWVzKCkpKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcDxPYmplY3QsIE9iamVjdD4gZ2V0U3ViTWFwKCkgewotICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHN1Yk1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLSAgICAgICAgc3ViTWFwLnB1dCgic3ViLXN0cmluZyIsICJUaGUgU3RyaW5nISIpOwotCi0gICAgICAgIGZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gbGVhZk1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLSAgICAgICAgbGVhZk1hcC5wdXQoInRlc3QiLCAidmFsdWUiKTsKLSAgICAgICAgbGVhZk1hcC5wdXQoImxvbmciLCBMb25nLk1JTl9WQUxVRSk7Ci0KLSAgICAgICAgc3ViTWFwLnB1dCgic3ViLWxpc3QiLCBBcnJheXMuYXNMaXN0KEludGVnZXIuTUlOX1ZBTFVFLCBBcnJheXMuYXNMaXN0KCJTdHJpbmcxIiwgIlN0cmluZzIiKSwgQm9vbGVhbi5UUlVFLCBsZWFmTWFwKSk7Ci0gICAgICAgIHJldHVybiBzdWJNYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi91dGlsL2l0ZXJhdG9yL0FycmF5SXRlcmF0b3JUZXN0LmphdmEgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvaXRlcmF0b3IvQXJyYXlJdGVyYXRvclRlc3QuamF2YQppbmRleCA2MGRkZDg4Li4yMjkzMjc3IDEwMDY0NAotLS0gYS9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvaXRlcmF0b3IvQXJyYXlJdGVyYXRvclRlc3QuamF2YQorKysgYi9ncmVtbGluLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvaXRlcmF0b3IvQXJyYXlJdGVyYXRvclRlc3QuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiAKIC8qKgogICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQpAQCAtNDUsNiArNDYsMjEgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoaXR0eS5oYXNOZXh0KCkpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSXRlcmF0ZUFuQXJyYXlXaXRoTnVsbCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gYXJyID0gbmV3IFN0cmluZ1szXTsKKyAgICAgICAgYXJyWzBdID0gInRlc3QxIjsKKyAgICAgICAgYXJyWzFdID0gInRlc3QyIjsKKyAgICAgICAgYXJyWzJdID0gbnVsbDsKKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IGl0dHkgPSBuZXcgQXJyYXlJdGVyYXRvcjw+KGFycik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEiLCBpdHR5Lm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDIiLCBpdHR5Lm5leHQoKSk7CisgICAgICAgIGFzc2VydE51bGwoaXR0eS5uZXh0KCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKGl0dHkuaGFzTmV4dCgpKTsKKyAgICB9CisKICAgICBAVGVzdChleHBlY3RlZCA9IEZhc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHNob3VsZFRocm93RmFzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7CiAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gaXR0eSA9IG5ldyBBcnJheUl0ZXJhdG9yPD4obmV3IFN0cmluZ1swXSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9nbHYvQW5vbnltb3VzVHJhdmVyc2FsLnRlbXBsYXRlIGIvZ3JlbWxpbi1kb3RuZXQvZ2x2L0Fub255bW91c1RyYXZlcnNhbC50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxZGU5Yy4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9nbHYvQW5vbnltb3VzVHJhdmVyc2FsLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI3JlZ2lvbiBMaWNlbnNlCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIEdyZW1saW4uTmV0LlN0cnVjdHVyZTsKLQotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAotbmFtZXNwYWNlIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgICAgQW4gYW5vbnltb3VzIDxzZWUgY3JlZj0iR3JhcGhUcmF2ZXJzYWx7U1R5cGUsIEVUeXBlfSIgLz4uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIF9fCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgU3RhcnRzIGFuIGVtcHR5IDxzZWUgY3JlZj0iR3JhcGhUcmF2ZXJzYWx7U1R5cGUsIEVUeXBlfSIgLz4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgR3JhcGhUcmF2ZXJzYWw8b2JqZWN0LCBvYmplY3Q+IFN0YXJ0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaFRyYXZlcnNhbDxvYmplY3QsIG9iamVjdD4oKTsKLSAgICAgICAgfQotPCUgYW5vblN0ZXBNZXRob2RzLmVhY2ggeyBtZXRob2QgLT4gJT4KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIFNwYXducyBhIDxzZWUgY3JlZj0iR3JhcGhUcmF2ZXJzYWx7U1R5cGUsIEVUeXBlfSIgLz4gYW5kIGFkZHMgdGhlIDwlPSBtZXRob2QubWV0aG9kTmFtZSAlPiBzdGVwIHRvIHRoYXQgdHJhdmVyc2FsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIEdyYXBoVHJhdmVyc2FsPG9iamVjdCwgPCU9IG1ldGhvZC50MiAlPj4gPCU9IHRvQ1NoYXJwTWV0aG9kTmFtZS5jYWxsKG1ldGhvZC5tZXRob2ROYW1lKSAlPjwlPSBtZXRob2QudFBhcmFtICU+KDwlPSBtZXRob2QucGFyYW1ldGVycyAlPikKLSAgICAgICAgewotICAgICAgICA8JSAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzLmNvbnRhaW5zKCJwYXJhbXMgIikpIHsKLSAgICAgICU+ICAgIHJldHVybiA8JT0gbWV0aG9kLnBhcmFtTmFtZXMubGFzdCgpICU+Lkxlbmd0aCA9PSAwCi0gICAgICAgICAgICAgICAgPyBuZXcgR3JhcGhUcmF2ZXJzYWw8b2JqZWN0LCA8JT0gbWV0aG9kLmdyYXBoVHJhdmVyc2FsVDIgJT4+KCkuPCU9IHRvQ1NoYXJwTWV0aG9kTmFtZS5jYWxsKG1ldGhvZC5tZXRob2ROYW1lKSAlPjwlPSBtZXRob2QuY2FsbEdlbmVyaWNUeXBlQXJnICU+KDwlPSBtZXRob2QucGFyYW1OYW1lcy5pbml0KCkuam9pbigiLCAiKSAlPikKLSAgICAgICAgICAgICAgICA6IG5ldyBHcmFwaFRyYXZlcnNhbDxvYmplY3QsIDwlPSBtZXRob2QuZ3JhcGhUcmF2ZXJzYWxUMiAlPj4oKS48JT0gdG9DU2hhcnBNZXRob2ROYW1lLmNhbGwobWV0aG9kLm1ldGhvZE5hbWUpICU+PCU9IG1ldGhvZC5jYWxsR2VuZXJpY1R5cGVBcmcgJT4oPCU9IG1ldGhvZC5wYXJhbU5hbWVzLmpvaW4oIiwgIikgJT4pOzwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICU+ICAgIHJldHVybiBuZXcgR3JhcGhUcmF2ZXJzYWw8b2JqZWN0LCA8JT0gbWV0aG9kLmdyYXBoVHJhdmVyc2FsVDIgJT4+KCkuPCU9IHRvQ1NoYXJwTWV0aG9kTmFtZS5jYWxsKG1ldGhvZC5tZXRob2ROYW1lKSAlPjwlPSBtZXRob2QuY2FsbEdlbmVyaWNUeXBlQXJnICU+KDwlPSBtZXRob2QucGFyYW1OYW1lcy5qb2luKCIsICIpICU+KTs8JQotICAgICAgICAgICAgfSAlPiAgICAgICAgICAgIAotICAgICAgICB9Ci08JSB9ICU+Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L2dsdi9FbnVtLnRlbXBsYXRlIGIvZ3JlbWxpbi1kb3RuZXQvZ2x2L0VudW0udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODVjZDAuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvZ2x2L0VudW0udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jcmVnaW9uIExpY2Vuc2UKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZW5kcmVnaW9uCi0KLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotCi1uYW1lc3BhY2UgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWwKLXsKLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEKLQotICAgIHB1YmxpYyBjbGFzcyA8JT0gZW51bUNsYXNzLnNpbXBsZU5hbWUgJT4gOiA8JT0gaW1wbGVtZW50ZWRUeXBlcyAlPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSA8JT0gZW51bUNsYXNzLnNpbXBsZU5hbWUgJT4oc3RyaW5nIGVudW1WYWx1ZSkKLSAgICAgICAgICAgIDogYmFzZSgiPCU9IGVudW1DbGFzcy5zaW1wbGVOYW1lICU+IiwgZW51bVZhbHVlKQotICAgICAgICB7Ci0gICAgICAgIH0KLTwlCi0gICAgZGVmIHRvQ1NoYXJwTmFtZSA9IHsgZW51bUNsYXNzLCBpdGVtTmFtZSAtPgotICAgICAgICBpZiAoZW51bUNsYXNzLmVxdWFscyhkaXJlY3Rpb25DbGFzcykpIHsKLSAgICAgICAgICAgIGl0ZW1OYW1lID0gaXRlbU5hbWUudG9Mb3dlckNhc2UoKQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGl0ZW1OYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgaXRlbU5hbWUuc3Vic3RyaW5nKDEpCi0gICAgfQotICAgIGNvbnN0YW50cy5lYWNoIHsgdmFsdWUgLT4gJT4KLSAgICAgICAgcHVibGljIHN0YXRpYyAke2VudW1DbGFzcy5zaW1wbGVOYW1lfSAke3RvQ1NoYXJwTmFtZShlbnVtQ2xhc3MsIHZhbHVlLm5hbWUoKSl9ID0+IG5ldyAke2VudW1DbGFzcy5zaW1wbGVOYW1lfSgiJHt2YWx1ZS5uYW1lKCl9Iik7Ci08JSAgfSU+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElEaWN0aW9uYXJ5PHN0cmluZywgPCU9IGVudW1DbGFzcy5zaW1wbGVOYW1lICU+PiBQcm9wZXJ0aWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCA8JT0gZW51bUNsYXNzLnNpbXBsZU5hbWUgJT4+Ci0gICAgICAgIHs8JSAgY29uc3RhbnRzLmVhY2ggeyB2YWx1ZSAtPiAlPgotICAgICAgICAgICAgeyAiJHt2YWx1ZS5uYW1lKCl9IiwgJHt0b0NTaGFycE5hbWUoZW51bUNsYXNzLCB2YWx1ZS5uYW1lKCkpfSB9LDwlICB9JT4KLSAgICAgICAgfTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIHRoZSA8JT0gZW51bUNsYXNzLnNpbXBsZU5hbWUgJT4gZW51bWVyYXRpb24gYnkgdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgPCU9IGVudW1DbGFzcy5zaW1wbGVOYW1lICU+IEdldEJ5VmFsdWUoc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIVByb3BlcnRpZXMuVHJ5R2V0VmFsdWUodmFsdWUsIG91dCB2YXIgcHJvcGVydHkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihcJCJObyBtYXRjaGluZyA8JT0gZW51bUNsYXNzLnNpbXBsZU5hbWUlPiBmb3IgdmFsdWUgJ3t2YWx1ZX0nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgMTU5MQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L2dsdi9HcmFwaFRyYXZlcnNhbC50ZW1wbGF0ZSBiL2dyZW1saW4tZG90bmV0L2dsdi9HcmFwaFRyYXZlcnNhbC50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwOTY4ZC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9nbHYvR3JhcGhUcmF2ZXJzYWwudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0jcmVnaW9uIExpY2Vuc2UKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBHcmVtbGluLk5ldC5TdHJ1Y3R1cmU7Ci0KLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKLW5hbWVzcGFjZSBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gICAgIEdyYXBoIHRyYXZlcnNhbHMgYXJlIHRoZSBwcmltYXJ5IHdheSBpbiB3aGljaCBncmFwaHMgYXJlIHByb2Nlc3NlZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBHcmFwaFRyYXZlcnNhbDxTLCBFPiA6IERlZmF1bHRUcmF2ZXJzYWw8UywgRT4KLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJHcmFwaFRyYXZlcnNhbHtTVHlwZSwgRVR5cGV9IiAvPiBjbGFzcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgTGlzdDxJVHJhdmVyc2FsU3RyYXRlZ3k+KCksIG5ldyBCeXRlY29kZSgpKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iR3JhcGhUcmF2ZXJzYWx7U1R5cGUsIEVUeXBlfSIgLz4gY2xhc3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHJhdmVyc2FsU3RyYXRlZ2llcyI+VGhlIHRyYXZlcnNhbCBzdHJhdGVnaWVzIHRvIGJlIHVzZWQgYnkgdGhpcyBncmFwaCB0cmF2ZXJzYWwgYXQgZXZhbHVhdGlvbiB0aW1lLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnl0ZWNvZGUiPlRoZSA8c2VlIGNyZWY9IkJ5dGVjb2RlIiAvPiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIGdyYXBoIHRyYXZlcnNhbC48L3BhcmFtPgotICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWwoSUNvbGxlY3Rpb248SVRyYXZlcnNhbFN0cmF0ZWd5PiB0cmF2ZXJzYWxTdHJhdGVnaWVzLCBCeXRlY29kZSBieXRlY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ2llcyA9IHRyYXZlcnNhbFN0cmF0ZWdpZXM7Ci0gICAgICAgICAgICBCeXRlY29kZSA9IGJ5dGVjb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgR3JhcGhUcmF2ZXJzYWw8UzIsIEUyPiBXcmFwPFMyLCBFMj4oR3JhcGhUcmF2ZXJzYWw8UywgRT4gdHJhdmVyc2FsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHlwZW9mKFMyKSA9PSB0eXBlb2YoUykgJiYgdHlwZW9mKEUyKSA9PSB0eXBlb2YoRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRyYXZlcnNhbCBhcyBHcmFwaFRyYXZlcnNhbDxTMiwgRTI+OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTmV3IHdyYXBwZXIKLSAgICAgICAgICAgIHJldHVybiBuZXcgR3JhcGhUcmF2ZXJzYWw8UzIsIEUyPih0cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ2llcywgdHJhdmVyc2FsLkJ5dGVjb2RlKTsKLSAgICAgICAgfQotCi08JSBncmFwaFN0ZXBNZXRob2RzLmVhY2ggeyBtZXRob2QgLT4gJT4KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEFkZHMgdGhlIDwlPSBtZXRob2QubWV0aG9kTmFtZSAlPiBzdGVwIHRvIHRoaXMgPHNlZSBjcmVmPSJHcmFwaFRyYXZlcnNhbHtTVHlwZSwgRVR5cGV9IiAvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsPCRtZXRob2QudDEsICRtZXRob2QudDI+IDwlPSB0b0NTaGFycE1ldGhvZE5hbWUuY2FsbChtZXRob2QubWV0aG9kTmFtZSkgJT48JT0gbWV0aG9kLnRQYXJhbSAlPiAoPCU9IG1ldGhvZC5wYXJhbWV0ZXJzICU+KQotICAgICAgICB7Ci0gICAgICAgIDwlICBpZiAobWV0aG9kLnBhcmFtZXRlcnMuY29udGFpbnMoInBhcmFtcyAiKSkgewotICAgICAgJT4gICAgdmFyIGFyZ3MgPSBuZXcgTGlzdDxvYmplY3Q+KDwlPSBtZXRob2QucGFyYW1OYW1lcy5pbml0KCkuc2l6ZSgpICU+ICsgPCU9IG1ldGhvZC5wYXJhbU5hbWVzLmxhc3QoKSAlPi5MZW5ndGgpIHs8JT0gbWV0aG9kLnBhcmFtTmFtZXMuaW5pdCgpLmpvaW4oIiwgIikgJT59OwotICAgICAgICAgICAgYXJncy5BZGRSYW5nZSg8JT0gbWV0aG9kLnBhcmFtTmFtZXMubGFzdCgpICU+PCUgaWYgKG1ldGhvZC5pc0FyZ3NDYXN0TmVjZXNzYXJ5KSB7ICU+LkNhc3Q8b2JqZWN0PigpPCUgfSAlPik7Ci0gICAgICAgICAgICBCeXRlY29kZS5BZGRTdGVwKCI8JT0gbWV0aG9kLm1ldGhvZE5hbWUgJT4iLCBhcmdzLlRvQXJyYXkoKSk7PCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgJT4gICAgQnl0ZWNvZGUuQWRkU3RlcCgiPCU9IG1ldGhvZC5tZXRob2ROYW1lICU+IjwlIGlmIChtZXRob2QucGFyYW1ldGVycykgb3V0IDw8ICcsICcrIG1ldGhvZC5wYXJhbU5hbWVzLmpvaW4oIiwgIikgJT4pOzwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICAgICAgICByZXR1cm4gV3JhcDwkbWV0aG9kLnQxLCAkbWV0aG9kLnQyPih0aGlzKTsKLSAgICAgICAgfQotPCUgfSAlPgotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1ha2UgYSBjb3B5IG9mIGEgdHJhdmVyc2FsIHRoYXQgaXMgcmVzZXQgZm9yIGl0ZXJhdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsPFMsIEU+IENsb25lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaFRyYXZlcnNhbDxTLCBFPihUcmF2ZXJzYWxTdHJhdGVnaWVzLCBuZXcgQnl0ZWNvZGUoQnl0ZWNvZGUpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9nbHYvR3JhcGhUcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUgYi9ncmVtbGluLWRvdG5ldC9nbHYvR3JhcGhUcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDkzZTUuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvZ2x2L0dyYXBoVHJhdmVyc2FsU291cmNlLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLSNyZWdpb24gTGljZW5zZQotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIEdyZW1saW4uTmV0LlByb2Nlc3MuUmVtb3RlOwotdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWwuU3RyYXRlZ3kuRGVjb3JhdGlvbjsKLXVzaW5nIEdyZW1saW4uTmV0LlN0cnVjdHVyZTsKLQotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAotbmFtZXNwYWNlIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsCi17Ci0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICAgICBBIDxzZWUgY3JlZj0iR3JhcGhUcmF2ZXJzYWxTb3VyY2UiIC8+IGlzIHRoZSBwcmltYXJ5IERTTCBvZiB0aGUgR3JlbWxpbiB0cmF2ZXJzYWwgbWFjaGluZS4KLSAgICAvLy8gICAgIEl0IHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlIGNvbmZpZ3VyYXRpb25zIGFuZCBzdGVwcyBmb3IgVHVyaW5nIGNvbXBsZXRlIGdyYXBoIGNvbXB1dGluZy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBHcmFwaFRyYXZlcnNhbFNvdXJjZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEdldHMgb3Igc2V0cyB0aGUgdHJhdmVyc2FsIHN0cmF0ZWdpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZ3JhcGggdHJhdmVyc2FsIHNvdXJjZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIElDb2xsZWN0aW9uPElUcmF2ZXJzYWxTdHJhdGVneT4gVHJhdmVyc2FsU3RyYXRlZ2llcyB7IGdldDsgc2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEdldHMgb3Igc2V0cyB0aGUgPHNlZSBjcmVmPSJUcmF2ZXJzYWwuQnl0ZWNvZGUiIC8+IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIGdyYXBoIHRyYXZlcnNhbAotICAgICAgICAvLy8gICAgIHNvdXJjZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEJ5dGVjb2RlIEJ5dGVjb2RlIHsgZ2V0OyBzZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iR3JhcGhUcmF2ZXJzYWxTb3VyY2UiIC8+IGNsYXNzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWxTb3VyY2UoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBMaXN0PElUcmF2ZXJzYWxTdHJhdGVneT4oKSwgbmV3IEJ5dGVjb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJHcmFwaFRyYXZlcnNhbFNvdXJjZSIgLz4gY2xhc3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHJhdmVyc2FsU3RyYXRlZ2llcyI+VGhlIHRyYXZlcnNhbCBzdHJhdGVnaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyYXBoIHRyYXZlcnNhbCBzb3VyY2UuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJieXRlY29kZSI+Ci0gICAgICAgIC8vLyAgICAgVGhlIDxzZWUgY3JlZj0iVHJhdmVyc2FsLkJ5dGVjb2RlIiAvPiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBncmFwaCB0cmF2ZXJzYWwKLSAgICAgICAgLy8vICAgICBzb3VyY2UuCi0gICAgICAgIC8vLyA8L3BhcmFtPgotICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWxTb3VyY2UoSUNvbGxlY3Rpb248SVRyYXZlcnNhbFN0cmF0ZWd5PiB0cmF2ZXJzYWxTdHJhdGVnaWVzLCBCeXRlY29kZSBieXRlY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ2llcyA9IHRyYXZlcnNhbFN0cmF0ZWdpZXM7Ci0gICAgICAgICAgICBCeXRlY29kZSA9IGJ5dGVjb2RlOwotICAgICAgICB9Ci0KLTwlIHNvdXJjZVN0ZXBNZXRob2RzLmVhY2h7IG1ldGhvZCAtPiAlPgotICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgPCU9IHRvQ1NoYXJwTWV0aG9kTmFtZS5jYWxsKG1ldGhvZC5tZXRob2ROYW1lKSAlPig8JT0gbWV0aG9kLnBhcmFtZXRlcnMgJT4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzb3VyY2UgPSBuZXcgR3JhcGhUcmF2ZXJzYWxTb3VyY2UobmV3IExpc3Q8SVRyYXZlcnNhbFN0cmF0ZWd5PihUcmF2ZXJzYWxTdHJhdGVnaWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVjb2RlKEJ5dGVjb2RlKSk7Ci0gICAgICAgICAgICA8JSAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzLmNvbnRhaW5zKCJwYXJhbXMgIikpIHsKLSAgICAgICAgICAlPnZhciBhcmdzID0gbmV3IExpc3Q8b2JqZWN0Pig8JT0gbWV0aG9kLnBhcmFtTmFtZXMuaW5pdCgpLnNpemUoKSAlPiArIDwlPSBtZXRob2QucGFyYW1OYW1lcy5sYXN0KCkgJT4uTGVuZ3RoKSB7PCU9IG1ldGhvZC5wYXJhbU5hbWVzLmluaXQoKS5qb2luKCIsICIpICU+fTsKLSAgICAgICAgICAgIGFyZ3MuQWRkUmFuZ2UoPCU9IG1ldGhvZC5wYXJhbU5hbWVzLmxhc3QoKSAlPik7Ci0gICAgICAgICAgICBzb3VyY2UuQnl0ZWNvZGUuQWRkU291cmNlKCI8JT0gbWV0aG9kLm1ldGhvZE5hbWUgJT4iLCBhcmdzLlRvQXJyYXkoKSk7PCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICU+c291cmNlLkJ5dGVjb2RlLkFkZFNvdXJjZSgiPCU9IG1ldGhvZC5tZXRob2ROYW1lICU+IjwlIGlmIChtZXRob2QucGFyYW1ldGVycykgb3V0IDw8ICcsICcrIG1ldGhvZC5wYXJhbU5hbWVzLmpvaW4oIiwgIikgJT4pOzwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlOwotICAgICAgICB9Ci08JSB9ICU+Ci0gICAgICAgIFtPYnNvbGV0ZSgiVXNlIHRoZSBCaW5kaW5ncyBjbGFzcyBpbnN0ZWFkLiIsIGZhbHNlKV0KLSAgICAgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsU291cmNlIFdpdGhCaW5kaW5ncyhvYmplY3QgYmluZGluZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIENvbmZpZ3VyZXMgdGhlIDxzZWUgY3JlZj0iR3JhcGhUcmF2ZXJzYWxTb3VyY2UiIC8+IGFzIGEgInJlbW90ZSIgdG8gaXNzdWUgdGhlCi0gICAgICAgIC8vLyAgICAgPHNlZSBjcmVmPSJHcmFwaFRyYXZlcnNhbHtTVHlwZSwgRVR5cGV9IiAvPiBmb3IgZXhlY3V0aW9uIGVsc2V3aGVyZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZW1vdGVDb25uZWN0aW9uIj4KLSAgICAgICAgLy8vICAgICBUaGUgPHNlZSBjcmVmPSJJUmVtb3RlQ29ubmVjdGlvbiIgLz4gaW5zdGFuY2UgdG8gdXNlIHRvIHN1Ym1pdCB0aGUKLSAgICAgICAgLy8vICAgICA8c2VlIGNyZWY9IkdyYXBoVHJhdmVyc2Fse1NUeXBlLCBFVHlwZX0iIC8+LgotICAgICAgICAvLy8gPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJHcmFwaFRyYXZlcnNhbFNvdXJjZSIgLz4gY29uZmlndXJlZCB0byB1c2UgdGhlIHByb3ZpZGVkIDxzZWUgY3JlZj0iSVJlbW90ZUNvbm5lY3Rpb24iIC8+LjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsU291cmNlIFdpdGhSZW1vdGUoSVJlbW90ZUNvbm5lY3Rpb24gcmVtb3RlQ29ubmVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNvdXJjZSA9IG5ldyBHcmFwaFRyYXZlcnNhbFNvdXJjZShuZXcgTGlzdDxJVHJhdmVyc2FsU3RyYXRlZ3k+KFRyYXZlcnNhbFN0cmF0ZWdpZXMpLAotICAgICAgICAgICAgICAgIG5ldyBCeXRlY29kZShCeXRlY29kZSkpOwotICAgICAgICAgICAgc291cmNlLlRyYXZlcnNhbFN0cmF0ZWdpZXMuQWRkKG5ldyBSZW1vdGVTdHJhdGVneShyZW1vdGVDb25uZWN0aW9uKSk7Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEFkZCBhIEdyYXBoQ29tcHV0ZXIgY2xhc3MgdXNlZCB0byBleGVjdXRlIHRoZSB0cmF2ZXJzYWwuCi0gICAgICAgIC8vLyAgICAgVGhpcyBhZGRzIGEgPHNlZSBjcmVmPSJWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3kiIC8+IHRvIHRoZSBzdHJhdGVnaWVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgV2l0aENvbXB1dGVyKHN0cmluZyBncmFwaENvbXB1dGVyID0gbnVsbCwgaW50PyB3b3JrZXJzID0gbnVsbCwgc3RyaW5nIHBlcnNpc3QgPSBudWxsLAotICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9IG51bGwsIElUcmF2ZXJzYWwgdmVydGljZXMgPSBudWxsLCBJVHJhdmVyc2FsIGVkZ2VzID0gbnVsbCwKLSAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBkeW5hbWljPiBjb25maWd1cmF0aW9uID0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFdpdGhTdHJhdGVnaWVzKG5ldyBWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3koZ3JhcGhDb21wdXRlciwgd29ya2VycywgcGVyc2lzdCwgcmVzdWx0LCB2ZXJ0aWNlcywgZWRnZXMsIGNvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgfQotCi08JSBzb3VyY2VTcGF3bk1ldGhvZHMuZWFjaCB7IG1ldGhvZCAtPiAlPgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgU3Bhd25zIGEgPHNlZSBjcmVmPSJHcmFwaFRyYXZlcnNhbHtTVHlwZSwgRVR5cGV9IiAvPiBvZmYgdGhpcyBncmFwaCB0cmF2ZXJzYWwgc291cmNlIGFuZCBhZGRzIHRoZSA8JT0gbWV0aG9kLm1ldGhvZE5hbWUgJT4gc3RlcCB0byB0aGF0Ci0gICAgICAgIC8vLyAgICAgdHJhdmVyc2FsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWw8JG1ldGhvZC50MSwgJG1ldGhvZC50Mj4gPCU9IHRvQ1NoYXJwTWV0aG9kTmFtZS5jYWxsKG1ldGhvZC5tZXRob2ROYW1lKSAlPjwlPSBtZXRob2QudFBhcmFtICU+KDwlPSBtZXRob2QucGFyYW1ldGVycyAlPikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRyYXZlcnNhbCA9IG5ldyBHcmFwaFRyYXZlcnNhbDwkbWV0aG9kLnQxLCAkbWV0aG9kLnQyPihUcmF2ZXJzYWxTdHJhdGVnaWVzLCBuZXcgQnl0ZWNvZGUoQnl0ZWNvZGUpKTsKLSAgICAgICAgICAgIDwlICBpZiAobWV0aG9kLnBhcmFtZXRlcnMuY29udGFpbnMoInBhcmFtcyAiKSkgewotICAgICAgICAgICU+dmFyIGFyZ3MgPSBuZXcgTGlzdDxvYmplY3Q+KDwlPSBtZXRob2QucGFyYW1OYW1lcy5pbml0KCkuc2l6ZSgpICU+ICsgPCU9IG1ldGhvZC5wYXJhbU5hbWVzLmxhc3QoKSAlPi5MZW5ndGgpIHs8JT0gbWV0aG9kLnBhcmFtTmFtZXMuaW5pdCgpLmpvaW4oIiwgIikgJT59OwotICAgICAgICAgICAgYXJncy5BZGRSYW5nZSg8JT0gbWV0aG9kLnBhcmFtTmFtZXMubGFzdCgpICU+PCUgaWYgKG1ldGhvZC5pc0FyZ3NDYXN0TmVjZXNzYXJ5KSB7ICU+LkNhc3Q8b2JqZWN0PigpPCUgfSAlPik7Ci0gICAgICAgICAgICB0cmF2ZXJzYWwuQnl0ZWNvZGUuQWRkU3RlcCgiPCU9IG1ldGhvZC5tZXRob2ROYW1lICU+IiwgYXJncy5Ub0FycmF5KCkpOzwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICU+ICAgIHRyYXZlcnNhbC5CeXRlY29kZS5BZGRTdGVwKCI8JT0gbWV0aG9kLm1ldGhvZE5hbWUgJT4iPCUgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzKSBvdXQgPDwgJywgJysgbWV0aG9kLnBhcmFtTmFtZXMuam9pbigiLCAiKSAlPik7PCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgJT4KLSAgICAgICAgICAgIHJldHVybiB0cmF2ZXJzYWw7Ci0gICAgICAgIH0KLTwlIH0gJT4KLSAgICB9Ci0gICAgCi0jcHJhZ21hIHdhcm5pbmcgcmVzdG9yZSAxNTkxCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvZ2x2L0dyZW1saW4uTmV0LlRlbXBsYXRlLmNzcHJvai50ZW1wbGF0ZSBiL2dyZW1saW4tZG90bmV0L2dsdi9HcmVtbGluLk5ldC5UZW1wbGF0ZS5jc3Byb2oudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjk0ZjYuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvZ2x2L0dyZW1saW4uTmV0LlRlbXBsYXRlLmNzcHJvai50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwgLS0+Ci08UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KLQotICA8UHJvcGVydHlHcm91cD4KLSAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+Ci0gICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMy4xPC9UYXJnZXRGcmFtZXdvcms+Ci0gIDwvUHJvcGVydHlHcm91cD4KLQotICA8SXRlbUdyb3VwPgotICAgIDwhLS0gV2UgbmVlZCBib3RoIHJlZmVyZW5jZSBlbGVtZW50cyB1bnRpbCB0aGlzIGlzIHJlc29sdmVkOiBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L3Nkay9pc3N1ZXMvMTE1MSAtLT4KLSAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi9HcmVtbGluLk5ldC9HcmVtbGluLk5ldC5jc3Byb2oiIC8+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iR3JlbWxpbi5OZXQiIFZlcnNpb249IiRwcm9qZWN0VmVyc2lvbiIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0KLTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L2dsdi9HcmVtbGluLk5ldC5UZW1wbGF0ZS5udXNwZWMudGVtcGxhdGUgYi9ncmVtbGluLWRvdG5ldC9nbHYvR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzc2NjNiLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tZG90bmV0L2dsdi9HcmVtbGluLk5ldC5UZW1wbGF0ZS5udXNwZWMudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHBhY2thZ2UgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vcGFja2FnaW5nLzIwMTAvMDcvbnVzcGVjLnhzZCI+Ci0gICAgPG1ldGFkYXRhPgotICAgICAgICA8aWQ+R3JlbWxpbi5OZXQuVGVtcGxhdGU8L2lkPgotICAgICAgICA8dGl0bGU+R3JlbWxpbi5OZXQgVGVtcGxhdGU8L3RpdGxlPgotICAgICAgICA8dmVyc2lvbj4kcHJvamVjdFZlcnNpb248L3ZlcnNpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HcmVtbGluLk5ldCB0ZW1wbGF0ZSB0byBjcmVhdGUgYSBjb25zb2xlIGFwcGxpY2F0aW9uIHdpdGggZG90bmV0IG5ldy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8YXV0aG9ycz5BcGFjaGUgVGlua2VyUG9wPC9hdXRob3JzPgotICAgICAgICA8bGljZW5zZSB0eXBlPSJleHByZXNzaW9uIj5BcGFjaGUtMi4wPC9saWNlbnNlPgotICAgICAgICA8cHJvamVjdFVybD5odHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmc8L3Byb2plY3RVcmw+Ci0gICAgICAgIDx0YWdzPlRpbmtlclBvcCBHcmVtbGluIEdyZW1saW4uTmV0PC90YWdzPgotICAgICAgICA8cGFja2FnZVR5cGVzPgotICAgICAgICAgICAgPHBhY2thZ2VUeXBlIG5hbWU9IlRlbXBsYXRlIiAvPgotICAgICAgICA8L3BhY2thZ2VUeXBlcz4KLSAgICA8L21ldGFkYXRhPgotICAgIDxmaWxlcz4KLSAgICAgICAgPGZpbGUgc3JjPSIudGVtcGxhdGUuY29uZmlnL3RlbXBsYXRlLmpzb24iIHRhcmdldD0iY29udGVudC8udGVtcGxhdGUuY29uZmlnIiAvPgotICAgICAgICA8ZmlsZSBzcmM9IkdyZW1saW4uTmV0LlRlbXBsYXRlLmNzcHJvaiIgdGFyZ2V0PSJjb250ZW50IiAvPgotICAgICAgICA8ZmlsZSBzcmM9IiouY3MiIHRhcmdldD0iY29udGVudCIgLz4KLSAgICAgICAgPGZpbGUgc3JjPSIuLi8uLi9MSUNFTlNFIiB0YXJnZXQ9IkxJQ0VOU0UiLz4KLSAgICAgICAgPGZpbGUgc3JjPSIuLi8uLi9OT1RJQ0UiIHRhcmdldD0iTk9USUNFIi8+Ci0gICAgPC9maWxlcz4KLTwvcGFja2FnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9nbHYvR3JlbWxpbi5OZXQuY3Nwcm9qLnRlbXBsYXRlIGIvZ3JlbWxpbi1kb3RuZXQvZ2x2L0dyZW1saW4uTmV0LmNzcHJvai50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5OWE1YS4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9nbHYvR3JlbWxpbi5OZXQuY3Nwcm9qLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAgVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbCAtLT4KLTxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgotCi0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJCdWlsZCI+Ci0gICAgPFRhcmdldEZyYW1ld29ya3M+bmV0c3RhbmRhcmQxLjM7bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29ya3M+Ci0gICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+Ci0gICAgPEdlbmVyYXRlRG9jdW1lbnRhdGlvbkZpbGU+dHJ1ZTwvR2VuZXJhdGVEb2N1bWVudGF0aW9uRmlsZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotCi0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJQYWNrYWdlIj4KLSAgICA8VmVyc2lvbj4kcHJvamVjdFZlcnNpb248L1ZlcnNpb24+Ci0gICAgPEZpbGVWZXJzaW9uPjwlPSAocHJvamVjdFZlcnNpb24gPX4gLyhcZCtcLlxkK1wuXGQrKS4qLylbMF1bMV0gJT4uMDwvRmlsZVZlcnNpb24+Ci0gICAgPEFzc2VtYmx5VmVyc2lvbj48JT0gKHByb2plY3RWZXJzaW9uID1+IC8oXGQrXC5cZCspXC4qLylbMF1bMV0gJT4uMC4wPC9Bc3NlbWJseVZlcnNpb24+Ci0gICAgPFRpdGxlPkdyZW1saW4uTmV0PC9UaXRsZT4KLSAgICA8QXV0aG9ycz5BcGFjaGUgVGlua2VyUG9wPC9BdXRob3JzPgotICAgIDxEZXNjcmlwdGlvbj5HcmVtbGluLk5ldCBmb3IgQXBhY2hlIFRpbmtlclBvcOKEoiBpcyBhIGxhbmd1YWdlIHZhcmlhbnQgYW5kIGRyaXZlciBmb3IgLk5FVC4KLQotQXBhY2hlIFRpbmtlclBvcOKEoiBpcyBhIGdyYXBoIGNvbXB1dGluZyBmcmFtZXdvcmsgZm9yIGJvdGggZ3JhcGggZGF0YWJhc2VzIChPTFRQKSBhbmQgZ3JhcGggYW5hbHl0aWMgc3lzdGVtcyAoT0xBUCkuIEdyZW1saW4gaXMgdGhlIGdyYXBoIHRyYXZlcnNhbCBsYW5ndWFnZSBvZiBUaW5rZXJQb3AuIEl0IGNhbiBiZSBkZXNjcmliZWQgYXMgYSBmdW5jdGlvbmFsLCBkYXRhLWZsb3cgbGFuZ3VhZ2UgdGhhdCBlbmFibGVzIHVzZXJzIHRvIHN1Y2NpbmN0bHkgZXhwcmVzcyBjb21wbGV4IHRyYXZlcnNhbHMgb24gKG9yIHF1ZXJpZXMgb2YpIHRoZWlyIGFwcGxpY2F0aW9uJ3MgcHJvcGVydHkgZ3JhcGguCi0KLUdyZW1saW4uTmV0IGltcGxlbWVudHMgR3JlbWxpbiB3aXRoaW4gLk5FVC4gQyMgc3ludGF4IGhhcyB0aGUgc2FtZSBjb25zdHJ1Y3RzIGFzIEphdmEgaW5jbHVkaW5nICJkb3Qgbm90YXRpb24iIGZvciBmdW5jdGlvbiBjaGFpbmluZyAoYS5iLmMpLCByb3VuZCBicmFja2V0IGZ1bmN0aW9uIGFyZ3VtZW50cyAoYShiLGMpKSwgYW5kIHN1cHBvcnQgZm9yIGdsb2JhbCBuYW1lc3BhY2VzIChhKGIoKSkgdnMgYShfXy5iKCkpKS4gQXMgc3VjaCwgYW55b25lIGZhbWlsaWFyIHdpdGggR3JlbWxpbi1KYXZhIHdpbGwgaW1tZWRpYXRlbHkgYmUgYWJsZSB0byB3b3JrIHdpdGggR3JlbWxpbi5OZXQuIE1vcmVvdmVyLCB0aGVyZSBhcmUgYSBmZXcgYWRkZWQgY29uc3RydWN0cyB0byBHcmVtbGluLk5ldCB0aGF0IG1ha2UgdHJhdmVyc2FscyBhIGJpdCBtb3JlIHN1Y2NpbmN0LgotCi1HcmVtbGluLk5ldCBpcyBkZXNpZ25lZCB0byBjb25uZWN0IHRvIGEgInNlcnZlciIgdGhhdCBpcyBob3N0aW5nIGEgVGlua2VyUG9wLWVuYWJsZWQgZ3JhcGggc3lzdGVtLiBUaGF0ICJzZXJ2ZXIiIGNvdWxkIGJlIEdyZW1saW4gU2VydmVyCi0KLWh0dHBzOi8vdGlua2VycG9wLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L3JlZmVyZW5jZS8jZ3JlbWxpbi1zZXJ2ZXIKLQotb3IgYSByZW1vdGUgZ3JhcGggcHJvdmlkZXIgdGhhdCBleHBvc2VzIHByb3RvY29scyBieSB3aGljaCBHcmVtbGluLk5ldCBjYW4gY29ubmVjdC4KLQotUGxlYXNlIHNlZSB0aGUgUmVmZXJlbmNlIERvY3VtZW50YXRpb24gb2YgQXBhY2hlIFRpbmtlclBvcCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2FnZTogaHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvcmVmZXJlbmNlCi0KLWFuZCB1c2Ugb3VyIEdvb2dsZSBHcm91cCBncmVtbGluLXVzZXJzIGlmIHRoZXJlIGFyZSBhbnkgcXVlc3Rpb25zOiBodHRwczovL3MuYXBhY2hlLm9yZy9jOGhydQotCi1UaGUgR3JlbWxpbiBsYW5ndWFnZSBhbGxvd3MgdXNlcnMgdG8gd3JpdGUgaGlnaGx5IGV4cHJlc3NpdmUgZ3JhcGggdHJhdmVyc2FscyBhbmQgaGFzIGEgYnJvYWQgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBjb3ZlciBhIHdpZGUgYm9keSBvZiBmZWF0dXJlcy4gVGhlIFJlZmVyZW5jZSBEb2N1bWVudGF0aW9uIGRlc2NyaWJlcyB0aGVzZSBmdW5jdGlvbnMgYW5kIG90aGVyIGFzcGVjdHMgb2YgdGhlIFRpbmtlclBvcCBlY29zeXN0ZW0gaW5jbHVkaW5nIHNvbWUgc3BlY2lmaWNzIG9uIEdyZW1saW4gaW4gLk5FVCBpdHNlbGY6Ci0KLWh0dHBzOi8vcy5hcGFjaGUub3JnL3BnYnd1Ci0KLU1vc3Qgb2YgdGhlIGV4YW1wbGVzIGZvdW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHVzZSBHcm9vdnkgbGFuZ3VhZ2Ugc3ludGF4IGluIHRoZSBHcmVtbGluIENvbnNvbGUuIEZvciB0aGUgbW9zdCBwYXJ0LCB0aGVzZSBleGFtcGxlcyBzaG91bGQgZ2VuZXJhbGx5IHRyYW5zbGF0ZSB0byBDIyB3aXRoIHNvbWUgbG9naWNhbCBtb2RpZmljYXRpb246Ci0KLWh0dHBzOi8vcy5hcGFjaGUub3JnLzEwdjkxCi0KLUdpdmVuIHRoZSBzdHJvbmcgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBjYW5vbmljYWwgR3JlbWxpbiBpbiBKYXZhIGFuZCBpdHMgdmFyaWFudHMgbGlrZSBDIywgdGhlcmUgaXMgYSBsaW1pdGVkIGFtb3VudCBvZiBDIy1zcGVjaWZpYyBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4gVGhpcyBzdHJvbmcgY29ycmVzcG9uZGVuY2UgYW1vbmcgdmFyaWFudHMgZW5zdXJlcyB0aGF0IHRoZSBnZW5lcmFsIEdyZW1saW4gcmVmZXJlbmNlIGRvY3VtZW50YXRpb24gaXMgYXBwbGljYWJsZSB0byBhbGwgdmFyaWFudHMgYW5kIHRoYXQgdXNlcnMgbW92aW5nIGJldHdlZW4gZGV2ZWxvcG1lbnQgbGFuZ3VhZ2VzIGNhbiBlYXNpbHkgYWRvcHQgdGhlIEdyZW1saW4gdmFyaWFudCBmb3IgdGhhdCBsYW5ndWFnZS4KLQotTk9URSB0aGF0IHZlcnNpb25zIHN1ZmZpeGVkIHdpdGggIi1yYyIgYXJlIGNvbnNpZGVyZWQgcmVsZWFzZSBjYW5kaWRhdGVzIChpLmUuIHByZS1hbHBoYSwgYWxwaGEsIGJldGEsIGV0Yy4pIGFuZCB0aHVzIGZvciBlYXJseSB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuPC9EZXNjcmlwdGlvbj4KLSAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLi8uLi9idWlsZC90aW5rZXJwb3Auc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgotICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5PgotICAgIDxQYWNrYWdlSWQ+R3JlbWxpbi5OZXQ8L1BhY2thZ2VJZD4KLSAgICA8UGFja2FnZVRhZ3M+Z3JlbWxpbjt0aW5rZXJwb3A7YXBhY2hlPC9QYWNrYWdlVGFncz4KLSAgICA8UGFja2FnZVByb2plY3RVcmw+aHR0cHM6Ly90aW5rZXJwb3AuYXBhY2hlLm9yZzwvUGFja2FnZVByb2plY3RVcmw+Ci0gICAgPFBhY2thZ2VMaWNlbnNlRXhwcmVzc2lvbj5BcGFjaGUtMi4wPC9QYWNrYWdlTGljZW5zZUV4cHJlc3Npb24+Ci0gICAgPFBhY2thZ2VJY29uPmdyZW1saW4tZG90bmV0LWxvZ29fMjU2eDI1Ni5wbmc8L1BhY2thZ2VJY29uPgotICAgIDxQYWNrYWdlSWNvblVybD5odHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnL2RvY3MvY3VycmVudC9pbWFnZXMvZ3JlbWxpbi1kb3RuZXQtbG9nb18yNTZ4MjU2LnBuZzwvUGFja2FnZUljb25Vcmw+Ci0gICAgPFJlcG9zaXRvcnlVcmw+aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aW5rZXJwb3A8L1JlcG9zaXRvcnlVcmw+Ci0gICAgPFB1Ymxpc2hSZXBvc2l0b3J5VXJsPnRydWU8L1B1Ymxpc2hSZXBvc2l0b3J5VXJsPiAgICAKLSAgICA8QWxsb3dlZE91dHB1dEV4dGVuc2lvbnNJblBhY2thZ2VCdWlsZE91dHB1dEZvbGRlcj5cJChBbGxvd2VkT3V0cHV0RXh0ZW5zaW9uc0luUGFja2FnZUJ1aWxkT3V0cHV0Rm9sZGVyKTsucGRiPC9BbGxvd2VkT3V0cHV0RXh0ZW5zaW9uc0luUGFja2FnZUJ1aWxkT3V0cHV0Rm9sZGVyPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU291cmNlTGluay5HaXRIdWIiIFZlcnNpb249IjEuMC4wIiBQcml2YXRlQXNzZXRzPSJBbGwiLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJOZXd0b25zb2Z0Lkpzb24iIFZlcnNpb249IjExLjAuMiIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiBWZXJzaW9uPSI0LjMuMCIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJQb2xseSIgVmVyc2lvbj0iNy4yLjAiIC8+Ci0gIDwvSXRlbUdyb3VwPgotCi0gIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSInXCQoVGFyZ2V0RnJhbWV3b3JrKScgPT0gJ25ldHN0YW5kYXJkMS4zJyI+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5XZWJTb2NrZXRzIiBWZXJzaW9uPSI0LjMuMCIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0LldlYlNvY2tldHMuQ2xpZW50IiBWZXJzaW9uPSI0LjMuMiIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUmVmbGVjdGlvbi5UeXBlRXh0ZW5zaW9ucyIgVmVyc2lvbj0iNC4zLjAiIC8+Ci0gIDwvSXRlbUdyb3VwPgotCi0gIDxJdGVtR3JvdXA+Ci0gICAgPE5vbmUgSW5jbHVkZT0iLi4vLi4vTElDRU5TRSIgUGFjaz0idHJ1ZSIgUGFja2FnZVBhdGg9IiIgLz4KLSAgICA8Tm9uZSBJbmNsdWRlPSIuLi8uLi9OT1RJQ0UiIFBhY2s9InRydWUiIFBhY2thZ2VQYXRoPSIiIC8+Ci0gICAgPE5vbmUgSW5jbHVkZT0iLi4vLi4vLi4vZG9jcy9zdGF0aWMvaW1hZ2VzL2dyZW1saW4tZG90bmV0LWxvZ29fMjU2eDI1Ni5wbmciIFBhY2s9InRydWUiIFBhY2thZ2VQYXRoPSIiIC8+Ci0gIDwvSXRlbUdyb3VwPgotCi08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9nbHYvUC50ZW1wbGF0ZSBiL2dyZW1saW4tZG90bmV0L2dsdi9QLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQwNDc1Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tZG90bmV0L2dsdi9QLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSNyZWdpb24gTGljZW5zZQotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNlbmRyZWdpb24KLQotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLQotbmFtZXNwYWNlIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsCi17Ci0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICAgICBBIDxzZWUgY3JlZj0iUCIgLz4gaXMgYSBwcmVkaWNhdGUgb2YgdGhlIGZvcm0gRnVuYyZsdDtvYmplY3QsIGJvb2wmZ3Q7LgotICAgIC8vLyAgICAgVGhhdCBpcywgZ2l2ZW4gc29tZSBvYmplY3QsIHJldHVybiB0cnVlIG9yIGZhbHNlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIFAgOiBJUHJlZGljYXRlCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iUCIgLz4gY2xhc3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3BlcmF0b3JOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJlZGljYXRlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSBvZiB0aGUgcHJlZGljYXRlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXIiPkFuIG9wdGlvbmFsIG90aGVyIHByZWRpY2F0ZSB0aGF0IGlzIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yIHRoaXMgcHJlZGljYXRlLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBQKHN0cmluZyBvcGVyYXRvck5hbWUsIGR5bmFtaWMgdmFsdWUsIFAgb3RoZXIgPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBPcGVyYXRvck5hbWUgPSBvcGVyYXRvck5hbWU7Ci0gICAgICAgICAgICBWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgT3RoZXIgPSBvdGhlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcmVkaWNhdGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgT3BlcmF0b3JOYW1lIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwcmVkaWNhdGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIFZhbHVlIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEdldHMgYW4gb3B0aW9uYWwgb3RoZXIgcHJlZGljYXRlIHRoYXQgaXMgdXNlZCBhcyBhbiBhcmd1bWVudCBmb3IgdGhpcyBwcmVkaWNhdGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBQIE90aGVyIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIFJldHVybnMgYSBjb21wb3NlZCBwcmVkaWNhdGUgdGhhdCByZXByZXNlbnRzIGEgbG9naWNhbCBBTkQgb2YgdGhpcyBwcmVkaWNhdGUgYW5kIGFub3RoZXIuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXJQcmVkaWNhdGUiPkEgcHJlZGljYXRlIHRoYXQgd2lsbCBiZSBsb2dpY2FsbHktQU5EZWQgd2l0aCB0aGlzIHByZWRpY2F0ZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvbXBvc2VkIHByZWRpY2F0ZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBQIEFuZChQIG90aGVyUHJlZGljYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFAoImFuZCIsIHRoaXMsIG90aGVyUHJlZGljYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBSZXR1cm5zIGEgY29tcG9zZWQgcHJlZGljYXRlIHRoYXQgcmVwcmVzZW50cyBhIGxvZ2ljYWwgT1Igb2YgdGhpcyBwcmVkaWNhdGUgYW5kIGFub3RoZXIuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXJQcmVkaWNhdGUiPkEgcHJlZGljYXRlIHRoYXQgd2lsbCBiZSBsb2dpY2FsbHktT1JlZCB3aXRoIHRoaXMgcHJlZGljYXRlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY29tcG9zZWQgcHJlZGljYXRlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIFAgT3IoUCBvdGhlclByZWRpY2F0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQKCJvciIsIHRoaXMsIG90aGVyUHJlZGljYXRlKTsKLSAgICAgICAgfQotPCUgcG1ldGhvZHMuZmluZEFsbHsgIShpdCBpbiBbIndpdGhpbiIsICJ3aXRob3V0Il0pIH0uZWFjaCB7IG1ldGhvZCAtPiAlPgotICAgICAgICBwdWJsaWMgc3RhdGljIFAgPCU9IHRvQ1NoYXJwTWV0aG9kTmFtZS5jYWxsKG1ldGhvZCkgJT4ocGFyYW1zIG9iamVjdFtdIGFyZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IGFyZ3MuTGVuZ3RoID09IDEgPyBhcmdzWzBdIDogYXJnczsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUCgiPCU9IG1ldGhvZCAlPiIsIHZhbHVlKTsKLSAgICAgICAgfQotPCUgfSAlPjwlIHBtZXRob2RzLmZpbmRBbGx7IGl0IGluIFsid2l0aGluIiwgIndpdGhvdXQiXSB9LmVhY2ggeyBtZXRob2QgLT4gJT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBQIDwlPSB0b0NTaGFycE1ldGhvZE5hbWUuY2FsbChtZXRob2QpICU+KHBhcmFtcyBvYmplY3RbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgeCA9IGFyZ3MuTGVuZ3RoID09IDEgJiYgYXJnc1swXSBpcyBJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID8gY29sbGVjdGlvbiA6IGFyZ3M7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFAoIjwlPSBtZXRob2QgJT4iLCBUb0dlbmVyaWNMaXN0KHgpKTsKLSAgICAgICAgfQotPCUgfSAlPgotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8b2JqZWN0PiBUb0dlbmVyaWNMaXN0KElFbnVtZXJhYmxlIGNvbGxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uPy5DYXN0PG9iamVjdD4oKS5Ub0xpc3QoKSA/PyBFbnVtZXJhYmxlLkVtcHR5PG9iamVjdD4oKS5Ub0xpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8aW5oZXJpdGRvYyAvPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE90aGVyID09IG51bGwgPyBcJCJ7T3BlcmF0b3JOYW1lfSh7VmFsdWV9KSIgOiBcJCJ7T3BlcmF0b3JOYW1lfSh7VmFsdWV9LHtPdGhlcn0pIjsKLSAgICAgICAgfQotICAgIH0KLQotI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgMTU5MQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L2dsdi9UZXh0UC50ZW1wbGF0ZSBiL2dyZW1saW4tZG90bmV0L2dsdi9UZXh0UC50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyODlmNi4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9nbHYvVGV4dFAudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jcmVnaW9uIExpY2Vuc2UKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZW5kcmVnaW9uCi0KLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLQotbmFtZXNwYWNlIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsCi17Ci0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICAgICBBIDxzZWUgY3JlZj0iVGV4dFAiIC8+IGlzIGEgcHJlZGljYXRlIG9mIHRoZSBmb3JtIEZ1bmMmbHQ7c3RyaW5nLCBib29sJmd0Oy4KLSAgICAvLy8gICAgIFRoYXQgaXMsIGdpdmVuIHNvbWUgc3RyaW5nLCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBUZXh0UCA6IFAKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUZXh0UCIgLz4gY2xhc3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3BlcmF0b3JOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJlZGljYXRlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSBvZiB0aGUgcHJlZGljYXRlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXIiPkFuIG9wdGlvbmFsIG90aGVyIHByZWRpY2F0ZSB0aGF0IGlzIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yIHRoaXMgcHJlZGljYXRlLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBUZXh0UChzdHJpbmcgb3BlcmF0b3JOYW1lLCBzdHJpbmcgdmFsdWUsIFAgb3RoZXIgPSBudWxsKSA6IGJhc2Uob3BlcmF0b3JOYW1lLCB2YWx1ZSwgb3RoZXIpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi08JSB0cG1ldGhvZHMuZWFjaCB7IG1ldGhvZCAtPiAlPgotICAgICAgICBwdWJsaWMgc3RhdGljIFRleHRQIDwlPSB0b0NTaGFycE1ldGhvZE5hbWUuY2FsbChtZXRob2QpICU+KHN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0UCgiPCU9IG1ldGhvZCAlPiIsIHZhbHVlKTsKLSAgICAgICAgfQotPCUgfSAlPgotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFRbXSBUb0dlbmVyaWNBcnJheTxUPihJQ29sbGVjdGlvbjxUPiBjb2xsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbj8uVG9BcnJheSgpID8/IG5ldyBUWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxpbmhlcml0ZG9jIC8+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gT3RoZXIgPT0gbnVsbCA/IFwkIntPcGVyYXRvck5hbWV9KHtWYWx1ZX0pIiA6IFwkIntPcGVyYXRvck5hbWV9KHtWYWx1ZX0se090aGVyfSkiOwotICAgICAgICB9Ci0gICAgfQotCi0jcHJhZ21hIHdhcm5pbmcgcmVzdG9yZSAxNTkxCi19CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9nbHYvVG9rZW4udGVtcGxhdGUgYi9ncmVtbGluLWRvdG5ldC9nbHYvVG9rZW4udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NjYzNGEuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvZ2x2L1Rva2VuLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI3JlZ2lvbiBMaWNlbnNlCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2VuZHJlZ2lvbgotCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci0KLW5hbWVzcGFjZSBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbAotewotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MQotCi0gICAgcHVibGljIGNsYXNzIDwlPSB0b2tlbk5hbWUgJT4KLSAgICB7Ci0gICAgICAgIDwlIHRva2VuRmllbGRzLmVhY2gge2ssdiAtPiAlPgotICAgICAgICAgICAgcHVibGljIGNvbnN0IFN0cmluZyA8JT0gayAlPiA9ICI8JT0gdiAlPiI7Ci0gICAgICAgIDwlIH0gJT4KLSAgICB9Ci0KLSNwcmFnbWEgd2FybmluZyByZXN0b3JlIDE1OTEKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9nbHYvV2l0aE9wdGlvbnMudGVtcGxhdGUgYi9ncmVtbGluLWRvdG5ldC9nbHYvV2l0aE9wdGlvbnMudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGQ2YmQuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvZ2x2L1dpdGhPcHRpb25zLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotI3JlZ2lvbiBMaWNlbnNlCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2VuZHJlZ2lvbgotCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci0KLW5hbWVzcGFjZSBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbC5TdGVwLlV0aWwKLXsKLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gICAgIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIDxjPldpdGgoKTwvYz4gbW9kdWxhdG9yLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIFdpdGhPcHRpb25zCi0gICAgewotPCUgd2l0aE9wdGlvbnMuZWFjaCB7IGZpZWxkIC0+ICU+Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSA8JT0gZmllbGQudHlwZSAlPiA8JT0gZmllbGQubmFtZSAlPiA9IDwlPSBmaWVsZC52YWx1ZSAlPjsKLTwlIH0gJT4KLSAgICB9Ci0KLSNwcmFnbWEgd2FybmluZyByZXN0b3JlIDE1OTEKLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L2dsdi9nZW5lcmF0ZS5ncm9vdnkgYi9ncmVtbGluLWRvdG5ldC9nbHYvZ2VuZXJhdGUuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRhYTU4Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tZG90bmV0L2dsdi9nZW5lcmF0ZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5Db3JlSW1wb3J0cwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RlcC5tYXAuQ29ubmVjdGVkQ29tcG9uZW50Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5QYWdlUmFuawotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RlcC5tYXAuUGVlclByZXNzdXJlCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5TaG9ydGVzdFBhdGgKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNvdXJjZQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2UKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlAKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRleHRQCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5JTwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuV2l0aE9wdGlvbnMKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb24KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcgotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNBcnJheVR5cGUKLQotZGVmIHRvQ1NoYXJwVHlwZU1hcCA9IFsiTG9uZyI6ICJsb25nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkRvdWJsZSI6ICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciI6ICJpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIjogInN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogImJvb2wiLAotICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0IjogIm9iamVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmdbXSI6ICJzdHJpbmdbXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RbXSI6ICJvYmplY3RbXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJDbGFzcyI6ICJUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzW10iOiAiVHlwZVtdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdD4iOiAiSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgRTI+IjogIklEaWN0aW9uYXJ5PHN0cmluZywgRTI+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgQj4iOiAiSURpY3Rpb25hcnk8c3RyaW5nLCBFMj4iLAotICAgICAgICAgICAgICAgICAgICAgICAiamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuT2JqZWN0LCBFMj4iOiAiSURpY3Rpb25hcnk8b2JqZWN0LCBFMj4iLAotICAgICAgICAgICAgICAgICAgICAgICAiamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuT2JqZWN0LCBCPiI6ICJJRGljdGlvbmFyeTxvYmplY3QsIEUyPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlzdDxFPiI6ICJJTGlzdDxFPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlzdDxBPiI6ICJJTGlzdDxFMj4iLAotICAgICAgICAgICAgICAgICAgICAgICAiamF2YS51dGlsLk1hcDxLLCBWPiI6ICJJRGljdGlvbmFyeTxLLCBWPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuQ29sbGVjdGlvbjxFMj4iOiAiSUNvbGxlY3Rpb248RTI+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgImphdmEudXRpbC5Db2xsZWN0aW9uPEI+IjogIklDb2xsZWN0aW9uPEUyPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTWFwPEssIGphdmEubGFuZy5Mb25nPiI6ICJJRGljdGlvbmFyeTxLLCBsb25nPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJUcmF2ZXJzYWxNZXRyaWNzIjogIkUyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlRyYXZlcnNhbCI6ICJJVHJhdmVyc2FsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlRyYXZlcnNhbFtdIjogIklUcmF2ZXJzYWxbXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJQcmVkaWNhdGUiOiAiSVByZWRpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJQIjogIlAiLAotICAgICAgICAgICAgICAgICAgICAgICAiVGV4dFAiOiAiVGV4dFAiLAotICAgICAgICAgICAgICAgICAgICAgICAiVHJhdmVyc2FsU3RyYXRlZ3kiOiAiSVRyYXZlcnNhbFN0cmF0ZWd5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlRyYXZlcnNhbFN0cmF0ZWd5W10iOiAiSVRyYXZlcnNhbFN0cmF0ZWd5W10iLAotICAgICAgICAgICAgICAgICAgICAgICAiRnVuY3Rpb24iOiAiSUZ1bmN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkJpRnVuY3Rpb24iOiAiSUJpRnVuY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAiVW5hcnlPcGVyYXRvciI6ICJJVW5hcnlPcGVyYXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICJCaW5hcnlPcGVyYXRvciI6ICJJQmluYXJ5T3BlcmF0b3IiLAotICAgICAgICAgICAgICAgICAgICAgICAiQ29uc3VtZXIiOiAiSUNvbnN1bWVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlN1cHBsaWVyIjogIklTdXBwbGllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJhdG9yIjogIklDb21wYXJhdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlZlcnRleFByb2dyYW0iOiAib2JqZWN0Il0KLQotZGVmIHVzZUUyID0gWyJFMiIsICJFMiJdCi1kZWYgbWV0aG9kc1dpdGhTcGVjaWZpY1R5cGVzID0gWyJjb25zdGFudCI6IHVzZUUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGltaXQiOiB1c2VFMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lYW4iOiB1c2VFMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsIjogdXNlRTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSI6IHVzZUUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcCI6IHVzZUUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VtIjogdXNlRTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWlsIjogdXNlRTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmZvbGQiOiB1c2VFMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlTWFwIjogWyJJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IiwgIlRLZXksIFRWYWx1ZSJdLF0KLQotZGVmIGdldENTaGFycEdlbmVyaWNUeXBlUGFyYW0gPSB7IHR5cGVOYW1lIC0+Ci0gICAgZGVmIHRQYXJhbSA9ICIiCi0gICAgaWYgKHR5cGVOYW1lLmNvbnRhaW5zKCJFMiIpKSB7Ci0gICAgICAgIHRQYXJhbSA9ICI8RTI+IgotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmFtZS5jb250YWlucygiPEssIFY+IikpIHsKLSAgICAgICAgdFBhcmFtID0gIjxLLCBWPiIKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZU5hbWUuY29udGFpbnMoIjxLLCAiKSkgewotICAgICAgICB0UGFyYW0gPSAiPEs+IgotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmFtZS5jb250YWlucygiUyIpKSB7Ci0gICAgICAgIHRQYXJhbSA9ICI8Uz4iCi0gICAgfQotICAgIGVsc2UgaWYgKHR5cGVOYW1lLmNvbnRhaW5zKCJBIikpIHsKLSAgICAgICAgdFBhcmFtID0gIjxBPiIKLSAgICB9Ci0gICAgcmV0dXJuIHRQYXJhbQotfQotCi1kZWYgdG9DU2hhcnBUeXBlID0geyBuYW1lIC0+Ci0gICAgU3RyaW5nIHR5cGVOYW1lID0gdG9DU2hhcnBUeXBlTWFwLmdldE9yRGVmYXVsdChuYW1lLCBuYW1lKQotICAgIGlmICh0eXBlTmFtZS5lcXVhbHMobmFtZSkgJiYgKHR5cGVOYW1lLmNvbnRhaW5zKCI/IGV4dGVuZHMiKSB8fCB0eXBlTmFtZS5lcXVhbHMoIlRyZWUiKSkpIHsKLSAgICAgICAgdHlwZU5hbWUgPSAiRTIiCi0gICAgfQotICAgIHJldHVybiB0eXBlTmFtZQotfQotCi1kZWYgdG9DU2hhcnBNZXRob2ROYW1lID0geyBzeW1ib2wgLT4gKFN0cmluZykgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN5bWJvbC5jaGFyQXQoMCkpICsgc3ltYm9sLnN1YnN0cmluZygxKSB9Ci0KLWRlZiB0b0NTaGFycFZhbHVlID0geyB0eXBlLCB2YWx1ZSAtPgotICB0eXBlID09IFN0cmluZy5jbGFzcyAmJiB2YWx1ZSAhPSBudWxsID8gKCciJyArIHZhbHVlICsgJyInKSA6IHZhbHVlCi19Ci0KLWRlZiBnZXRKYXZhR2VuZXJpY1R5cGVQYXJhbWV0ZXJUeXBlTmFtZXMgPSB7IG1ldGhvZCAtPgotICAgIGRlZiB0eXBlQXJndW1lbnRzID0gbWV0aG9kLmdlbmVyaWNSZXR1cm5UeXBlLmFjdHVhbFR5cGVBcmd1bWVudHMKLSAgICByZXR1cm4gdHlwZUFyZ3VtZW50cy4KLSAgICAgICAgICAgIGNvbGxlY3QgeyAoaXQgaW5zdGFuY2VvZiBDbGFzcykgPyAoKENsYXNzKWl0KS5zaW1wbGVOYW1lIDogaXQudHlwZU5hbWUgfS4KLSAgICAgICAgICAgIGNvbGxlY3QgeyBuYW1lIC0+Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJBIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJvYmplY3QiCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJFMiIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmFtZQotICAgICAgICAgICAgfQotfQotCi1kZWYgZ2V0SmF2YVBhcmFtZXRlclR5cGVOYW1lcyA9IHsgbWV0aG9kIC0+Ci0gICAgcmV0dXJuIG1ldGhvZC5wYXJhbWV0ZXJzLgotICAgICAgICAgICAgY29sbGVjdCB7IHBhcmFtIC0+Ci0gICAgICAgICAgICAgICAgcGFyYW0udHlwZS5zaW1wbGVOYW1lCi0gICAgICAgICAgICB9Ci19Ci0KLWRlZiB0b0NTaGFycFBhcmFtU3RyaW5nID0geyBwYXJhbSwgZ2VuVHlwZU5hbWUgLT4KLSAgICBTdHJpbmcgY3NoYXJwUGFyYW1UeXBlTmFtZSA9IGdlblR5cGVOYW1lCi0gICAgaWYgKGNzaGFycFBhcmFtVHlwZU5hbWUgPT0gbnVsbCl7Ci0gICAgICAgIGNzaGFycFBhcmFtVHlwZU5hbWUgPSB0b0NTaGFycFR5cGUocGFyYW0udHlwZS5zaW1wbGVOYW1lKQotICAgIH0KLSAgICBlbHNlIGlmIChjc2hhcnBQYXJhbVR5cGVOYW1lID09ICJNIikgewotICAgICAgICBjc2hhcnBQYXJhbVR5cGVOYW1lID0gIm9iamVjdCIKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3NoYXJwUGFyYW1UeXBlTmFtZSA9PSAiQVtdIikgewotICAgICAgICBjc2hhcnBQYXJhbVR5cGVOYW1lID0gIm9iamVjdFtdIgotICAgIH0KLSAgICBlbHNlIGlmIChjc2hhcnBQYXJhbVR5cGVOYW1lID09ICJBIiB8fCBjc2hhcnBQYXJhbVR5cGVOYW1lID09ICJCIikgewotICAgICAgICBjc2hhcnBQYXJhbVR5cGVOYW1lID0gIkUyIgotICAgIH0KLSAgICAiJHtjc2hhcnBQYXJhbVR5cGVOYW1lfSAke3BhcmFtLm5hbWV9IgotICAgIH0KLQotZGVmIGdldEphdmFQYXJhbVR5cGVTdHJpbmcgPSB7IG1ldGhvZCAtPgotICAgIGdldEphdmFQYXJhbWV0ZXJUeXBlTmFtZXMobWV0aG9kKS5qb2luKCIsIikKLX0KLQotZGVmIGdldENTaGFycFBhcmFtVHlwZVN0cmluZyA9IHsgbWV0aG9kIC0+Ci0gICAgcmV0dXJuIG1ldGhvZC5wYXJhbWV0ZXJzLgotICAgICAgICAgICAgY29sbGVjdCB7IHBhcmFtIC0+Ci0gICAgICAgICAgICAgICAgdG9DU2hhcnBUeXBlKHBhcmFtLnR5cGUuc2ltcGxlTmFtZSkKLSAgICAgICAgICAgIH0uam9pbigiLCIpCi19Ci0KLWRlZiBnZXRDU2hhcnBQYXJhbVN0cmluZyA9IHsgbWV0aG9kLCB1c2VHZW5lcmljUGFyYW1zIC0+Ci0gICAgZGVmIHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVycwotICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKQotICAgICAgICByZXR1cm4gIiIKLQotICAgIGRlZiBnZW5lcmljVHlwZXMgPSBtZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCkKLSAgICBkZWYgY3NoYXJwUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuCi0gICAgICAgICAgICB0b0xpc3QoKS5pbmRleGVkKCkuCi0gICAgICAgICAgICBjb2xsZWN0IHsgaW5kZXgsIHBhcmFtIC0+Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGdlblR5cGVOYW1lID0gbnVsbAotICAgICAgICAgICAgICAgIGlmICh1c2VHZW5lcmljUGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZiBnZW5UeXBlID0gZ2VuZXJpY1R5cGVzW2luZGV4XQotICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuVHlwZSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZTw/PikgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuVHlwZU5hbWUgPSAoKFR5cGVWYXJpYWJsZTw/PilnZW5UeXBlKS5uYW1lCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ2VuVHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNBcnJheVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKEdlbmVyaWNBcnJheVR5cGUpZ2VuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZTw/PikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlblR5cGVOYW1lID0gKChUeXBlVmFyaWFibGU8Pz4pKChHZW5lcmljQXJyYXlUeXBlKWdlblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkpLm5hbWUgKyAiW10iCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG9DU2hhcnBQYXJhbVN0cmluZyhwYXJhbSwgZ2VuVHlwZU5hbWUpCi0gICAgICAgICAgICB9LgotICAgICAgICAgICAgdG9BcnJheSgpCi0KLSAgICBpZiAobWV0aG9kLmlzVmFyQXJncygpKSB7Ci0gICAgICAgIGRlZiBsYXN0SW5kZXggPSBjc2hhcnBQYXJhbWV0ZXJzLmxlbmd0aC0xCi0gICAgICAgIGNzaGFycFBhcmFtZXRlcnNbbGFzdEluZGV4XSA9ICJwYXJhbXMgIiArIGNzaGFycFBhcmFtZXRlcnNbbGFzdEluZGV4XQotICAgIH0KLQotICAgIGNzaGFycFBhcmFtZXRlcnMuam9pbigiLCAiKQotfQotCi1kZWYgZ2V0UGFyYW1OYW1lcyA9IHsgcGFyYW1ldGVycyAtPgotICAgIHJldHVybiBwYXJhbWV0ZXJzLgotICAgICAgICBjb2xsZWN0IHsgcGFyYW0gLT4KLSAgICAgICAgICAgIHBhcmFtLm5hbWUKLSAgICAgICAgfQotfQotCi1kZWYgaXNQYXJhbXNBcmdDYXN0TmVjZXNzYXJ5ID0geyBwYXJhbWV0ZXJTdHJpbmcgLT4KLSAgICBpZiAocGFyYW1ldGVyU3RyaW5nLmNvbnRhaW5zKCJwYXJhbXMgIikpIHsKLSAgICAgICAgZGVmIHBhcmFtc1R5cGUgPSBwYXJhbWV0ZXJTdHJpbmcuc3Vic3RyaW5nKHBhcmFtZXRlclN0cmluZy5pbmRleE9mKCJwYXJhbXMgIikgKyAicGFyYW1zICIubGVuZ3RoKCksIHBhcmFtZXRlclN0cmluZy5pbmRleE9mKCJbXSIpKQotICAgICAgICByZXR1cm4gcGFyYW1zVHlwZSA9PSAiRSIgfHwgcGFyYW1zVHlwZSA9PSAiUyIgCi0gICAgfQotICAgIHJldHVybiBmYWxzZQotfQotCi1kZWYgaGFzTWV0aG9kTm9HZW5lcmljQ291bnRlclBhcnRJbkdyYXBoVHJhdmVyc2FsID0geyBtZXRob2QgLT4KLSAgICBkZWYgcGFyYW1ldGVyVHlwZU5hbWVzID0gZ2V0SmF2YVBhcmFtZXRlclR5cGVOYW1lcyhtZXRob2QpCi0gICAgaWYgKG1ldGhvZC5uYW1lLmVxdWFscygiZm9sZCIpKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlTmFtZXMuc2l6ZSgpID09IDAKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlCi19Ci0KLWRlZiB0MndpdGhTcGVjaWFsR3JhcGhUcmF2ZXJzYWx0MiA9IFsiSUxpc3Q8RTI+IjogIkUyIl0KLQotZGVmIGdldEdyYXBoVHJhdmVyc2FsVDJGb3JUMiA9IHsgdDIgLT4KLSAgICBpZiAodDJ3aXRoU3BlY2lhbEdyYXBoVHJhdmVyc2FsdDIuY29udGFpbnNLZXkodDIpKSB7Ci0gICAgICAgIHJldHVybiB0MndpdGhTcGVjaWFsR3JhcGhUcmF2ZXJzYWx0Mi5nZXQodDIpCi0gICAgfQotICAgIHJldHVybiB0MgotfQotCi1kZWYgZ2F0aGVyVG9rZW5zRnJvbSA9IHsgdG9rZW5DbGFzc2VzIC0+Ci0gICAgZGVmIG0gPSBbOl0KLSAgICB0b2tlbkNsYXNzZXMuZWFjaCB7IHRjIC0+IG0gPDwgWyh0Yy5zaW1wbGVOYW1lKSA6IHRjLmdldEZpZWxkcygpLnNvcnR7IGEsIGIgLT4gYS5uYW1lIDw9PiBiLm5hbWUgfS5jb2xsZWN0RW50cmllc3sgZiAtPiBbKGYubmFtZSkgOiBmLmdldChudWxsKV19XX0KLSAgICByZXR1cm4gbQotfQotCi1kZWYgYmluZGluZyA9IFsicG1ldGhvZHMiOiBQLmNsYXNzLmdldE1ldGhvZHMoKS4KLSAgICAgICAgZmluZEFsbCB7IE1vZGlmaWVyLmlzU3RhdGljKGl0LmdldE1vZGlmaWVycygpKSB9LgotICAgICAgICBmaW5kQWxsIHsgUC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgIGNvbGxlY3QgeyBpdC5uYW1lIH0uCi0gICAgICAgIHVuaXF1ZSgpLgotICAgICAgICBzb3J0IHsgYSwgYiAtPiBhIDw9PiBiIH0sCi0gICAgICAgICAgICAgICAidHBtZXRob2RzIjogVGV4dFAuY2xhc3MuZ2V0TWV0aG9kcygpLgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgTW9kaWZpZXIuaXNTdGF0aWMoaXQuZ2V0TW9kaWZpZXJzKCkpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyBUZXh0UC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgeyBpdC5uYW1lIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSgpLgotICAgICAgICAgICAgICAgICAgICAgICBzb3J0IHsgYSwgYiAtPiBhIDw9PiBiIH0sCi0gICAgICAgICAgICAgICAic291cmNlU3RlcE1ldGhvZHMiOiBHcmFwaFRyYXZlcnNhbFNvdXJjZS5nZXRNZXRob2RzKCkuIC8vIFNPVVJDRSBTVEVQUwotICAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IEdyYXBoVHJhdmVyc2FsU291cmNlLmNsYXNzLmVxdWFscyhpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0Lm5hbWUuZXF1YWxzKCJjbG9uZSIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXQubmFtZS5lcXVhbHMoVHJhdmVyc2FsU291cmNlLlN5bWJvbHMud2l0aFJlbW90ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdC5uYW1lLmVxdWFscyhUcmF2ZXJzYWxTb3VyY2UuU3ltYm9scy53aXRoQ29tcHV0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB9LgotICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB1bmlxdWUgY29tYmluYXRpb24gb2YgQyMgcGFyYW1ldGVyIHR5cGVzIGFuZCBzb3J0IGJ5IEphdmEgcGFyYW1ldGVyIHR5cGUgY29tYmluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgeyBhLCBiIC0+IGEubmFtZSA8PT4gYi5uYW1lID86IGdldEphdmFQYXJhbVR5cGVTdHJpbmcoYSkgPD0+IGdldEphdmFQYXJhbVR5cGVTdHJpbmcoYikgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSB7IGEsYiAtPiBhLm5hbWUgPD0+IGIubmFtZSA/OiBnZXRDU2hhcnBQYXJhbVR5cGVTdHJpbmcoYSkgPD0+IGdldENTaGFycFBhcmFtVHlwZVN0cmluZyhiKSB9LgotICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCB7IGphdmFNZXRob2QgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgcGFyYW1ldGVycyA9IGdldENTaGFycFBhcmFtU3RyaW5nKGphdmFNZXRob2QsIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBwYXJhbU5hbWVzID0gZ2V0UGFyYW1OYW1lcyhqYXZhTWV0aG9kLnBhcmFtZXRlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsibWV0aG9kTmFtZSI6IGphdmFNZXRob2QubmFtZSwgInBhcmFtZXRlcnMiOnBhcmFtZXRlcnMsICJwYXJhbU5hbWVzIjpwYXJhbU5hbWVzXQotICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICJzb3VyY2VTcGF3bk1ldGhvZHMiOiBHcmFwaFRyYXZlcnNhbFNvdXJjZS5nZXRNZXRob2RzKCkuIC8vIFNQQVdOIFNURVBTCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgR3JhcGhUcmF2ZXJzYWwuY2xhc3MuZXF1YWxzKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHVuaXF1ZSBjb21iaW5hdGlvbiBvZiBDIyBwYXJhbWV0ZXIgdHlwZXMgYW5kIHNvcnQgYnkgSmF2YSBwYXJhbWV0ZXIgdHlwZSBjb21iaW5hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYS5uYW1lIDw9PiBiLm5hbWUgPzogZ2V0SmF2YVBhcmFtVHlwZVN0cmluZyhhKSA8PT4gZ2V0SmF2YVBhcmFtVHlwZVN0cmluZyhiKSB9LgotICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlIHsgYSxiIC0+IGEubmFtZSA8PT4gYi5uYW1lID86IGdldENTaGFycFBhcmFtVHlwZVN0cmluZyhhKSA8PT4gZ2V0Q1NoYXJwUGFyYW1UeXBlU3RyaW5nKGIpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgamF2YU1ldGhvZCAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiB0eXBlTmFtZXMgPSBnZXRKYXZhR2VuZXJpY1R5cGVQYXJhbWV0ZXJUeXBlTmFtZXMoamF2YU1ldGhvZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgdDEgPSB0b0NTaGFycFR5cGUodHlwZU5hbWVzWzBdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiB0MiA9IHRvQ1NoYXJwVHlwZSh0eXBlTmFtZXNbMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHRQYXJhbSA9IGdldENTaGFycEdlbmVyaWNUeXBlUGFyYW0odDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHBhcmFtZXRlcnMgPSBnZXRDU2hhcnBQYXJhbVN0cmluZyhqYXZhTWV0aG9kLCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBwYXJhbU5hbWVzID0gZ2V0UGFyYW1OYW1lcyhqYXZhTWV0aG9kLnBhcmFtZXRlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGlzQXJnc0Nhc3ROZWNlc3NhcnkgPSBpc1BhcmFtc0FyZ0Nhc3ROZWNlc3NhcnkocGFyYW1ldGVycykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyJtZXRob2ROYW1lIjogamF2YU1ldGhvZC5uYW1lLCAidDEiOnQxLCAidDIiOnQyLCAidFBhcmFtIjp0UGFyYW0sICJwYXJhbWV0ZXJzIjpwYXJhbWV0ZXJzLCAicGFyYW1OYW1lcyI6cGFyYW1OYW1lcywgImlzQXJnc0Nhc3ROZWNlc3NhcnkiOmlzQXJnc0Nhc3ROZWNlc3NhcnldCi0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgImdyYXBoU3RlcE1ldGhvZHMiOiBHcmFwaFRyYXZlcnNhbC5nZXRNZXRob2RzKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgR3JhcGhUcmF2ZXJzYWwuY2xhc3MuZXF1YWxzKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgIWl0Lm5hbWUuZXF1YWxzKCJjbG9uZSIpICYmICFpdC5uYW1lLmVxdWFscygiaXRlcmF0ZSIpIH0uCi0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHVuaXF1ZSBjb21iaW5hdGlvbiBvZiBDIyBwYXJhbWV0ZXIgdHlwZXMgYW5kIHNvcnQgYnkgSmF2YSBwYXJhbWV0ZXIgdHlwZSBjb21iaW5hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYS5uYW1lIDw9PiBiLm5hbWUgPzogZ2V0SmF2YVBhcmFtVHlwZVN0cmluZyhhKSA8PT4gZ2V0SmF2YVBhcmFtVHlwZVN0cmluZyhiKSB9LgotICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlIHsgYSxiIC0+IGEubmFtZSA8PT4gYi5uYW1lID86IGdldENTaGFycFBhcmFtVHlwZVN0cmluZyhhKSA8PT4gZ2V0Q1NoYXJwUGFyYW1UeXBlU3RyaW5nKGIpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgamF2YU1ldGhvZCAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiB0eXBlTmFtZXMgPSBnZXRKYXZhR2VuZXJpY1R5cGVQYXJhbWV0ZXJUeXBlTmFtZXMoamF2YU1ldGhvZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgdDEgPSB0b0NTaGFycFR5cGUodHlwZU5hbWVzWzBdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiB0MiA9IHRvQ1NoYXJwVHlwZSh0eXBlTmFtZXNbMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHRQYXJhbSA9IGdldENTaGFycEdlbmVyaWNUeXBlUGFyYW0odDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHNwZWNpZmljVHlwZXMgPSBtZXRob2RzV2l0aFNwZWNpZmljVHlwZXMuZ2V0KGphdmFNZXRob2QubmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWNUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MiA9IHNwZWNpZmljVHlwZXNbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBhcmFtID0gc3BlY2lmaWNUeXBlcy5zaXplKCkgPiAxID8gIjwiICsgc3BlY2lmaWNUeXBlc1sxXSArICI+IiA6ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBwYXJhbWV0ZXJzID0gZ2V0Q1NoYXJwUGFyYW1TdHJpbmcoamF2YU1ldGhvZCwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgcGFyYW1OYW1lcyA9IGdldFBhcmFtTmFtZXMoamF2YU1ldGhvZC5wYXJhbWV0ZXJzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBpc0FyZ3NDYXN0TmVjZXNzYXJ5ID0gaXNQYXJhbXNBcmdDYXN0TmVjZXNzYXJ5KHBhcmFtZXRlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsibWV0aG9kTmFtZSI6IGphdmFNZXRob2QubmFtZSwgInQxIjp0MSwgInQyIjp0MiwgInRQYXJhbSI6dFBhcmFtLCAicGFyYW1ldGVycyI6cGFyYW1ldGVycywgInBhcmFtTmFtZXMiOnBhcmFtTmFtZXMsICJpc0FyZ3NDYXN0TmVjZXNzYXJ5Ijppc0FyZ3NDYXN0TmVjZXNzYXJ5XQotICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICJhbm9uU3RlcE1ldGhvZHMiOiBfXy5jbGFzcy5nZXRNZXRob2RzKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgR3JhcGhUcmF2ZXJzYWwuY2xhc3MuZXF1YWxzKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgTW9kaWZpZXIuaXNTdGF0aWMoaXQuZ2V0TW9kaWZpZXJzKCkpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgIWl0Lm5hbWUuZXF1YWxzKCJfXyIpICYmICFpdC5uYW1lLmVxdWFscygic3RhcnQiKSB9LgotICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB1bmlxdWUgY29tYmluYXRpb24gb2YgQyMgcGFyYW1ldGVyIHR5cGVzIGFuZCBzb3J0IGJ5IEphdmEgcGFyYW1ldGVyIHR5cGUgY29tYmluYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgeyBhLCBiIC0+IGEubmFtZSA8PT4gYi5uYW1lID86IGdldEphdmFQYXJhbVR5cGVTdHJpbmcoYSkgPD0+IGdldEphdmFQYXJhbVR5cGVTdHJpbmcoYikgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSB7IGEsYiAtPiBhLm5hbWUgPD0+IGIubmFtZSA/OiBnZXRDU2hhcnBQYXJhbVR5cGVTdHJpbmcoYSkgPD0+IGdldENTaGFycFBhcmFtVHlwZVN0cmluZyhiKSB9LgotICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCB7IGphdmFNZXRob2QgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgdHlwZU5hbWVzID0gZ2V0SmF2YUdlbmVyaWNUeXBlUGFyYW1ldGVyVHlwZU5hbWVzKGphdmFNZXRob2QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHQyID0gdG9DU2hhcnBUeXBlKHR5cGVOYW1lc1sxXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgdFBhcmFtID0gZ2V0Q1NoYXJwR2VuZXJpY1R5cGVQYXJhbSh0MikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgc3BlY2lmaWNUeXBlcyA9IG1ldGhvZHNXaXRoU3BlY2lmaWNUeXBlcy5nZXQoamF2YU1ldGhvZC5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpY1R5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyID0gc3BlY2lmaWNUeXBlc1swXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UGFyYW0gPSBzcGVjaWZpY1R5cGVzLnNpemUoKSA+IDEgPyAiPCIgKyBzcGVjaWZpY1R5cGVzWzFdICsgIj4iIDogIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHBhcmFtZXRlcnMgPSBnZXRDU2hhcnBQYXJhbVN0cmluZyhqYXZhTWV0aG9kLCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBwYXJhbU5hbWVzID0gZ2V0UGFyYW1OYW1lcyhqYXZhTWV0aG9kLnBhcmFtZXRlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGNhbGxHZW5lcmljVHlwZUFyZyA9IGhhc01ldGhvZE5vR2VuZXJpY0NvdW50ZXJQYXJ0SW5HcmFwaFRyYXZlcnNhbChqYXZhTWV0aG9kKSA/ICIiIDogdFBhcmFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdyYXBoVHJhdmVyc2FsVDIgPSBnZXRHcmFwaFRyYXZlcnNhbFQyRm9yVDIodDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsibWV0aG9kTmFtZSI6IGphdmFNZXRob2QubmFtZSwgInQyIjp0MiwgInRQYXJhbSI6dFBhcmFtLCAicGFyYW1ldGVycyI6cGFyYW1ldGVycywgInBhcmFtTmFtZXMiOnBhcmFtTmFtZXMsICJjYWxsR2VuZXJpY1R5cGVBcmciOmNhbGxHZW5lcmljVHlwZUFyZywgImdyYXBoVHJhdmVyc2FsVDIiOmdyYXBoVHJhdmVyc2FsVDJdCi0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgInRva2VucyI6IGdhdGhlclRva2Vuc0Zyb20oW0lPLCBDb25uZWN0ZWRDb21wb25lbnQsIFNob3J0ZXN0UGF0aCwgUGFnZVJhbmssIFBlZXJQcmVzc3VyZV0pLAotICAgICAgICAgICAgICAgInRvQ1NoYXJwTWV0aG9kTmFtZSI6IHRvQ1NoYXJwTWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICJ3aXRoT3B0aW9ucyI6IFdpdGhPcHRpb25zLmdldERlY2xhcmVkRmllbGRzKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHtbInR5cGUiOiB0b0NTaGFycFR5cGUoaXQudHlwZS5zaW1wbGVOYW1lKSwgIm5hbWUiOiB0b0NTaGFycE1ldGhvZE5hbWUoaXQubmFtZSksICJ2YWx1ZSI6IHRvQ1NoYXJwVmFsdWUoaXQudHlwZSwgaXQuZ2V0KG51bGwpKV19XQotCi1kZWYgZW5naW5lID0gbmV3IGdyb292eS50ZXh0LkdTdHJpbmdUZW1wbGF0ZUVuZ2luZSgpCi1kZWYgdHJhdmVyc2FsVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoIiR7cHJvamVjdEJhc2VEaXJ9L2dsdi9HcmFwaFRyYXZlcnNhbC50ZW1wbGF0ZSIpKS5tYWtlKGJpbmRpbmcpCi1kZWYgdHJhdmVyc2FsRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhUcmF2ZXJzYWwuY3MiKQotdHJhdmVyc2FsRmlsZS5uZXdXcml0ZXIoKS53aXRoV3JpdGVyeyBpdCA8PCB0cmF2ZXJzYWxUZW1wbGF0ZSB9Ci0KLWRlZiBncmFwaFRyYXZlcnNhbFRlbXBsYXRlID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9nbHYvR3JhcGhUcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUiKSkubWFrZShiaW5kaW5nKQotZGVmIGdyYXBoVHJhdmVyc2FsRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhUcmF2ZXJzYWxTb3VyY2UuY3MiKQotZ3JhcGhUcmF2ZXJzYWxGaWxlLm5ld1dyaXRlcigpLndpdGhXcml0ZXJ7IGl0IDw8IGdyYXBoVHJhdmVyc2FsVGVtcGxhdGUgfQotCi1kZWYgYW5vbnltb3VzVHJhdmVyc2FsVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoIiR7cHJvamVjdEJhc2VEaXJ9L2dsdi9Bbm9ueW1vdXNUcmF2ZXJzYWwudGVtcGxhdGUiKSkubWFrZShiaW5kaW5nKQotZGVmIGFub255bW91c1RyYXZlcnNhbEZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL19fLmNzIikKLWFub255bW91c1RyYXZlcnNhbEZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgYW5vbnltb3VzVHJhdmVyc2FsVGVtcGxhdGUgfQotCi1kZWYgcFRlbXBsYXRlID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9nbHYvUC50ZW1wbGF0ZSIpKS5tYWtlKGJpbmRpbmcpCi1kZWYgcEZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1AuY3MiKQotcEZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgcFRlbXBsYXRlIH0KLQotZGVmIHRwVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoIiR7cHJvamVjdEJhc2VEaXJ9L2dsdi9UZXh0UC50ZW1wbGF0ZSIpKS5tYWtlKGJpbmRpbmcpCi1kZWYgdHBGaWxlID0gbmV3IEZpbGUoIiR7cHJvamVjdEJhc2VEaXJ9L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9UZXh0UC5jcyIpCi10cEZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgdHBUZW1wbGF0ZSB9Ci0KLWRlZiB3aXRoT3B0aW9uc1RlbXBsYXRlID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9nbHYvV2l0aE9wdGlvbnMudGVtcGxhdGUiKSkubWFrZShiaW5kaW5nKQotZGVmIHdpdGhPcHRpb25zRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvV2l0aE9wdGlvbnMuY3MiKQotd2l0aE9wdGlvbnNGaWxlLm5ld1dyaXRlcigpLndpdGhXcml0ZXJ7IGl0IDw8IHdpdGhPcHRpb25zVGVtcGxhdGUgfQotCi1iaW5kaW5nLnRva2Vucy5lYWNoIHtrLHYgLT4KLSAgICBkZWYgdG9rZW5UZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vZ2x2L1Rva2VuLnRlbXBsYXRlIikpLm1ha2UoW3Rva2VuRmllbGRzOiB2LCB0b2tlbk5hbWU6IGtdKQotICAgIGRlZiB0b2tlbkZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsLyR7a30uY3MiKQotICAgIHRva2VuRmlsZS5uZXdXcml0ZXIoKS53aXRoV3JpdGVyeyBpdCA8PCB0b2tlblRlbXBsYXRlIH0KLX0KLQotZGVmIGNyZWF0ZUVudW0gPSB7IGVudW1DbGFzcyAtPgotICAgIGRlZiBiID0gWyJlbnVtQ2xhc3MiOiBlbnVtQ2xhc3MsCi0gICAgICAgICAgICAgImltcGxlbWVudGVkVHlwZXMiOiBlbnVtQ2xhc3MuZ2V0SW50ZXJmYWNlcygpLgotICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgaXQuZ2V0U2ltcGxlTmFtZSgpIH0uCi0gICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyB0b0NTaGFycFR5cGVNYXAuY29udGFpbnNLZXkoaXQpIH0uCi0gICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyB0b0NTaGFycFR5cGVNYXBbaXRdICE9ICJvYmplY3QiIH0uCi0gICAgICAgICAgICAgICAgICAgIHNvcnQgeyBhLCBiIC0+IGEgPD0+IGIgfS4KLSAgICAgICAgICAgICAgICAgICAgY29sbGVjdChbIkVudW1XcmFwcGVyIl0pIHsgdHlwZU5hbWUgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0NTaGFycFR5cGVNYXBbdHlwZU5hbWVdCi0gICAgICAgICAgICAgICAgICAgIH0uam9pbigiLCAiKSwKLSAgICAgICAgICAgICAiY29uc3RhbnRzIjogZW51bUNsYXNzLmdldEVudW1Db25zdGFudHMoKS4KLSAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYS5uYW1lKCkgPD0+IGIubmFtZSgpIH0sCi0gICAgICAgICAgICAgImRpcmVjdGlvbkNsYXNzIjogRGlyZWN0aW9uLmNsYXNzIF0KLQotICAgIGRlZiBlbnVtVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoIiR7cHJvamVjdEJhc2VEaXJ9L2dsdi9FbnVtLnRlbXBsYXRlIikpLm1ha2UoYikKLSAgICBkZWYgZW51bUZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsLyIgKyBlbnVtQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5jcyIpCi0gICAgZW51bUZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgZW51bVRlbXBsYXRlIH0KLX0KLQotQ29yZUltcG9ydHMuZ2V0Q2xhc3NJbXBvcnRzKCkuZmluZEFsbCB7IEVudW0uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpdCkgfS4KLSAgICAgICAgc29ydCB7IGEsIGIgLT4gYS5nZXRTaW1wbGVOYW1lKCkgPD0+IGIuZ2V0U2ltcGxlTmFtZSgpIH0uCi0gICAgICAgIGVhY2ggeyBjcmVhdGVFbnVtKGl0KSB9Ci0KLWRlZiBkZXRlcm1pbmVWZXJzaW9uID0gewotICAgIGRlZiBlbnYgPSBTeXN0ZW0uZ2V0ZW52KCkKLSAgICBkZWYgbWF2ZW5WZXJzaW9uID0gZW52LmNvbnRhaW5zS2V5KCJUUF9SRUxFQVNFX1ZFUlNJT04iKSA/IGVudi5nZXQoIkRPVE5FVF9SRUxFQVNFX1ZFUlNJT04iKSA6ICIke3Byb2plY3RWZXJzaW9ufSIKLQotICAgIC8vIG9ubHkgd2FudCB0byBnZW5lcmF0ZSBhIHRpbWVzdGFtcCBmb3IgdGhlIHZlcnNpb24gaWYgdGhpcyBpcyBhIG51Z2V0IGRlcGxveQotICAgIGlmICghbWF2ZW5WZXJzaW9uLmVuZHNXaXRoKCItU05BUFNIT1QiKSB8fCBudWxsID09IFN5c3RlbS5nZXRQcm9wZXJ0eSgibnVnZXQiKSkgcmV0dXJuIG1hdmVuVmVyc2lvbgotCi0gICAgcmV0dXJuIG1hdmVuVmVyc2lvbi5yZXBsYWNlKCItU05BUFNIT1QiLCAiLWRldi0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpCi19Ci0KLWRlZiB2ZXJzaW9uVG9Vc2UgPSBkZXRlcm1pbmVWZXJzaW9uKCkKLWRlZiBjc3Byb2pUZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vZ2x2L0dyZW1saW4uTmV0LmNzcHJvai50ZW1wbGF0ZSIpKS5tYWtlKFsicHJvamVjdFZlcnNpb24iOnZlcnNpb25Ub1VzZV0pCi1kZWYgY3Nwcm9qRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvR3JlbWxpbi5OZXQvR3JlbWxpbi5OZXQuY3Nwcm9qIikKLWNzcHJvakZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgY3Nwcm9qVGVtcGxhdGUgfQotZGVmIHRlbXBsYXRlQ3Nwcm9qVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoIiR7cHJvamVjdEJhc2VEaXJ9L2dsdi9HcmVtbGluLk5ldC5UZW1wbGF0ZS5jc3Byb2oudGVtcGxhdGUiKSkubWFrZShbInByb2plY3RWZXJzaW9uIjp2ZXJzaW9uVG9Vc2VdKQotZGVmIHRlbXBsYXRlQ3Nwcm9qRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvR3JlbWxpbi5OZXQuVGVtcGxhdGUvR3JlbWxpbi5OZXQuVGVtcGxhdGUuY3Nwcm9qIikKLXRlbXBsYXRlQ3Nwcm9qRmlsZS5uZXdXcml0ZXIoKS53aXRoV3JpdGVyeyBpdCA8PCB0ZW1wbGF0ZUNzcHJvalRlbXBsYXRlIH0KLWRlZiBudXNwZWNUZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vZ2x2L0dyZW1saW4uTmV0LlRlbXBsYXRlLm51c3BlYy50ZW1wbGF0ZSIpKS5tYWtlKFsicHJvamVjdFZlcnNpb24iOnZlcnNpb25Ub1VzZV0pCi1kZWYgbnVzcGVjRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvR3JlbWxpbi5OZXQuVGVtcGxhdGUvR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjIikKLW51c3BlY0ZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgbnVzcGVjVGVtcGxhdGUgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvcG9tLnhtbCBiL2dyZW1saW4tZG90bmV0L3BvbS54bWwKaW5kZXggNDRjMGU2YS4uYmY1NjA5YyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvcG9tLnhtbAorKysgYi9ncmVtbGluLWRvdG5ldC9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnRpbmtlcnBvcDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tZG90bmV0PC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogR3JlbWxpbi5OZXQ8L25hbWU+CkBAIC01OSw1NCArNTksNiBAQAogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRvdG5ldC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ21hdmVucGx1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nbWF2ZW5wbHVzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1zZXJ2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3Jvb3Z5LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bG9nNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1kc2w8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmV4ZWN1dGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByb2plY3RCYXNlRGlyPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7cHJvamVjdC5iYXNlZGlyfTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByb2plY3RWZXJzaW9uPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7cHJvamVjdC52ZXJzaW9ufTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0PiR7cHJvamVjdC5iYXNlZGlyfS9nbHYvZ2VuZXJhdGUuZ3Jvb3Z5PC9zY3JpcHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgICAgIDwhLS0KICAgICAgICAgICAgIHRoZXJlIGlzIG5vIHBvaW50IHRvIGRlcGxveWluZyB0aGUganZtIHN0dWZmIC0gdGhlcmUgaXMgbm8gamF2YSBzb3VyY2UgcmVhbGx5IC0ganVzdCBwb21zCiAgICAgICAgICAgICAtLT4KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC5UZW1wbGF0ZS9HcmVtbGluLk5ldC5UZW1wbGF0ZS5jc3Byb2ogYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQuVGVtcGxhdGUvR3JlbWxpbi5OZXQuVGVtcGxhdGUuY3Nwcm9qCmluZGV4IDNmZGU1ODUuLjQzNGI1MmIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC5UZW1wbGF0ZS9HcmVtbGluLk5ldC5UZW1wbGF0ZS5jc3Byb2oKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0LlRlbXBsYXRlL0dyZW1saW4uTmV0LlRlbXBsYXRlLmNzcHJvagpAQCAtMTUsNyArMTUsNiBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPCEtLSAgVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbCAtLT4KIDxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgogCiAgIDxQcm9wZXJ0eUdyb3VwPgpAQCAtMjYsNyArMjUsOSBAQAogICA8SXRlbUdyb3VwPgogICAgIDwhLS0gV2UgbmVlZCBib3RoIHJlZmVyZW5jZSBlbGVtZW50cyB1bnRpbCB0aGlzIGlzIHJlc29sdmVkOiBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L3Nkay9pc3N1ZXMvMTE1MSAtLT4KICAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi9HcmVtbGluLk5ldC9HcmVtbGluLk5ldC5jc3Byb2oiIC8+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iR3JlbWxpbi5OZXQiIFZlcnNpb249IjMuNC45LVNOQVBTSE9UIiAvPgorCisgICAgPCEtLSBkbyBub3QgZWRpdCB0aGUgdmVyc2lvbiBkaXJlY3RseSAtIG1hdmVuIHVwZGF0ZXMgaXQgYXV0b21hdGljYWxseSAtLT4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJHcmVtbGluLk5ldCIgVmVyc2lvbj0iMy41LjAtU05BUFNIT1QiIC8+CiAgIDwvSXRlbUdyb3VwPgogCiA8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQuVGVtcGxhdGUvR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0LlRlbXBsYXRlL0dyZW1saW4uTmV0LlRlbXBsYXRlLm51c3BlYwppbmRleCAxOWM2MTU1Li4xMjBhNzRjIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQuVGVtcGxhdGUvR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC5UZW1wbGF0ZS9HcmVtbGluLk5ldC5UZW1wbGF0ZS5udXNwZWMKQEAgLTMsNyArMywxMCBAQAogICAgIDxtZXRhZGF0YT4KICAgICAgICAgPGlkPkdyZW1saW4uTmV0LlRlbXBsYXRlPC9pZD4KICAgICAgICAgPHRpdGxlPkdyZW1saW4uTmV0IFRlbXBsYXRlPC90aXRsZT4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisKKyAgICAgICAgPCEtLSBkbyBub3QgZWRpdCB0aGUgdmVyc2lvbiBkaXJlY3RseSAtIG1hdmVuIHVwZGF0ZXMgaXQgYXV0b21hdGljYWxseSAtLT4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisKICAgICAgICAgPGRlc2NyaXB0aW9uPkdyZW1saW4uTmV0IHRlbXBsYXRlIHRvIGNyZWF0ZSBhIGNvbnNvbGUgYXBwbGljYXRpb24gd2l0aCBkb3RuZXQgbmV3LjwvZGVzY3JpcHRpb24+CiAgICAgICAgIDxhdXRob3JzPkFwYWNoZSBUaW5rZXJQb3A8L2F1dGhvcnM+CiAgICAgICAgIDxsaWNlbnNlIHR5cGU9ImV4cHJlc3Npb24iPkFwYWNoZS0yLjA8L2xpY2Vuc2U+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL0Nvbm5lY3Rpb24uY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL0Nvbm5lY3Rpb24uY3MKaW5kZXggNzQzNmMzZC4uOWJjNDY1OCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9Db25uZWN0aW9uLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvQ29ubmVjdGlvbi5jcwpAQCAtMzEsMTMgKzMxLDEyIEBACiB1c2luZyBHcmVtbGluLk5ldC5Ecml2ZXIuTWVzc2FnZXM7CiB1c2luZyBHcmVtbGluLk5ldC5Qcm9jZXNzOwogdXNpbmcgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5Ecml2ZXIKIHsKICAgICBpbnRlcm5hbCBpbnRlcmZhY2UgSVJlc3BvbnNlSGFuZGxlckZvclNpbmdsZVJlcXVlc3RNZXNzYWdlCiAgICAgewotICAgICAgICB2b2lkIEhhbmRsZVJlY2VpdmVkKFJlc3BvbnNlTWVzc2FnZTxKVG9rZW4+IHJlY2VpdmVkKTsKKyAgICAgICAgdm9pZCBIYW5kbGVSZWNlaXZlZChSZXNwb25zZU1lc3NhZ2UgcmVjZWl2ZWQpOwogICAgICAgICB2b2lkIEZpbmFsaXplKERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IHN0YXR1c0F0dHJpYnV0ZXMpOwogICAgICAgICB2b2lkIEhhbmRsZUZhaWx1cmUoRXhjZXB0aW9uIG9iakV4Y2VwdGlvbik7CiAgICAgfQpAQCAtMTI0LDcgKzEyMyw3IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIFBhcnNlKGJ5dGVbXSByZWNlaXZlZCkKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlY2VpdmVkTXNnID0gX21lc3NhZ2VTZXJpYWxpemVyLkRlc2VyaWFsaXplTWVzc2FnZTxSZXNwb25zZU1lc3NhZ2U8SlRva2VuPj4ocmVjZWl2ZWQpOworICAgICAgICAgICAgdmFyIHJlY2VpdmVkTXNnID0gX21lc3NhZ2VTZXJpYWxpemVyLkRlc2VyaWFsaXplTWVzc2FnZTxSZXNwb25zZU1lc3NhZ2U+KHJlY2VpdmVkKTsKICAgICAgICAgICAgIGlmIChyZWNlaXZlZE1zZyA9PSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFRocm93TWVzc2FnZURlc2VyaWFsaXplZE51bGwoKTsKQEAgLTE0Niw3ICsxNDUsNyBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFRocm93TWVzc2FnZURlc2VyaWFsaXplZE51bGwoKSA9PgogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlJlY2VpdmVkIGRhdGEgZGVzZXJpYWxpemVkIGludG8gbnVsbCBvYmplY3QgbWVzc2FnZS4gQ2Fubm90IG9wZXJhdGUgb24gaXQuIik7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFRyeVBhcnNlUmVzcG9uc2VNZXNzYWdlKFJlc3BvbnNlTWVzc2FnZTxKVG9rZW4+IHJlY2VpdmVkTXNnKQorICAgICAgICBwcml2YXRlIHZvaWQgVHJ5UGFyc2VSZXNwb25zZU1lc3NhZ2UoUmVzcG9uc2VNZXNzYWdlIHJlY2VpdmVkTXNnKQogICAgICAgICB7CiAgICAgICAgICAgICB2YXIgc3RhdHVzID0gcmVjZWl2ZWRNc2cuU3RhdHVzOwogICAgICAgICAgICAgc3RhdHVzLlRocm93SWZTdGF0dXNJbmRpY2F0ZXNFcnJvcigpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9Kc29uTWVzc2FnZVNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL0pzb25NZXNzYWdlU2VyaWFsaXplci5jcwppbmRleCA1M2E1NDZjLi5kZTRjNjEwIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL0pzb25NZXNzYWdlU2VyaWFsaXplci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL0pzb25NZXNzYWdlU2VyaWFsaXplci5jcwpAQCAtMjEsMTQgKzIxLDE3IEBACiAKICNlbmRyZWdpb24KIAordXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBOZXd0b25zb2Z0Lkpzb247Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuRHJpdmVyCiB7CiAgICAgaW50ZXJuYWwgY2xhc3MgSnNvbk1lc3NhZ2VTZXJpYWxpemVyCiAgICAgewogICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfbWltZVR5cGU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEpzb25TZXJpYWxpemVyT3B0aW9ucyBKc29uRGVzZXJpYWxpemluZ09wdGlvbnMgPSBuZXcgSnNvblNlcmlhbGl6ZXJPcHRpb25zCisgICAgICAgICAgICB7UHJvcGVydHlOYW1pbmdQb2xpY3kgPSBKc29uTmFtaW5nUG9saWN5LkNhbWVsQ2FzZX07CiAKICAgICAgICAgcHVibGljIEpzb25NZXNzYWdlU2VyaWFsaXplcihzdHJpbmcgbWltZVR5cGUpCiAgICAgICAgIHsKQEAgLTQ3LDggKzUwLDExIEBACiAKICAgICAgICAgcHVibGljIFRNZXNzYWdlIERlc2VyaWFsaXplTWVzc2FnZTxUTWVzc2FnZT4oYnl0ZVtdIG1lc3NhZ2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXNwb25zZVN0ciA9IEVuY29kaW5nLlVURjguR2V0U3RyaW5nKG1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIEpzb25Db252ZXJ0LkRlc2VyaWFsaXplT2JqZWN0PFRNZXNzYWdlPihyZXNwb25zZVN0cik7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihtZXNzYWdlKSk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5MZW5ndGggPT0gMCkgcmV0dXJuIGRlZmF1bHQ7CisgICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IFV0ZjhKc29uUmVhZGVyKG1lc3NhZ2UpOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPFRNZXNzYWdlPihyZWYgcmVhZGVyLCBKc29uRGVzZXJpYWxpemluZ09wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplZDsKICAgICAgICAgfQogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL01lc3NhZ2VzL1Jlc3BvbnNlTWVzc2FnZS5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvTWVzc2FnZXMvUmVzcG9uc2VNZXNzYWdlLmNzCmluZGV4IGYxY2IzYWQuLjc5MTQzM2YgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvTWVzc2FnZXMvUmVzcG9uc2VNZXNzYWdlLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvTWVzc2FnZXMvUmVzcG9uc2VNZXNzYWdlLmNzCkBAIC0yMiwxOSArMjIsMTUgQEAKICNlbmRyZWdpb24KIAogdXNpbmcgU3lzdGVtOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuRHJpdmVyLk1lc3NhZ2VzCiB7Ci0gICAgaW50ZXJuYWwgY2xhc3MgUmVzcG9uc2VNZXNzYWdlPFQ+CisgICAgaW50ZXJuYWwgY2xhc3MgUmVzcG9uc2VNZXNzYWdlCiAgICAgewotICAgICAgICBbSnNvblByb3BlcnR5KFByb3BlcnR5TmFtZSA9ICJyZXF1ZXN0SWQiKV0KICAgICAgICAgcHVibGljIEd1aWQgUmVxdWVzdElkIHsgZ2V0OyBzZXQ7IH0KIAotICAgICAgICBbSnNvblByb3BlcnR5KFByb3BlcnR5TmFtZSA9ICJzdGF0dXMiKV0KICAgICAgICAgcHVibGljIFJlc3BvbnNlU3RhdHVzIFN0YXR1cyB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgW0pzb25Qcm9wZXJ0eShQcm9wZXJ0eU5hbWUgPSAicmVzdWx0IildCiAgICAgICAgIHB1YmxpYyBSZXNwb25zZVJlc3VsdCBSZXN1bHQgeyBnZXQ7IHNldDsgfQogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL01lc3NhZ2VzL1Jlc3BvbnNlUmVzdWx0LmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9NZXNzYWdlcy9SZXNwb25zZVJlc3VsdC5jcwppbmRleCA4NDg0NzNiLi5iMjZmNDE1IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL01lc3NhZ2VzL1Jlc3BvbnNlUmVzdWx0LmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvTWVzc2FnZXMvUmVzcG9uc2VSZXN1bHQuY3MKQEAgLTIyLDE3ICsyMiwxNCBAQAogI2VuZHJlZ2lvbgogCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbjsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LkRyaXZlci5NZXNzYWdlcwogewogICAgIGludGVybmFsIGNsYXNzIFJlc3BvbnNlUmVzdWx0CiAgICAgewotICAgICAgICBbSnNvblByb3BlcnR5KFByb3BlcnR5TmFtZSA9ICJkYXRhIildCi0gICAgICAgIHB1YmxpYyBKVG9rZW4gRGF0YSB7IGdldDsgc2V0OyB9Ci0KLSAgICAgICAgW0pzb25Qcm9wZXJ0eShQcm9wZXJ0eU5hbWUgPSAibWV0YSIpXQorICAgICAgICBwdWJsaWMgSnNvbkVsZW1lbnQgRGF0YSB7IGdldDsgc2V0OyB9CisgICAgICAgIAogICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gTWV0YSB7IGdldDsgc2V0OyB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvTWVzc2FnZXMvUmVzcG9uc2VTdGF0dXMuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL01lc3NhZ2VzL1Jlc3BvbnNlU3RhdHVzLmNzCmluZGV4IGFhMGIxYjcuLjMyZDhiNDMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvTWVzc2FnZXMvUmVzcG9uc2VTdGF0dXMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9NZXNzYWdlcy9SZXNwb25zZVN0YXR1cy5jcwpAQCAtMjMsMTkgKzIzLDE1IEBACiAKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgR3JlbWxpbi5OZXQuRHJpdmVyLkV4Y2VwdGlvbnM7Ci11c2luZyBOZXd0b25zb2Z0Lkpzb247CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5Ecml2ZXIuTWVzc2FnZXMKIHsKICAgICBpbnRlcm5hbCBjbGFzcyBSZXNwb25zZVN0YXR1cwogICAgIHsKLSAgICAgICAgW0pzb25Qcm9wZXJ0eShQcm9wZXJ0eU5hbWUgPSAiY29kZSIpXQogICAgICAgICBwdWJsaWMgUmVzcG9uc2VTdGF0dXNDb2RlIENvZGUgeyBnZXQ7IHNldDsgfQotCi0gICAgICAgIFtKc29uUHJvcGVydHkoUHJvcGVydHlOYW1lID0gImF0dHJpYnV0ZXMiKV0KKyAgICAgICAgCiAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiBBdHRyaWJ1dGVzIHsgZ2V0OyBzZXQ7IH0KLQotICAgICAgICBbSnNvblByb3BlcnR5KFByb3BlcnR5TmFtZSA9ICJtZXNzYWdlIildCisgICAgICAgIAogICAgICAgICBwdWJsaWMgc3RyaW5nIE1lc3NhZ2UgeyBnZXQ7IHNldDsgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9NZXNzYWdlcy9SZXNwb25zZVN0YXR1c0NvZGUuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL01lc3NhZ2VzL1Jlc3BvbnNlU3RhdHVzQ29kZS5jcwppbmRleCA3OGY4NzU5Li5iMWE4NDFhIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL01lc3NhZ2VzL1Jlc3BvbnNlU3RhdHVzQ29kZS5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL01lc3NhZ2VzL1Jlc3BvbnNlU3RhdHVzQ29kZS5jcwpAQCAtNzcsMTAgKzc3LDEwIEBACiAgICAgICAgIFNlcnZlckVycm9yID0gNTAwLAogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBUaGUgc2NyaXB0IHN1Ym1pdHRlZCBmb3IgcHJvY2Vzc2luZyBldmFsdWF0ZWQgaW4gdGhlIFNjcmlwdEVuZ2luZSB3aXRoIGVycm9ycyBhbmQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4KLSAgICAgICAgLy8vICAgICBDaGVjayB0aGUgc2NyaXB0IHN1Ym1pdHRlZCBmb3Igc3ludGF4IGVycm9ycyBvciBvdGhlciBwcm9ibGVtcyBhbmQgdGhlbiByZXN1Ym1pdC4KKyAgICAgICAgLy8vICAgICBUaGUgcmVxdWVzdCBzdWJtaXR0ZWQgZm9yIHByb2Nlc3NpbmcgZXZhbHVhdGVkIGJ5IHRoZSBzZXJ2ZXIgd2l0aCBlcnJvcnMgYW5kIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuCisgICAgICAgIC8vLyAgICAgQ2hlY2sgdGhlIHNjcmlwdCBvciByZW1vdGUgdHJhdmVyc2FsIHN1Ym1pdHRlZCBmb3IgZXJyb3JzIG9yIG90aGVyIHByb2JsZW1zIGFuZCB0aGVuIHJlc3VibWl0LgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBTY3JpcHRFdmFsdWF0aW9uRXJyb3IgPSA1OTcsCisgICAgICAgIFNlcnZlckV2YWx1YXRpb25FcnJvciA9IDU5NywKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyAgICAgVGhlIHNlcnZlciBleGNlZWRlZCBvbmUgb2YgdGhlIHRpbWVvdXQgc2V0dGluZ3MgZm9yIHRoZSByZXF1ZXN0IGFuZCBjb3VsZCB0aGVyZWZvcmUgb25seSBwYXJ0aWFsbHkgcmVzcG9uZGVkCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIFJlc3BvbnNlU3RhdHVzQ29kZS5NYWxmb3JtZWRSZXF1ZXN0OgogICAgICAgICAgICAgICAgIGNhc2UgUmVzcG9uc2VTdGF0dXNDb2RlLkludmFsaWRSZXF1ZXN0QXJndW1lbnRzOgogICAgICAgICAgICAgICAgIGNhc2UgUmVzcG9uc2VTdGF0dXNDb2RlLlNlcnZlckVycm9yOgotICAgICAgICAgICAgICAgIGNhc2UgUmVzcG9uc2VTdGF0dXNDb2RlLlNjcmlwdEV2YWx1YXRpb25FcnJvcjoKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3BvbnNlU3RhdHVzQ29kZS5TZXJ2ZXJFdmFsdWF0aW9uRXJyb3I6CiAgICAgICAgICAgICAgICAgY2FzZSBSZXNwb25zZVN0YXR1c0NvZGUuU2VydmVyVGltZW91dDoKICAgICAgICAgICAgICAgICBjYXNlIFJlc3BvbnNlU3RhdHVzQ29kZS5TZXJ2ZXJTZXJpYWxpemF0aW9uRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9SZW1vdGUvRHJpdmVyUmVtb3RlVHJhdmVyc2FsLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9SZW1vdGUvRHJpdmVyUmVtb3RlVHJhdmVyc2FsLmNzCmluZGV4IDIxOTczODguLmNmNTA2NDYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvUmVtb3RlL0RyaXZlclJlbW90ZVRyYXZlcnNhbC5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1JlbW90ZS9Ecml2ZXJSZW1vdGVUcmF2ZXJzYWwuY3MKQEAgLTMzLDEwICszMyw2IEBACiAgICAgICAgICAgICBJRW51bWVyYWJsZTxUcmF2ZXJzZXI+IHRyYXZlcnNlcnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFRyYXZlcnNlcnMgPSB0cmF2ZXJzZXJzOwotCi0gICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2MTIsNjE4Ci0gICAgICAgICAgICBTaWRlRWZmZWN0cyA9IG5ldyBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhncmVtbGluQ2xpZW50LCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyLDYxOAogICAgICAgICB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvUmVtb3RlL0RyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9SZW1vdGUvRHJpdmVyUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzZjYTguLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9SZW1vdGUvRHJpdmVyUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAot77u/I3JlZ2lvbiBMaWNlbnNlCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgR3JlbWxpbi5OZXQuRHJpdmVyLk1lc3NhZ2VzOwotdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2VzczsKLXVzaW5nIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsOwotCi1uYW1lc3BhY2UgR3JlbWxpbi5OZXQuRHJpdmVyLlJlbW90ZQotewotICAgICNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDYxMiw2MTgKLSAgICBpbnRlcm5hbCBjbGFzcyBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyA6IElUcmF2ZXJzYWxTaWRlRWZmZWN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJR3JlbWxpbkNsaWVudCBfZ3JlbWxpbkNsaWVudDsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PHN0cmluZz4gX2tleXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgR3VpZCBfc2VydmVyU2lkZUVmZmVjdElkOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IF9zaWRlRWZmZWN0cyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOwotICAgICAgICBwcml2YXRlIGJvb2wgX2Nsb3NlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sIF9yZXRyaWV2ZWRBbGxLZXlzOwotCi0gICAgICAgIHB1YmxpYyBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhJR3JlbWxpbkNsaWVudCBncmVtbGluQ2xpZW50LCBHdWlkIHNlcnZlclNpZGVFZmZlY3RJZCkKLSAgICAgICAgewotICAgICAgICAgICAgX2dyZW1saW5DbGllbnQgPSBncmVtbGluQ2xpZW50OwotICAgICAgICAgICAgX3NlcnZlclNpZGVFZmZlY3RJZCA9IHNlcnZlclNpZGVFZmZlY3RJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElSZWFkT25seUNvbGxlY3Rpb248c3RyaW5nPiBLZXlzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jbG9zZWQgJiYgIV9yZXRyaWV2ZWRBbGxLZXlzKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUcmF2ZXJzYWwgaGFzIGJlZW4gY2xvc2VkIC0gc2lkZS1lZmZlY3Qga2V5cyBjYW5ub3QgYmUgcmV0cmlldmVkIik7Ci0gICAgICAgICAgICBpZiAoIV9yZXRyaWV2ZWRBbGxLZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9rZXlzLkFkZFJhbmdlKFJldHJpZXZlS2V5cygpKTsKLSAgICAgICAgICAgICAgICBfcmV0cmlldmVkQWxsS2V5cyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX2tleXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIElFbnVtZXJhYmxlPHN0cmluZz4gUmV0cmlldmVLZXlzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9ncmVtbGluQ2xpZW50LlN1Ym1pdEFzeW5jPHN0cmluZz4oU2lkZUVmZmVjdEtleXNNZXNzYWdlKCkpLlJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUmVxdWVzdE1lc3NhZ2UgU2lkZUVmZmVjdEtleXNNZXNzYWdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RNZXNzYWdlLkJ1aWxkKFRva2Vucy5PcHNLZXlzKQotICAgICAgICAgICAgICAgIC5BZGRBcmd1bWVudChUb2tlbnMuQXJnc1NpZGVFZmZlY3QsIF9zZXJ2ZXJTaWRlRWZmZWN0SWQpCi0gICAgICAgICAgICAgICAgLlByb2Nlc3NvcihUb2tlbnMuUHJvY2Vzc29yVHJhdmVyc2FsKQotICAgICAgICAgICAgICAgIC5DcmVhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvYmplY3QgR2V0KHN0cmluZyBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghS2V5cygpLkNvbnRhaW5zKGtleSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEtleU5vdEZvdW5kRXhjZXB0aW9uKCQiU2lkZSBlZmZlY3Qga2V5IHtrZXl9IGRvZXMgbm90IGV4aXN0Iik7Ci0gICAgICAgICAgICBpZiAoIV9zaWRlRWZmZWN0cy5Db250YWluc0tleShrZXkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfY2xvc2VkKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJUcmF2ZXJzYWwgaGFzIGJlZW4gY2xvc2VkIC0gbm8gbmV3IHNpZGUtZWZmZWN0cyBjYW4gYmUgcmV0cmlldmVkIik7Ci0gICAgICAgICAgICAgICAgX3NpZGVFZmZlY3RzLkFkZChrZXksIFJldHJpZXZlU2lkZUVmZmVjdHNGb3JLZXkoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX3NpZGVFZmZlY3RzW2tleV07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIG9iamVjdCBSZXRyaWV2ZVNpZGVFZmZlY3RzRm9yS2V5KHN0cmluZyBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZ3JlbWxpbkNsaWVudC5TdWJtaXRBc3luYzxvYmplY3Q+KFNpZGVFZmZlY3RHYXRoZXJNZXNzYWdlKGtleSkpLlJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUmVxdWVzdE1lc3NhZ2UgU2lkZUVmZmVjdEdhdGhlck1lc3NhZ2Uoc3RyaW5nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RNZXNzYWdlLkJ1aWxkKFRva2Vucy5PcHNHYXRoZXIpCi0gICAgICAgICAgICAgICAgLkFkZEFyZ3VtZW50KFRva2Vucy5BcmdzU2lkZUVmZmVjdCwgX3NlcnZlclNpZGVFZmZlY3RJZCkKLSAgICAgICAgICAgICAgICAuQWRkQXJndW1lbnQoVG9rZW5zLkFyZ3NTaWRlRWZmZWN0S2V5LCBrZXkpCi0gICAgICAgICAgICAgICAgLkFkZEFyZ3VtZW50KFRva2Vucy5BcmdzQWxpYXNlcywgbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHt7ImciLCAiZyJ9fSkKLSAgICAgICAgICAgICAgICAuUHJvY2Vzc29yKFRva2Vucy5Qcm9jZXNzb3JUcmF2ZXJzYWwpCi0gICAgICAgICAgICAgICAgLkNyZWF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2Nsb3NlZCkgcmV0dXJuOwotICAgICAgICAgICAgQ2xvc2VTaWRlRWZmZWN0cygpOwotICAgICAgICAgICAgX2Nsb3NlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQ2xvc2VTaWRlRWZmZWN0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ncmVtbGluQ2xpZW50LlN1Ym1pdEFzeW5jPG9iamVjdD4oU2lkZUVmZmVjdENsb3NlTWVzc2FnZSgpKS5XYWl0VW53cmFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFJlcXVlc3RNZXNzYWdlIFNpZGVFZmZlY3RDbG9zZU1lc3NhZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUmVxdWVzdE1lc3NhZ2UuQnVpbGQoVG9rZW5zLk9wc0Nsb3NlKQotICAgICAgICAgICAgICAgIC5BZGRBcmd1bWVudChUb2tlbnMuQXJnc1NpZGVFZmZlY3QsIF9zZXJ2ZXJTaWRlRWZmZWN0SWQpCi0gICAgICAgICAgICAgICAgLlByb2Nlc3NvcihUb2tlbnMuUHJvY2Vzc29yVHJhdmVyc2FsKQotICAgICAgICAgICAgICAgIC5DcmVhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2MTIsNjE4Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9SZXN1bHRzQWdncmVnYXRpb24vQWdncmVnYXRvckZhY3RvcnkuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9BZ2dyZWdhdG9yRmFjdG9yeS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMjI1ZC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9BZ2dyZWdhdG9yRmFjdG9yeS5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSNyZWdpb24gTGljZW5zZQotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci0KLW5hbWVzcGFjZSBHcmVtbGluLk5ldC5Ecml2ZXIuUmVzdWx0c0FnZ3JlZ2F0aW9uCi17Ci0gICAgI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyLDYxOAotICAgIGludGVybmFsIGNsYXNzIEFnZ3JlZ2F0b3JGYWN0b3J5Ci0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBJQWdncmVnYXRvcj4gX2FnZ3JlZ2F0b3JCeUFnZ3JlZ2F0ZVRvVHlwZSA9Ci0gICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIElBZ2dyZWdhdG9yPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHtUb2tlbnMuVmFsQWdncmVnYXRlVG9NYXAsIG5ldyBEaWN0aW9uYXJ5QWdncmVnYXRvcigpfSwKLSAgICAgICAgICAgICAgICB7VG9rZW5zLlZhbEFnZ3JlZ2F0ZVRvQnVsa1NldCwgbmV3IFRyYXZlcnNlckFnZ3JlZ2F0b3IoKX0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgcHVibGljIElBZ2dyZWdhdG9yIEdldEFnZ3JlZ2F0b3JGb3Ioc3RyaW5nIGFnZ3JlZ2F0ZVRvKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2FnZ3JlZ2F0b3JCeUFnZ3JlZ2F0ZVRvVHlwZS5Db250YWluc0tleShhZ2dyZWdhdGVUbykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIF9hZ2dyZWdhdG9yQnlBZ2dyZWdhdGVUb1R5cGVbYWdncmVnYXRlVG9dOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0QWdncmVnYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotICAgICNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDYxMiw2MTgKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9EZWZhdWx0QWdncmVnYXRvci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvUmVzdWx0c0FnZ3JlZ2F0aW9uL0RlZmF1bHRBZ2dyZWdhdG9yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmIyNDdiLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvUmVzdWx0c0FnZ3JlZ2F0aW9uL0RlZmF1bHRBZ2dyZWdhdG9yLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI3JlZ2lvbiBMaWNlbnNlCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLQotbmFtZXNwYWNlIEdyZW1saW4uTmV0LkRyaXZlci5SZXN1bHRzQWdncmVnYXRpb24KLXsKLSAgICBpbnRlcm5hbCBjbGFzcyBEZWZhdWx0QWdncmVnYXRvciA6IElBZ2dyZWdhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8ZHluYW1pYz4gX3Jlc3VsdCA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkKG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgX3Jlc3VsdC5BZGQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG9iamVjdCBHZXRBZ2dyZWdhdGVkUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9SZXN1bHRzQWdncmVnYXRpb24vRGljdGlvbmFyeUFnZ3JlZ2F0b3IuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9EaWN0aW9uYXJ5QWdncmVnYXRvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3NjRlMy4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9EaWN0aW9uYXJ5QWdncmVnYXRvci5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNyZWdpb24gTGljZW5zZQotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLQotbmFtZXNwYWNlIEdyZW1saW4uTmV0LkRyaXZlci5SZXN1bHRzQWdncmVnYXRpb24KLXsKLSAgICBpbnRlcm5hbCBjbGFzcyBEaWN0aW9uYXJ5QWdncmVnYXRvciA6IElBZ2dyZWdhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBkeW5hbWljPiBfcmVzdWx0ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBkeW5hbWljPigpOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZChvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBuZXdFbnRyeSA9ICgoRGljdGlvbmFyeTxzdHJpbmcsIGR5bmFtaWM+KSB2YWx1ZSkuRmlyc3QoKTsKLSAgICAgICAgICAgIF9yZXN1bHQuQWRkKG5ld0VudHJ5LktleSwgbmV3RW50cnkuVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG9iamVjdCBHZXRBZ2dyZWdhdGVkUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9SZXN1bHRzQWdncmVnYXRpb24vSUFnZ3JlZ2F0b3IuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9JQWdncmVnYXRvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMDM2YS4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9JQWdncmVnYXRvci5jcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNyZWdpb24gTGljZW5zZQotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNlbmRyZWdpb24KLQotbmFtZXNwYWNlIEdyZW1saW4uTmV0LkRyaXZlci5SZXN1bHRzQWdncmVnYXRpb24KLXsKLSAgICBpbnRlcm5hbCBpbnRlcmZhY2UgSUFnZ3JlZ2F0b3IKLSAgICB7Ci0gICAgICAgIHZvaWQgQWRkKG9iamVjdCB2YWx1ZSk7Ci0gICAgICAgIG9iamVjdCBHZXRBZ2dyZWdhdGVkUmVzdWx0KCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvUmVzdWx0c0FnZ3JlZ2F0aW9uL1RyYXZlcnNlckFnZ3JlZ2F0b3IuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvRHJpdmVyL1Jlc3VsdHNBZ2dyZWdhdGlvbi9UcmF2ZXJzZXJBZ2dyZWdhdG9yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE4ODA0Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvUmVzdWx0c0FnZ3JlZ2F0aW9uL1RyYXZlcnNlckFnZ3JlZ2F0b3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jcmVnaW9uIExpY2Vuc2UKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWw7Ci0KLW5hbWVzcGFjZSBHcmVtbGluLk5ldC5Ecml2ZXIuUmVzdWx0c0FnZ3JlZ2F0aW9uCi17Ci0gICAgaW50ZXJuYWwgY2xhc3MgVHJhdmVyc2VyQWdncmVnYXRvciA6IElBZ2dyZWdhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8b2JqZWN0LCBsb25nPiBfcmVzdWx0ID0gbmV3IERpY3Rpb25hcnk8b2JqZWN0LCBsb25nPigpOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZChvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0cmF2ZXJzZXIgPSAoVHJhdmVyc2VyKSB2YWx1ZTsKLSAgICAgICAgICAgIF9yZXN1bHQuQWRkKHRyYXZlcnNlci5PYmplY3QsIHRyYXZlcnNlci5CdWxrKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvYmplY3QgR2V0QWdncmVnYXRlZFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvU2luZ2xlTWVzc2FnZVJlc3VsdFJlY2VpdmVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9TaW5nbGVNZXNzYWdlUmVzdWx0UmVjZWl2ZXIuY3MKaW5kZXggN2I2NmU2MS4uMTNmYmFmNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9TaW5nbGVNZXNzYWdlUmVzdWx0UmVjZWl2ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9TaW5nbGVNZXNzYWdlUmVzdWx0UmVjZWl2ZXIuY3MKQEAgLTIzLDExICsyMywxMCBAQAogCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiB1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwogdXNpbmcgR3JlbWxpbi5OZXQuRHJpdmVyLk1lc3NhZ2VzOwotdXNpbmcgR3JlbWxpbi5OZXQuRHJpdmVyLlJlc3VsdHNBZ2dyZWdhdGlvbjsKIHVzaW5nIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTjsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuRHJpdmVyCiB7CkBAIC0zOSw4ICszOCw2IEBACiAgICAgICAgICAgICBuZXcgVGFza0NvbXBsZXRpb25Tb3VyY2U8UmVzdWx0U2V0PFQ+PihUYXNrQ3JlYXRpb25PcHRpb25zLlJ1bkNvbnRpbnVhdGlvbnNBc3luY2hyb25vdXNseSk7CiAKICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBHcmFwaFNPTlJlYWRlciBfZ3JhcGhTT05SZWFkZXI7Ci0gICAgICAgIHByaXZhdGUgYm9vbCBfaXNBZ2dyZWdhdGluZ1NpZGVFZmZlY3RzOwotICAgICAgICBwcml2YXRlIElBZ2dyZWdhdG9yIF9hZ2dyZWdhdG9yOwogICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8VD4gX3Jlc3VsdCA9IG5ldyBMaXN0PFQ+KCk7CiAKICAgICAgICAgcHVibGljIFJlc3BvbnNlSGFuZGxlckZvclNpbmdsZVJlcXVlc3RNZXNzYWdlKEdyYXBoU09OUmVhZGVyIGdyYXBoU29uUmVhZGVyKQpAQCAtNDgsMzcgKzQ1LDIxIEBACiAgICAgICAgICAgICBfZ3JhcGhTT05SZWFkZXIgPSBncmFwaFNvblJlYWRlcjsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIEhhbmRsZVJlY2VpdmVkKFJlc3BvbnNlTWVzc2FnZTxKVG9rZW4+IHJlY2VpdmVkKQorICAgICAgICBwdWJsaWMgdm9pZCBIYW5kbGVSZWNlaXZlZChSZXNwb25zZU1lc3NhZ2UgcmVjZWl2ZWQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZWNlaXZlZERhdGEgPSB0eXBlb2YoVCkgPT0gdHlwZW9mKEpUb2tlbikKKyAgICAgICAgICAgIHZhciByZWNlaXZlZERhdGEgPSB0eXBlb2YoVCkgPT0gdHlwZW9mKEpzb25FbGVtZW50KQogICAgICAgICAgICAgICAgID8gbmV3W10ge3JlY2VpdmVkLlJlc3VsdC5EYXRhfQogICAgICAgICAgICAgICAgIDogX2dyYXBoU09OUmVhZGVyLlRvT2JqZWN0KHJlY2VpdmVkLlJlc3VsdC5EYXRhKTsKLSAgICAgICAgICAgICNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDYxMiw2MTgKICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIHJlY2VpdmVkRGF0YSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZWQuUmVzdWx0Lk1ldGEuQ29udGFpbnNLZXkoVG9rZW5zLkFyZ3NTaWRlRWZmZWN0S2V5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfYWdncmVnYXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgX2FnZ3JlZ2F0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBZ2dyZWdhdG9yRmFjdG9yeSgpLkdldEFnZ3JlZ2F0b3JGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcpIHJlY2VpdmVkLlJlc3VsdC5NZXRhW1Rva2Vucy5BcmdzQWdncmVnYXRlVG9dKTsKLSAgICAgICAgICAgICAgICAgICAgX2FnZ3JlZ2F0b3IuQWRkKGQpOwotICAgICAgICAgICAgICAgICAgICBfaXNBZ2dyZWdhdGluZ1NpZGVFZmZlY3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5BZGQoZCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9yZXN1bHQuQWRkKGQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyLDYxOAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgRmluYWxpemUoRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gc3RhdHVzQXR0cmlidXRlcykKICAgICAgICAgewogICAgICAgICAgICAgdmFyIHJlc3VsdFNldCA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlc3VsdFNldDxUPigKLSAgICAgICAgICAgICAgICAgICAgX2lzQWdncmVnYXRpbmdTaWRlRWZmZWN0cyA/IG5ldyBMaXN0PFQ+IHsoVCkgX2FnZ3JlZ2F0b3IuR2V0QWdncmVnYXRlZFJlc3VsdCgpfSA6IF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0F0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIG5ldyBSZXN1bHRTZXQ8VD4oX3Jlc3VsdCwgc3RhdHVzQXR0cmlidXRlcyk7CiAgICAgICAgICAgICBfdGNzLlRyeVNldFJlc3VsdChyZXN1bHRTZXQpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Ecml2ZXIvVG9rZW5zLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9Ub2tlbnMuY3MKaW5kZXggYTdmODA0YS4uZjhkMDE0MCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9Ub2tlbnMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0RyaXZlci9Ub2tlbnMuY3MKQEAgLTQ3LDE4ICs0Nyw2IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIE9wc0V2YWwgPSAiZXZhbCI7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIE9wZXJhdGlvbiB1c2VkIHRvIGdldCBhIHBhcnRpY3VsYXIgc2lkZS1lZmZlY3QgYXMgcHJvZHVjZWQgYnkgYSBwcmV2aW91c2x5IGV4ZWN1dGVkIFRyYXZlcnNhbC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW09ic29sZXRlKCJBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgcmVwbGFjZWQsIHByZWZlciB1c2Ugb2YgY2FwKCktc3RlcCB0byByZXRyaWV2ZSBzaWRlLWVmZmVjdHMgYXMgcGFydCBvZiB0cmF2ZXJzYWwgaXRlcmF0aW9uIiwgZmFsc2UpXQotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBPcHNHYXRoZXIgPSAiZ2F0aGVyIjsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgT3BlcmF0aW9uIHVzZWQgdG8gZ2V0IGFsbCB0aGUga2V5cyBvZiBhbGwgc2lkZS1lZmZlY3RzIGFzIHByb2R1Y2VkIGJ5IGEgcHJldmlvdXNseSBleGVjdXRlZCBUcmF2ZXJzYWwuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtPYnNvbGV0ZSgiQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IHJlcGxhY2VkLCBwcmVmZXIgdXNlIG9mIGNhcCgpLXN0ZXAgdG8gcmV0cmlldmUgc2lkZS1lZmZlY3RzIGFzIHBhcnQgb2YgdHJhdmVyc2FsIGl0ZXJhdGlvbiIsIGZhbHNlKV0KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgT3BzS2V5cyA9ICJrZXlzIjsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyAgICAgT3BlcmF0aW9uIHVzZWQgdG8gZ2V0IGFsbCB0aGUga2V5cyBvZiBhbGwgc2lkZS1lZmZlY3RzIGFzIHByb2R1Y2VkIGJ5IGEgcHJldmlvdXNseSBleGVjdXRlZCBUcmF2ZXJzYWwuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIE9wc0Nsb3NlID0gImNsb3NlIjsKQEAgLTEwMSwyNCArODksNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBBcmdzU2Vzc2lvbiA9ICJzZXNzaW9uIjsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgQXJndW1lbnQgbmFtZSB0aGF0IGFsbG93cyB0byBzcGVjaWZ5IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtPYnNvbGV0ZSgiQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IHJlcGxhY2VkLCBwcmVmZXIgdXNlIG9mIGNhcCgpLXN0ZXAgdG8gcmV0cmlldmUgc2lkZS1lZmZlY3RzIGFzIHBhcnQgb2YgdHJhdmVyc2FsIGl0ZXJhdGlvbiIsIGZhbHNlKV0KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQXJnc1NpZGVFZmZlY3QgPSAic2lkZUVmZmVjdCI7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEFyZ3VtZW50IG5hbWUgdGhhdCBhbGxvd3MgdG8gc3BlY2lmeSB0aGUga2V5IGZvciBhIHNwZWNpZmljIHNpZGUtZWZmZWN0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbT2Jzb2xldGUoIkFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCByZXBsYWNlZCwgcHJlZmVyIHVzZSBvZiBjYXAoKS1zdGVwIHRvIHJldHJpZXZlIHNpZGUtZWZmZWN0cyBhcyBwYXJ0IG9mIHRyYXZlcnNhbCBpdGVyYXRpb24iLCBmYWxzZSldCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEFyZ3NTaWRlRWZmZWN0S2V5ID0gInNpZGVFZmZlY3RLZXkiOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICA8c2VlIGNyZWY9IlJlc3BvbnNlTWVzc2FnZXtUfSIgLz4gYXJndW1lbnQgdGhhdCBkZXNjcmliZXMgaG93IHNpZGUtZWZmZWN0IGRhdGEgc2hvdWxkIGJlIHRyZWF0ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtPYnNvbGV0ZSgiQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IHJlcGxhY2VkLCBwcmVmZXIgdXNlIG9mIGNhcCgpLXN0ZXAgdG8gcmV0cmlldmUgc2lkZS1lZmZlY3RzIGFzIHBhcnQgb2YgdHJhdmVyc2FsIGl0ZXJhdGlvbiIsIGZhbHNlKV0KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQXJnc0FnZ3JlZ2F0ZVRvID0gImFnZ3JlZ2F0ZVRvIjsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyAgICAgQXJndW1lbnQgbmFtZSB0aGF0IGFsbG93cyB0byBjaGFuZ2UgdGhlIGZsYXZvciBvZiBHcmVtbGluIHVzZWQgKGUuZy4gZ3JlbWxpbi1ncm9vdnkpLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBBcmdzTGFuZ3VhZ2UgPSAibGFuZ3VhZ2UiOwpAQCAtMTM0LDExICsxMDQsNSBAQAogICAgICAgICAvLy8gICAgIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSByZXF1aXJlZCBieSB0aGUgc2VydmVyLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBBcmdzU2FzbCA9ICJzYXNsIjsKLQotICAgICAgICBbT2Jzb2xldGUoIkFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCByZXBsYWNlZCwgcHJlZmVyIHVzZSBvZiBjYXAoKS1zdGVwIHRvIHJldHJpZXZlIHNpZGUtZWZmZWN0cyBhcyBwYXJ0IG9mIHRyYXZlcnNhbCBpdGVyYXRpb24iLCBmYWxzZSldCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgVmFsQWdncmVnYXRlVG9NYXAgPSAibWFwIjsKLQotICAgICAgICBbT2Jzb2xldGUoIkFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCByZXBsYWNlZCwgcHJlZmVyIHVzZSBvZiBjYXAoKS1zdGVwIHRvIHJldHJpZXZlIHNpZGUtZWZmZWN0cyBhcyBwYXJ0IG9mIHRyYXZlcnNhbCBpdGVyYXRpb24iLCBmYWxzZSldCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgVmFsQWdncmVnYXRlVG9CdWxrU2V0ID0gImJ1bGtzZXQiOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvR3JlbWxpbi5OZXQuY3Nwcm9qIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L0dyZW1saW4uTmV0LmNzcHJvagppbmRleCAyYWVjNTdmLi5iOWFkNWQxIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvR3JlbWxpbi5OZXQuY3Nwcm9qCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9HcmVtbGluLk5ldC5jc3Byb2oKQEAgLTE1LDE5ICsxNSwxNyBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPCEtLSAgVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbCAtLT4KIDxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgogCiAgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJCdWlsZCI+Ci0gICAgPFRhcmdldEZyYW1ld29ya3M+bmV0c3RhbmRhcmQxLjM7bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29ya3M+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRzdGFuZGFyZDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgogICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPgogICAgIDxHZW5lcmF0ZURvY3VtZW50YXRpb25GaWxlPnRydWU8L0dlbmVyYXRlRG9jdW1lbnRhdGlvbkZpbGU+CiAgIDwvUHJvcGVydHlHcm91cD4KIAogICA8UHJvcGVydHlHcm91cCBMYWJlbD0iUGFja2FnZSI+Ci0gICAgPFZlcnNpb24+My40LjktU05BUFNIT1Q8L1ZlcnNpb24+Ci0gICAgPEZpbGVWZXJzaW9uPjMuNC45LjA8L0ZpbGVWZXJzaW9uPgotICAgIDxBc3NlbWJseVZlcnNpb24+My40LjAuMDwvQXNzZW1ibHlWZXJzaW9uPgorICAgIDwhLS0gZG8gbm90IGVkaXQgdGhlIHZlcnNpb24gZGlyZWN0bHkgLSBtYXZlbiB1cGRhdGVzIGl0IGF1dG9tYXRpY2FsbHkgLS0+CisgICAgPFZlcnNpb24+My41LjAtU05BUFNIT1Q8L1ZlcnNpb24+CiAgICAgPFRpdGxlPkdyZW1saW4uTmV0PC9UaXRsZT4KICAgICA8QXV0aG9ycz5BcGFjaGUgVGlua2VyUG9wPC9BdXRob3JzPgogICAgIDxEZXNjcmlwdGlvbj5HcmVtbGluLk5ldCBmb3IgQXBhY2hlIFRpbmtlclBvcOKEoiBpcyBhIGxhbmd1YWdlIHZhcmlhbnQgYW5kIGRyaXZlciBmb3IgLk5FVC4KQEAgLTcxLDE4ICs2OSwxMiBAQAogICA8L1Byb3BlcnR5R3JvdXA+CiAKICAgPEl0ZW1Hcm91cD4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU291cmNlTGluay5HaXRIdWIiIFZlcnNpb249IjEuMC4wIiBQcml2YXRlQXNzZXRzPSJBbGwiLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJOZXd0b25zb2Z0Lkpzb24iIFZlcnNpb249IjExLjAuMiIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU291cmNlTGluay5HaXRIdWIiIFZlcnNpb249IjEuMC4wIiBQcml2YXRlQXNzZXRzPSJBbGwiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlRleHQuSnNvbiIgVmVyc2lvbj0iNC43LjEiIC8+CiAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgVmVyc2lvbj0iNC4zLjAiIC8+CiAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iUG9sbHkiIFZlcnNpb249IjcuMi4wIiAvPgogICA8L0l0ZW1Hcm91cD4KIAotICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iJyQoVGFyZ2V0RnJhbWV3b3JrKScgPT0gJ25ldHN0YW5kYXJkMS4zJyI+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5XZWJTb2NrZXRzIiBWZXJzaW9uPSI0LjMuMCIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0LldlYlNvY2tldHMuQ2xpZW50IiBWZXJzaW9uPSI0LjMuMiIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUmVmbGVjdGlvbi5UeXBlRXh0ZW5zaW9ucyIgVmVyc2lvbj0iNC4zLjAiIC8+Ci0gIDwvSXRlbUdyb3VwPgotCiAgIDxJdGVtR3JvdXA+CiAgICAgPE5vbmUgSW5jbHVkZT0iLi4vLi4vTElDRU5TRSIgUGFjaz0idHJ1ZSIgUGFja2FnZVBhdGg9IiIgLz4KICAgICA8Tm9uZSBJbmNsdWRlPSIuLi8uLi9OT1RJQ0UiIFBhY2s9InRydWUiIFBhY2thZ2VQYXRoPSIiIC8+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9SZW1vdGUvUmVtb3RlU3RyYXRlZ3kuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9SZW1vdGUvUmVtb3RlU3RyYXRlZ3kuY3MKaW5kZXggMDk4YTQ2ZC4uZDM2MWFjNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvUmVtb3RlL1JlbW90ZVN0cmF0ZWd5LmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1JlbW90ZS9SZW1vdGVTdHJhdGVneS5jcwpAQCAtNTQsNyArNTQsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAodHJhdmVyc2FsLlRyYXZlcnNlcnMgIT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgICAgdmFyIHJlbW90ZVRyYXZlcnNhbCA9IGF3YWl0IF9yZW1vdGVDb25uZWN0aW9uLlN1Ym1pdEFzeW5jPFMsIEU+KHRyYXZlcnNhbC5CeXRlY29kZSkuQ29uZmlndXJlQXdhaXQoZmFsc2UpOwotICAgICAgICAgICAgdHJhdmVyc2FsLlNpZGVFZmZlY3RzID0gcmVtb3RlVHJhdmVyc2FsLlNpZGVFZmZlY3RzOwogICAgICAgICAgICAgdHJhdmVyc2FsLlRyYXZlcnNlcnMgPSByZW1vdGVUcmF2ZXJzYWwuVHJhdmVyc2VyczsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9CYXJyaWVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0JhcnJpZXIuY3MKaW5kZXggMGY4NmYzMi4uYzY1OTk0YiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0JhcnJpZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0JhcnJpZXIuY3MKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2VuZHJlZ2lvbgogCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0J5dGVjb2RlLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0J5dGVjb2RlLmNzCmluZGV4IGUwOWM1MzMuLjcxNDllOGIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9CeXRlY29kZS5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvQnl0ZWNvZGUuY3MKQEAgLTExMCwxMiArMTEwLDIzIEBACiAKICAgICAgICAgcHJpdmF0ZSBvYmplY3QgQ29udmVydEFyZ3VtZW50KG9iamVjdCBhcmd1bWVudCwgYm9vbCBzZWFyY2hCaW5kaW5ncykKICAgICAgICAgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gYXJndW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzZWFyY2hCaW5kaW5ncykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2YXIgdmFyaWFibGUgPSBCaW5kaW5ncy5HZXRCb3VuZFZhcmlhYmxlKGFyZ3VtZW50KTsKICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nKHZhcmlhYmxlLCBDb252ZXJ0QXJndW1lbnQoYXJndW1lbnQsIGZhbHNlKSk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhcmd1bWVudCBpcyBJVHJhdmVyc2FsIHRyYXZlcnNhbCAmJiAhdHJhdmVyc2FsLklzQW5vbnltb3VzKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJCJUaGUgY2hpbGQgdHJhdmVyc2FsIG9mIHt0cmF2ZXJzYWwuQnl0ZWNvZGV9IHdhcyBub3Qgc3Bhd25lZCBhbm9ueW1vdXNseSAtIHVzZSB0aGUgX18gY2xhc3MgcmF0aGVyIHRoYW4gYSBUcmF2ZXJzYWxTb3VyY2UgdG8gY29uc3RydWN0IHRoZSBjaGlsZCB0cmF2ZXJzYWwiKTsKKworICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoSXNEaWN0aW9uYXJ5VHlwZShhcmd1bWVudC5HZXRUeXBlKCkpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZhciBkaWN0ID0gbmV3IERpY3Rpb25hcnk8b2JqZWN0LCBvYmplY3Q+KCk7CkBAIC0xNTgsNCArMTY5LDQgQEAKICAgICAgICAgICAgIHJldHVybiB0eXBlLklzQ29uc3RydWN0ZWRHZW5lcmljVHlwZSAmJiB0eXBlLkdldEdlbmVyaWNUeXBlRGVmaW5pdGlvbigpID09IHR5cGVvZihIYXNoU2V0PD4pOwogICAgICAgICB9CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9DYXJkaW5hbGl0eS5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9DYXJkaW5hbGl0eS5jcwppbmRleCBjYWNlZDdkLi42NTY2M2Q2IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvQ2FyZGluYWxpdHkuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0NhcmRpbmFsaXR5LmNzCkBAIC0yMSw3ICsyMSw2IEBACiAKICNlbmRyZWdpb24KIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9Db2x1bW4uY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvQ29sdW1uLmNzCmluZGV4IGNhY2Y4ODYuLjY2YTZlZGQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9Db2x1bW4uY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0NvbHVtbi5jcwpAQCAtMjEsNyArMjEsNiBAQAogCiAjZW5kcmVnaW9uCiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvQ29ubmVjdGVkQ29tcG9uZW50LmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0Nvbm5lY3RlZENvbXBvbmVudC5jcwppbmRleCBjYTFmNTNlLi44NjBlODdhIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvQ29ubmVjdGVkQ29tcG9uZW50LmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9Db25uZWN0ZWRDb21wb25lbnQuY3MKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2VuZHJlZ2lvbgogCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9EZWZhdWx0VHJhdmVyc2FsLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0RlZmF1bHRUcmF2ZXJzYWwuY3MKaW5kZXggMmI2ZDM3OC4uMzhlMDMxYyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0RlZmF1bHRUcmF2ZXJzYWwuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0RlZmF1bHRUcmF2ZXJzYWwuY3MKQEAgLTQwLDEyICs0MCwxMSBAQAogICAgICAgICAvLy8gICAgIEdldHMgdGhlIDxzZWUgY3JlZj0iVHJhdmVyc2FsLkJ5dGVjb2RlIiAvPiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYXZlcnNhbC4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIEJ5dGVjb2RlIEJ5dGVjb2RlIHsgZ2V0OyBwcm90ZWN0ZWQgc2V0OyB9Ci0KKyAgICAgICAgCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBHZXRzIG9yIHNldHMgdGhlIDxzZWUgY3JlZj0iSVRyYXZlcnNhbFNpZGVFZmZlY3RzIiAvPiBvZiB0aGlzIHRyYXZlcnNhbC4KKyAgICAgICAgLy8vICAgICBEZXRlcm1pbmVzIGlmIHRoaXMgdHJhdmVyc2FsIHdhcyBzcGF3bmVkIGFub255bW91c2x5IG9yIG5vdC4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW09ic29sZXRlKCJBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgcmVwbGFjZWQsIHByZWZlciB1c2Ugb2YgY2FwKCktc3RlcCB0byByZXRyaWV2ZSBzaWRlLWVmZmVjdHMgYXMgcGFydCBvZiB0cmF2ZXJzYWwgaXRlcmF0aW9uIiwgZmFsc2UpXQotICAgICAgICBwdWJsaWMgSVRyYXZlcnNhbFNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGJvb2wgSXNBbm9ueW1vdXMgeyBnZXQ7IHByb3RlY3RlZCBzZXQ7IH0KIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyAgICAgR2V0cyBvciBzZXRzIHRoZSA8c2VlIGNyZWY9IlRyYXZlcnNlciIgLz4ncyBvZiB0aGlzIHRyYXZlcnNhbCB0aGF0IGhvbGQgdGhlIHJlc3VsdHMgb2YgdGhlIHRyYXZlcnNhbC4KQEAgLTcxLDcgKzcwLDYgQEAKICAgICAgICAgLy8vIDxpbmhlcml0ZG9jIC8+CiAgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQogICAgICAgICB7Ci0gICAgICAgICAgICBEaXNwb3NlKHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8vIDxpbmhlcml0ZG9jIC8+CkBAIC0yNjEsMTUgKzI1OSw2IEBACiAgICAgICAgICAgICByZXR1cm4gb2JqczsKICAgICAgICAgfQogCi0gICAgICAgIC8vLyA8aW5oZXJpdGRvYyAvPgotICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCi0gICAgICAgICAgICAgICAgI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyLDYxOAotICAgICAgICAgICAgICAgIFNpZGVFZmZlY3RzPy5EaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyLDYxOAotICAgICAgICB9Ci0KICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gICAgIFN0YXJ0cyBhIHByb21pc2UgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIG9uIHRoZSBjdXJyZW50IHRyYXZlcnNhbCB0aGF0IHdpbGwgYmUgY29tcGxldGVkIGluIHRoZSBmdXR1cmUuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvRGlyZWN0aW9uLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0RpcmVjdGlvbi5jcwppbmRleCA5MmQ5NDE2Li44YzNlZDRhIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvRGlyZWN0aW9uLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9EaXJlY3Rpb24uY3MKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2VuZHJlZ2lvbgogCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0dyYXBoU09OVmVyc2lvbi5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9HcmFwaFNPTlZlcnNpb24uY3MKaW5kZXggMzY2YzQ4Yy4uZTc5Yzg2ZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0dyYXBoU09OVmVyc2lvbi5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhTT05WZXJzaW9uLmNzCkBAIC0yMSw3ICsyMSw2IEBACiAKICNlbmRyZWdpb24KIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9HcmFwaFRyYXZlcnNhbC5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9HcmFwaFRyYXZlcnNhbC5jcwppbmRleCA3Mzk0ZmU4Li44ZmI3NDJjIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhUcmF2ZXJzYWwuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0dyYXBoVHJhdmVyc2FsLmNzCkBAIC0yNSw3ICsyNSw2IEBACiB1c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIEdyZW1saW4uTmV0LlN0cnVjdHVyZTsKIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsCiB7CiAgICAgLy8vIDxzdW1tYXJ5PgpAQCAtMzcsNyArMzYsNyBAQAogICAgICAgICAvLy8gICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IkdyYXBoVHJhdmVyc2Fse1NUeXBlLCBFVHlwZX0iIC8+IGNsYXNzLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWwoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBMaXN0PElUcmF2ZXJzYWxTdHJhdGVneT4oKSwgbmV3IEJ5dGVjb2RlKCkpCisgICAgICAgICAgICA6IHRoaXMobmV3IExpc3Q8SVRyYXZlcnNhbFN0cmF0ZWd5PigpLCBuZXcgQnl0ZWNvZGUoKSwgdHJ1ZSkKICAgICAgICAgewogICAgICAgICB9CiAKQEAgLTQ3LDkgKzQ2LDIxIEBACiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHJhdmVyc2FsU3RyYXRlZ2llcyI+VGhlIHRyYXZlcnNhbCBzdHJhdGVnaWVzIHRvIGJlIHVzZWQgYnkgdGhpcyBncmFwaCB0cmF2ZXJzYWwgYXQgZXZhbHVhdGlvbiB0aW1lLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnl0ZWNvZGUiPlRoZSA8c2VlIGNyZWY9IkJ5dGVjb2RlIiAvPiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIGdyYXBoIHRyYXZlcnNhbC48L3BhcmFtPgogICAgICAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWwoSUNvbGxlY3Rpb248SVRyYXZlcnNhbFN0cmF0ZWd5PiB0cmF2ZXJzYWxTdHJhdGVnaWVzLCBCeXRlY29kZSBieXRlY29kZSkKKyAgICAgICAgICAgIDogdGhpcyh0cmF2ZXJzYWxTdHJhdGVnaWVzLCBieXRlY29kZSwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJHcmFwaFRyYXZlcnNhbHtTVHlwZSwgRVR5cGV9IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0cmF2ZXJzYWxTdHJhdGVnaWVzIj5UaGUgdHJhdmVyc2FsIHN0cmF0ZWdpZXMgdG8gYmUgdXNlZCBieSB0aGlzIGdyYXBoIHRyYXZlcnNhbCBhdCBldmFsdWF0aW9uIHRpbWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJieXRlY29kZSI+VGhlIDxzZWUgY3JlZj0iQnl0ZWNvZGUiIC8+IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uc3RydWN0aW9uIG9mIHRoaXMgZ3JhcGggdHJhdmVyc2FsLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYW5vbnltb3VzIj5TZXQgdG8gdHJ1ZSBpZiBzcGF3bmVkIGZyb20gYW4gYW5vbnltb3VzIHRyYXZlcnNhbCBzb3VyY2UgYW5kIGZhbHNlIG90aGVyd2lzZS48L3BhcmFtPgorICAgICAgICBwcml2YXRlIEdyYXBoVHJhdmVyc2FsKElDb2xsZWN0aW9uPElUcmF2ZXJzYWxTdHJhdGVneT4gdHJhdmVyc2FsU3RyYXRlZ2llcywgQnl0ZWNvZGUgYnl0ZWNvZGUsIGJvb2wgYW5vbnltb3VzKQogICAgICAgICB7CiAgICAgICAgICAgICBUcmF2ZXJzYWxTdHJhdGVnaWVzID0gdHJhdmVyc2FsU3RyYXRlZ2llczsKICAgICAgICAgICAgIEJ5dGVjb2RlID0gYnl0ZWNvZGU7CisgICAgICAgICAgICBJc0Fub255bW91cyA9IGFub255bW91czsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIEdyYXBoVHJhdmVyc2FsPFMyLCBFMj4gV3JhcDxTMiwgRTI+KEdyYXBoVHJhdmVyc2FsPFMsIEU+IHRyYXZlcnNhbCkKQEAgLTU5LDcgKzcwLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdHJhdmVyc2FsIGFzIEdyYXBoVHJhdmVyc2FsPFMyLCBFMj47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBOZXcgd3JhcHBlcgotICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaFRyYXZlcnNhbDxTMiwgRTI+KHRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVnaWVzLCB0cmF2ZXJzYWwuQnl0ZWNvZGUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaFRyYXZlcnNhbDxTMiwgRTI+KHRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVnaWVzLCB0cmF2ZXJzYWwuQnl0ZWNvZGUsIHRyYXZlcnNhbC5Jc0Fub255bW91cyk7CiAgICAgICAgIH0KIAogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhUcmF2ZXJzYWxTb3VyY2UuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhUcmF2ZXJzYWxTb3VyY2UuY3MKaW5kZXggYjUyYjg5OC4uOTIwZDZkOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0dyYXBoVHJhdmVyc2FsU291cmNlLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9HcmFwaFRyYXZlcnNhbFNvdXJjZS5jcwpAQCAtMjgsNyArMjgsNiBAQAogdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWwuU3RyYXRlZ3kuRGVjb3JhdGlvbjsKIHVzaW5nIEdyZW1saW4uTmV0LlN0cnVjdHVyZTsKIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsCiB7CiAjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3J5b1ZlcnNpb24uY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvR3J5b1ZlcnNpb24uY3MKaW5kZXggMDFkMmE5OS4uZTM0YzdiMyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0dyeW9WZXJzaW9uLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9HcnlvVmVyc2lvbi5jcwpAQCAtMjEsNyArMjEsNiBAQAogCiAjZW5kcmVnaW9uCiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSU8uY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSU8uY3MKaW5kZXggM2E1N2Q0Yi4uYjllMGZkZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0lPLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9JTy5jcwpAQCAtMjEsNyArMjEsNiBAQAogCiAjZW5kcmVnaW9uCiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0lUcmF2ZXJzYWwuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSVRyYXZlcnNhbC5jcwppbmRleCAyMmY3OTJhLi45NWNiYjc0IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSVRyYXZlcnNhbC5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSVRyYXZlcnNhbC5jcwpAQCAtMzgsMTMgKzM4LDExIEBACiAgICAgICAgIC8vLyAgICAgR2V0cyB0aGUgPHNlZSBjcmVmPSJCeXRlY29kZSIgLz4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmF2ZXJzYWwuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIEJ5dGVjb2RlIEJ5dGVjb2RlIHsgZ2V0OyB9Ci0KKyAgICAgICAgCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgICBHZXRzIG9yIHNldHMgdGhlIDxzZWUgY3JlZj0iSVRyYXZlcnNhbFNpZGVFZmZlY3RzIiAvPiBvZiB0aGlzIHRyYXZlcnNhbC4KKyAgICAgICAgLy8vICAgICBEZXRlcm1pbmVzIGlmIHRoaXMgdHJhdmVyc2FsIHdhcyBzcGF3bmVkIGFub255bW91c2x5IG9yIG5vdC4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyLDYxOAotICAgICAgICBJVHJhdmVyc2FsU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgeyBnZXQ7IHNldDsgfQotICAgICAgICAjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2MTIsNjE4CisgICAgICAgIGJvb2wgSXNBbm9ueW1vdXMgeyBnZXQ7ICB9CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gICAgIEdldHMgb3Igc2V0cyB0aGUgPHNlZSBjcmVmPSJUcmF2ZXJzZXIiIC8+J3Mgb2YgdGhpcyB0cmF2ZXJzYWwgdGhhdCBob2xkIHRoZSByZXN1bHRzIG9mIHRoZSB0cmF2ZXJzYWwuCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSVRyYXZlcnNhbFNpZGVFZmZlY3RzLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0lUcmF2ZXJzYWxTaWRlRWZmZWN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkOWZjMS4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSVRyYXZlcnNhbFNpZGVFZmZlY3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAot77u/I3JlZ2lvbiBMaWNlbnNlCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLQotbmFtZXNwYWNlIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgICAgQSA8c2VlIGNyZWY9IklUcmF2ZXJzYWwiIC8+IGNhbiBtYWludGFpbiBnbG9iYWwgc2lkZUVmZmVjdHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbT2Jzb2xldGUoIkFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCByZXBsYWNlZCwgcHJlZmVyIHVzZSBvZiBjYXAoKS1zdGVwIHRvIHJldHJpZXZlIHNpZGUtZWZmZWN0cyBhcyBwYXJ0IG9mIHRyYXZlcnNhbCBpdGVyYXRpb24iLCBmYWxzZSldCi0gICAgcHVibGljIGludGVyZmFjZSBJVHJhdmVyc2FsU2lkZUVmZmVjdHMgOiBJRGlzcG9zYWJsZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIFJldHJpZXZlcyB0aGUga2V5cyBvZiB0aGUgc2lkZS1lZmZlY3QgdGhhdCBjYW4gYmUgc3VwcGxpZWQgdG8gPHNlZSBjcmVmPSJHZXQiIC8+LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGtleXMgb2YgdGhlIHNpZGUtZWZmZWN0LjwvcmV0dXJucz4KLSAgICAgICAgSVJlYWRPbmx5Q29sbGVjdGlvbjxzdHJpbmc+IEtleXMoKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgICAgR2V0cyB0aGUgc2lkZS1lZmZlY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBrZXkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij5UaGUga2V5IHRvIGdldCB0aGUgdmFsdWUgZm9yLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGtleS48L3JldHVybnM+Ci0gICAgICAgIG9iamVjdCBHZXQoc3RyaW5nIGtleSk7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICAgIEludmFsaWRhdGVzIHRoZSBzaWRlIGVmZmVjdCBjYWNoZSBmb3IgdHJhdmVyc2FsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICB2b2lkIENsb3NlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9JbnN0cnVjdGlvbi5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9JbnN0cnVjdGlvbi5jcwppbmRleCA2NTg0N2M1Li41NWRmNDRkIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvSW5zdHJ1Y3Rpb24uY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL0luc3RydWN0aW9uLmNzCkBAIC0yMSw2ICsyMSw4IEBACiAKICNlbmRyZWdpb24KIAordXNpbmcgU3lzdGVtOworCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWwKIHsKICAgICAvLy8gPHN1bW1hcnk+CkBAIC00OCw1ICs1MCwxNCBAQAogICAgICAgICAvLy8gICAgIEdldHMgdGhlIGFyZ3VtZW50cy4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIGR5bmFtaWNbXSBBcmd1bWVudHMgeyBnZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8c2VlIGNyZWY9Ikluc3RydWN0aW9uIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE9wZXJhdG9yTmFtZSArICIgWyIgKyBTdHJpbmcuSm9pbigiLCIsIEFyZ3VtZW50cykgKyAiXSI7CisgICAgICAgIH0KICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL05hbWluZ0NvbnZlcnNpb25zLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL05hbWluZ0NvbnZlcnNpb25zLmNzCmluZGV4IGVhZGFhMGUuLmE2NTBkYzUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9OYW1pbmdDb252ZXJzaW9ucy5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvTmFtaW5nQ29udmVyc2lvbnMuY3MKQEAgLTIzLDcgKzIzLDYgQEAKIAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbAogewogICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBOYW1pbmdDb252ZXJzaW9ucwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL09wZXJhdG9yLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL09wZXJhdG9yLmNzCmluZGV4IDhiODdlNDAuLmNlMzM1NjkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9PcGVyYXRvci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvT3BlcmF0b3IuY3MKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2VuZHJlZ2lvbgogCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL09yZGVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL09yZGVyLmNzCmluZGV4IDlmY2UzMzIuLmZjYTY3YWIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9PcmRlci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvT3JkZXIuY3MKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2VuZHJlZ2lvbgogCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIApAQCAtMzgsMjAgKzM3LDE0IEBACiAKICAgICAgICAgcHVibGljIHN0YXRpYyBPcmRlciBBc2MgPT4gbmV3IE9yZGVyKCJhc2MiKTsKIAotICAgICAgICBwdWJsaWMgc3RhdGljIE9yZGVyIERlY3IgPT4gbmV3IE9yZGVyKCJkZWNyIik7Ci0KICAgICAgICAgcHVibGljIHN0YXRpYyBPcmRlciBEZXNjID0+IG5ldyBPcmRlcigiZGVzYyIpOwogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT3JkZXIgSW5jciA9PiBuZXcgT3JkZXIoImluY3IiKTsKLQogICAgICAgICBwdWJsaWMgc3RhdGljIE9yZGVyIFNodWZmbGUgPT4gbmV3IE9yZGVyKCJzaHVmZmxlIik7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSURpY3Rpb25hcnk8c3RyaW5nLCBPcmRlcj4gUHJvcGVydGllcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgT3JkZXI+CiAgICAgICAgIHsKICAgICAgICAgICAgIHsgImFzYyIsIEFzYyB9LAotICAgICAgICAgICAgeyAiZGVjciIsIERlY3IgfSwKICAgICAgICAgICAgIHsgImRlc2MiLCBEZXNjIH0sCi0gICAgICAgICAgICB7ICJpbmNyIiwgSW5jciB9LAogICAgICAgICAgICAgeyAic2h1ZmZsZSIsIFNodWZmbGUgfSwKICAgICAgICAgfTsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1AuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUC5jcwppbmRleCBiODNlM2MyLi5kMzdhNjE0IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUC5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUC5jcwpAQCAtMjEsNyArMjEsNiBAQAogCiAjZW5kcmVnaW9uCiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUGFnZVJhbmsuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUGFnZVJhbmsuY3MKaW5kZXggNzNkMjQ4YS4uNWMyYWRlOSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1BhZ2VSYW5rLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9QYWdlUmFuay5jcwpAQCAtMjEsNyArMjEsNiBAQAogCiAjZW5kcmVnaW9uCiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1BlZXJQcmVzc3VyZS5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9QZWVyUHJlc3N1cmUuY3MKaW5kZXggMTg1ODc5ZS4uZmRlM2I0MSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1BlZXJQcmVzc3VyZS5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUGVlclByZXNzdXJlLmNzCkBAIC0yMSw3ICsyMSw2IEBACiAKICNlbmRyZWdpb24KIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUGljay5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9QaWNrLmNzCmluZGV4IGI3ZGQ4YzIuLmYwMzEyYTMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9QaWNrLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9QaWNrLmNzCkBAIC0yMSw3ICsyMSw2IEBACiAKICNlbmRyZWdpb24KIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9Qb3AuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvUG9wLmNzCmluZGV4IDEyMTBmNWMuLjE5NmNlMDEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9Qb3AuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1BvcC5jcwpAQCAtMjEsNyArMjEsNiBAQAogCiAjZW5kcmVnaW9uCiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvU2NvcGUuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvU2NvcGUuY3MKaW5kZXggMmRmNmE5NS4uZmY3MDA2OSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1Njb3BlLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9TY29wZS5jcwpAQCAtMjEsNyArMjEsNiBAQAogCiAjZW5kcmVnaW9uCiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvU2hvcnRlc3RQYXRoLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1Nob3J0ZXN0UGF0aC5jcwppbmRleCBmMTI1ZTQyLi4yMzhhNWU3IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvU2hvcnRlc3RQYXRoLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9TaG9ydGVzdFBhdGguY3MKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2VuZHJlZ2lvbgogCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9TdHJhdGVneS9EZWNvcmF0aW9uL1NlZWRTdHJhdGVneS5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9TdHJhdGVneS9EZWNvcmF0aW9uL1NlZWRTdHJhdGVneS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjUzMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1N0cmF0ZWd5L0RlY29yYXRpb24vU2VlZFN0cmF0ZWd5LmNzCkBAIC0wLDAgKzEsNTEgQEAKK++7vyNyZWdpb24gTGljZW5zZQorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNlbmRyZWdpb24KKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbC5TdHJhdGVneS5EZWNvcmF0aW9uCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgQSBzdHJhdGVneSB0aGF0IHJlc2V0cyB0aGUgc3BlY2lmaWVkIHtAY29kZSBzZWVkfSB2YWx1ZSBmb3IgU2VlZGFibGUgc3RlcHMgbGlrZSBjb2luKCksIHNhbXBsZSgpCisgICAgLy8vICAgICBhbmQgT3JkZXIuc2h1ZmZsZSwgd2hpY2ggaW4gdHVybiB3aWxsIHByb2R1Y2UgZGV0ZXJtaW5pc3RpYyByZXN1bHRzIGZyb20gdGhvc2Ugc3RlcHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgU2VlZFN0cmF0ZWd5IDogQWJzdHJhY3RUcmF2ZXJzYWxTdHJhdGVneQorICAgIHsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iT3B0aW9uc1N0cmF0ZWd5IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFNlZWRTdHJhdGVneSgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJTZWVkU3RyYXRlZ3kiIC8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlZWQiPlNwZWNpZmllcyB0aGUgc2VlZCB0aGUgdHJhdmVyc2FsIHdpbGwgdXNlLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBTZWVkU3RyYXRlZ3kobG9uZyBzZWVkKQorICAgICAgICB7CisgICAgICAgICAgICBDb25maWd1cmF0aW9uWyJzZWVkIl0gPSBzZWVkOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9ULmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1QuY3MKaW5kZXggODBjYTBlYy4uZTY4OGU4ZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1QuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1QuY3MKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2VuZHJlZ2lvbgogCi0vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUgLSBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBESVJFQ1RMWSAtIHNlZSBwb20ueG1sCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1RleHRQLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1RleHRQLmNzCmluZGV4IDMwNDdmNzUuLmE3N2YyMDYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9UZXh0UC5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvVGV4dFAuY3MKQEAgLTIxLDEyICsyMSw4IEBACiAKICNlbmRyZWdpb24KIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWwKIHsKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9XaXRoT3B0aW9ucy5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9XaXRoT3B0aW9ucy5jcwppbmRleCBjMjBjNTlhLi4wMjI5ZDRjIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvV2l0aE9wdGlvbnMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL1dpdGhPcHRpb25zLmNzCkBAIC0yMSw3ICsyMSw2IEBACiAKICNlbmRyZWdpb24KIAotLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFIC0gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgRElSRUNUTFkgLSBzZWUgcG9tLnhtbAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvX18uY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvUHJvY2Vzcy9UcmF2ZXJzYWwvX18uY3MKaW5kZXggOWJkMGIxNC4uZmExYzAyNyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1Byb2Nlc3MvVHJhdmVyc2FsL19fLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9Qcm9jZXNzL1RyYXZlcnNhbC9fXy5jcwpAQCAtMjQsNyArMjQsNiBAQAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBHcmVtbGluLk5ldC5TdHJ1Y3R1cmU7CiAKLS8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRSAtIERPIE5PVCBNT0RJRlkgVEhJUyBGSUxFIERJUkVDVExZIC0gc2VlIHBvbS54bWwKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbAogewogICAgIC8vLyA8c3VtbWFyeT4KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQmlnSW50ZWdlckRlc2VyaWFsaXplci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQmlnSW50ZWdlckRlc2VyaWFsaXplci5jcwppbmRleCA3NTVkYmNjLi5hM2YxZmY2IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0JpZ0ludGVnZXJEZXNlcmlhbGl6ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9CaWdJbnRlZ2VyRGVzZXJpYWxpemVyLmNzCkBAIC0yMiwxNiArMjIsMTUgQEAKICNlbmRyZWdpb24KIAogdXNpbmcgU3lzdGVtLk51bWVyaWNzOwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewogICAgIGludGVybmFsIGNsYXNzIEJpZ0ludGVnZXJEZXNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uLCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBiaWdJbnRlZ2VyID0gZ3JhcGhzb25PYmplY3QuVG9PYmplY3Q8c3RyaW5nPigpOworICAgICAgICAgICAgdmFyIGJpZ0ludGVnZXIgPSBncmFwaHNvbi5WYWx1ZUtpbmQgPT0gSnNvblZhbHVlS2luZC5TdHJpbmcgPyBncmFwaHNvbi5HZXRTdHJpbmcoKSA6IGdyYXBoc29uLkdldFJhd1RleHQoKTsKICAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLlBhcnNlKGJpZ0ludGVnZXIpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9CdWxrU2V0U2VyaWFsaXplci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQnVsa1NldFNlcmlhbGl6ZXIuY3MKaW5kZXggNThkNGM5Yi4uNTM5MjI0YSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9CdWxrU2V0U2VyaWFsaXplci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0J1bGtTZXRTZXJpYWxpemVyLmNzCkBAIC0yMywxNyArMjMsMTUgQEAKIAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBOZXd0b25zb2Z0Lkpzb24uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KIHsKICAgICBpbnRlcm5hbCBjbGFzcyBCdWxrU2V0U2VyaWFsaXplciA6IElHcmFwaFNPTkRlc2VyaWFsaXplcgogICAgIHsKLSAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpUb2tlbiBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQorICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGpBcnJheSA9IGdyYXBoc29uT2JqZWN0IGFzIEpBcnJheTsKLSAgICAgICAgICAgIGlmIChqQXJyYXkgPT0gbnVsbCkKKyAgICAgICAgICAgIGlmIChncmFwaHNvbk9iamVjdC5WYWx1ZUtpbmQgIT0gSnNvblZhbHVlS2luZC5BcnJheSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpc3Q8b2JqZWN0PigwKTsKICAgICAgICAgICAgIH0KQEAgLTQyLDkgKzQwLDkgQEAKICAgICAgICAgICAgIC8vIHNvIHRoaXMgcXVlcnkgd2lsbCBiZSB0cm91YmxlLiB3ZSdkIG5lZWQgYSBsZWdpdCBCdWxrU2V0IGltcGxlbWVudGF0aW9uIGhlcmUgaW4gQyMuIHRoaXMgY3VycmVudCAKICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGlzIGhlcmUgdG8gcmVwbGljYXRlIHRoZSBwcmV2aW91cyBmdW5jdGlvbmFsaXR5IHRoYXQgZXhpc3RlZCBvbiB0aGUgc2VydmVyIHNpZGUgaW4gCiAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJzaW9ucy4KLSAgICAgICAgICAgIHJldHVybiBFbnVtZXJhYmxlLlJhbmdlKDAsIGpBcnJheS5Db3VudCAvIDIpLlNlbGVjdE1hbnk8aW50LG9iamVjdD4oaSA9PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bWVyYWJsZS5SZXBlYXQ8b2JqZWN0PihyZWFkZXIuVG9PYmplY3QoakFycmF5W2kgKiAyXSksIChpbnQpIHJlYWRlci5Ub09iamVjdChqQXJyYXlbaSAqIDIgKyAxXSkpKS4KLSAgICAgICAgICAgICAgICAgICAgICAgVG9MaXN0KCk7CisgICAgICAgICAgICByZXR1cm4gRW51bWVyYWJsZS5SYW5nZSgwLCBncmFwaHNvbk9iamVjdC5HZXRBcnJheUxlbmd0aCgpIC8gMikuU2VsZWN0TWFueTxpbnQsIG9iamVjdD4oaSA9PgorICAgICAgICAgICAgICAgIEVudW1lcmFibGUuUmVwZWF0PG9iamVjdD4ocmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0W2kgKiAyXSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFtpICogMiArIDFdKSkpLlRvTGlzdCgpOwogICAgICAgICB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQnl0ZUJ1ZmZlckRlc2VyaWFsaXplci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQnl0ZUJ1ZmZlckRlc2VyaWFsaXplci5jcwppbmRleCBmNzdhYmIwLi4wZmViM2EyIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0J5dGVCdWZmZXJEZXNlcmlhbGl6ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9CeXRlQnVmZmVyRGVzZXJpYWxpemVyLmNzCkBAIC0yMSwxNSArMjEsMTUgQEAKICNlbmRyZWdpb24KIAogdXNpbmcgU3lzdGVtOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7CiAgICAgaW50ZXJuYWwgY2xhc3MgQnl0ZUJ1ZmZlckRlc2VyaWFsaXplciA6IElHcmFwaFNPTkRlc2VyaWFsaXplcgogICAgIHsKLSAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpUb2tlbiBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQorICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGJhc2U2NFN0cmluZyA9IGdyYXBoc29uT2JqZWN0LlRvT2JqZWN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIHZhciBiYXNlNjRTdHJpbmcgPSBncmFwaHNvbk9iamVjdC5HZXRTdHJpbmcoKTsKICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoYmFzZTY0U3RyaW5nKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQnl0ZUNvbnZlcnRlci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQnl0ZUNvbnZlcnRlci5jcwppbmRleCA2NTI1ZDUyLi5jOWZjOGE1IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0J5dGVDb252ZXJ0ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9CeXRlQ29udmVydGVyLmNzCkBAIC0yMCwxNCArMjAsMTQgQEAKICAqLwogI2VuZHJlZ2lvbgogCi11c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7Ci0gICAgaW50ZXJuYWwgY2xhc3MgQnl0ZUNvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcgorICAgIGludGVybmFsIGNsYXNzIEJ5dGVDb252ZXJ0ZXIgOiBOdW1iZXJDb252ZXJ0ZXI8Ynl0ZT4KICAgICB7CiAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR3JhcGhTT05UeXBlTmFtZSA9PiAiQnl0ZSI7Ci0gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUeXBlIEhhbmRsZWRUeXBlID0+IHR5cGVvZihieXRlKTsKICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBQcmVmaXggPT4gImd4IjsKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGR5bmFtaWMgRnJvbUpzb25FbGVtZW50KEpzb25FbGVtZW50IGdyYXBoc29uKSA9PiBncmFwaHNvbi5HZXRCeXRlKCk7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQ2hhckNvbnZlcnRlci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQ2hhckNvbnZlcnRlci5jcwppbmRleCBiNzAyM2JlLi4wYzNlNTM5IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0NoYXJDb252ZXJ0ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9DaGFyQ29udmVydGVyLmNzCkBAIC0yMCwxNSArMjAsMTkgQEAKICAqLwogI2VuZHJlZ2lvbgogCi11c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7Ci0gICAgaW50ZXJuYWwgY2xhc3MgQ2hhckNvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcgorICAgIGludGVybmFsIGNsYXNzIENoYXJDb252ZXJ0ZXIgOiBOdW1iZXJDb252ZXJ0ZXI8Y2hhcj4KICAgICB7CiAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR3JhcGhTT05UeXBlTmFtZSA9PiAiQ2hhciI7Ci0gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUeXBlIEhhbmRsZWRUeXBlID0+IHR5cGVvZihjaGFyKTsKICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBQcmVmaXggPT4gImd4IjsKICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgU3RyaW5naWZ5VmFsdWUgPT4gdHJ1ZTsKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGR5bmFtaWMgRnJvbUpzb25FbGVtZW50KEpzb25FbGVtZW50IGdyYXBoc29uKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkQnl0ZSA9IGdyYXBoc29uLkdldFN0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplZEJ5dGVbMF07CisgICAgICAgIH0KICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9EYXRlRGVzZXJpYWxpemVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9EYXRlRGVzZXJpYWxpemVyLmNzCmluZGV4IDk4Y2EyNWUuLmJjNWJmNjEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vRGF0ZURlc2VyaWFsaXplci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RhdGVEZXNlcmlhbGl6ZXIuY3MKQEAgLTIxLDcgKzIxLDcgQEAKICNlbmRyZWdpb24KIAogdXNpbmcgU3lzdGVtOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7CkBAIC0yOSw5ICsyOSw5IEBACiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEYXRlVGltZU9mZnNldCBVbml4U3RhcnQgPSBuZXcgRGF0ZVRpbWVPZmZzZXQoMTk3MCwgMSwgMSwgMCwgMCwgMCwgMCwgVGltZVNwYW4uWmVybyk7CiAKLSAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpUb2tlbiBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQorICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGdyYXBoc29uT2JqZWN0LlRvT2JqZWN0PGxvbmc+KCk7CisgICAgICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZ3JhcGhzb25PYmplY3QuR2V0SW50NjQoKTsKICAgICAgICAgICAgIHJldHVybiBVbml4U3RhcnQuQWRkVGlja3MoVGltZVNwYW4uVGlja3NQZXJNaWxsaXNlY29uZCAqIG1pbGxpc2Vjb25kcyk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RlY2ltYWxDb252ZXJ0ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RlY2ltYWxDb252ZXJ0ZXIuY3MKaW5kZXggNjg2MDEzNy4uZjE5NTUyMiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9EZWNpbWFsQ29udmVydGVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vRGVjaW1hbENvbnZlcnRlci5jcwpAQCAtMjEsMTUgKzIxLDIzIEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7Ci0gICAgaW50ZXJuYWwgY2xhc3MgRGVjaW1hbENvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcgorICAgIGludGVybmFsIGNsYXNzIERlY2ltYWxDb252ZXJ0ZXIgOiBOdW1iZXJDb252ZXJ0ZXI8ZGVjaW1hbD4KICAgICB7CiAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR3JhcGhTT05UeXBlTmFtZSA9PiAiQmlnRGVjaW1hbCI7Ci0gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUeXBlIEhhbmRsZWRUeXBlID0+IHR5cGVvZihkZWNpbWFsKTsKICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBQcmVmaXggPT4gImd4IjsKICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgU3RyaW5naWZ5VmFsdWUgPT4gdHJ1ZTsKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGR5bmFtaWMgRnJvbUpzb25FbGVtZW50KEpzb25FbGVtZW50IGdyYXBoc29uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ3JhcGhzb24uVmFsdWVLaW5kID09IEpzb25WYWx1ZUtpbmQuU3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWNpbWFsLlBhcnNlKGdyYXBoc29uLkdldFN0cmluZygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBncmFwaHNvbi5HZXREZWNpbWFsKCk7CisgICAgICAgIH0KICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9EaXJlY3Rpb25EZXNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RpcmVjdGlvbkRlc2VyaWFsaXplci5jcwppbmRleCA0MDI3MTcxLi4zNGQ0ZjYxIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RpcmVjdGlvbkRlc2VyaWFsaXplci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RpcmVjdGlvbkRlc2VyaWFsaXplci5jcwpAQCAtMjEsMTYgKzIxLDE2IEBACiAKICNlbmRyZWdpb24KIAordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIHVzaW5nIEdyZW1saW4uTmV0LlByb2Nlc3MuVHJhdmVyc2FsOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KIHsKICAgICBpbnRlcm5hbCBjbGFzcyBEaXJlY3Rpb25EZXNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24uR2V0QnlWYWx1ZShncmFwaHNvbk9iamVjdC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24uR2V0QnlWYWx1ZShncmFwaHNvbk9iamVjdC5HZXRTdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9Eb3VibGVDb252ZXJ0ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RvdWJsZUNvbnZlcnRlci5jcwppbmRleCA0MTY0MjNiLi5iYTVhMmY3IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RvdWJsZUNvbnZlcnRlci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0RvdWJsZUNvbnZlcnRlci5jcwpAQCAtMjEsMTMgKzIxLDUyIEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewotICAgIGludGVybmFsIGNsYXNzIERvdWJsZUNvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcgorICAgIGludGVybmFsIGNsYXNzIERvdWJsZUNvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcjxkb3VibGU+CiAgICAgewogICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdyYXBoU09OVHlwZU5hbWUgPT4gIkRvdWJsZSI7Ci0gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUeXBlIEhhbmRsZWRUeXBlID0+IHR5cGVvZihkb3VibGUpOworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBOYU4gPSAiTmFOIjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgUG9zaXRpdmVJbmZpbml0eSA9ICJJbmZpbml0eSI7CisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIE5lZ2F0aXZlSW5maW5pdHkgPSAiLUluZmluaXR5IjsKKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZHluYW1pYyBGcm9tSnNvbkVsZW1lbnQoSnNvbkVsZW1lbnQgZ3JhcGhzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChncmFwaHNvbi5WYWx1ZUtpbmQgPT0gSnNvblZhbHVlS2luZC5TdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChncmFwaHNvbi5HZXRTdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTmFOOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5OYU47CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUG9zaXRpdmVJbmZpbml0eToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGUuUG9zaXRpdmVJbmZpbml0eTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOZWdhdGl2ZUluZmluaXR5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5OZWdhdGl2ZUluZmluaXR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gIAorICAgICAgICAgICAgcmV0dXJuIGdyYXBoc29uLkdldERvdWJsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBDb252ZXJ0SW52YWxpZE51bWJlcihkb3VibGUgbnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZG91YmxlLklzTmFOKG51bWJlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc1Bvc2l0aXZlSW5maW5pdHkobnVtYmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpdmVJbmZpbml0eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc05lZ2F0aXZlSW5maW5pdHkobnVtYmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTmVnYXRpdmVJbmZpbml0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICAgICAgfQogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0R1cmF0aW9uRGVzZXJpYWxpemVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9EdXJhdGlvbkRlc2VyaWFsaXplci5jcwppbmRleCAwMGE5YTcwLi4yYzFkMTdmIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0R1cmF0aW9uRGVzZXJpYWxpemVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vRHVyYXRpb25EZXNlcmlhbGl6ZXIuY3MKQEAgLTIxLDE2ICsyMSwxNiBAQAogCiAjZW5kcmVnaW9uCiAKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KIHsKICAgICBpbnRlcm5hbCBjbGFzcyBEdXJhdGlvbkRlc2VyaWFsaXplciA6IElHcmFwaFNPTkRlc2VyaWFsaXplcgogICAgIHsKLSAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpUb2tlbiBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQorICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gZ3JhcGhzb25PYmplY3QuVG9PYmplY3Q8c3RyaW5nPigpOworICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gZ3JhcGhzb25PYmplY3QuR2V0U3RyaW5nKCk7CiAgICAgICAgICAgICByZXR1cm4gWG1sQ29udmVydC5Ub1RpbWVTcGFuKGR1cmF0aW9uKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vRWRnZURlc2VyaWFsaXplci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vRWRnZURlc2VyaWFsaXplci5jcwppbmRleCA2ZWM4Njk0Li4xM2Y0Y2UwIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0VkZ2VEZXNlcmlhbGl6ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9FZGdlRGVzZXJpYWxpemVyLmNzCkBAIC0yMSwyMiArMjEsMjggQEAKIAogI2VuZHJlZ2lvbgogCi11c2luZyBOZXd0b25zb2Z0Lkpzb24uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KIHsKICAgICBpbnRlcm5hbCBjbGFzcyBFZGdlRGVzZXJpYWxpemVyIDogSUdyYXBoU09ORGVzZXJpYWxpemVyCiAgICAgewotICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSlRva2VuIGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCisgICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKc29uRWxlbWVudCBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgb3V0VklkID0gcmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0WyJvdXRWIl0pOwotICAgICAgICAgICAgdmFyIG91dFZMYWJlbCA9IChzdHJpbmcpIChncmFwaHNvbk9iamVjdFsib3V0VkxhYmVsIl0gPz8gVmVydGV4LkRlZmF1bHRMYWJlbCk7CisgICAgICAgICAgICB2YXIgb3V0VklkID0gcmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0LkdldFByb3BlcnR5KCJvdXRWIikpOworICAgICAgICAgICAgdmFyIG91dFZMYWJlbCA9IGdyYXBoc29uT2JqZWN0LlRyeUdldFByb3BlcnR5KCJvdXRWTGFiZWwiLCBvdXQgdmFyIG91dFZMYWJlbFByb3BlcnR5KQorICAgICAgICAgICAgICAgID8gb3V0VkxhYmVsUHJvcGVydHkuR2V0U3RyaW5nKCkKKyAgICAgICAgICAgICAgICA6IFZlcnRleC5EZWZhdWx0TGFiZWw7CiAgICAgICAgICAgICB2YXIgb3V0ViA9IG5ldyBWZXJ0ZXgob3V0VklkLCBvdXRWTGFiZWwpOwotICAgICAgICAgICAgdmFyIGluVklkID0gcmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0WyJpblYiXSk7Ci0gICAgICAgICAgICB2YXIgaW5WTGFiZWwgPSAoc3RyaW5nKSAoZ3JhcGhzb25PYmplY3RbImluVkxhYmVsIl0gPz8gVmVydGV4LkRlZmF1bHRMYWJlbCk7CisgICAgICAgICAgICB2YXIgaW5WSWQgPSByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3QuR2V0UHJvcGVydHkoImluViIpKTsKKyAgICAgICAgICAgIHZhciBpblZMYWJlbCA9IGdyYXBoc29uT2JqZWN0LlRyeUdldFByb3BlcnR5KCJpblZMYWJlbCIsIG91dCB2YXIgaW5WTGFiZWxQcm9wZXJ0eSkKKyAgICAgICAgICAgICAgICA/IGluVkxhYmVsUHJvcGVydHkuR2V0U3RyaW5nKCkKKyAgICAgICAgICAgICAgICA6IFZlcnRleC5EZWZhdWx0TGFiZWw7CiAgICAgICAgICAgICB2YXIgaW5WID0gbmV3IFZlcnRleChpblZJZCwgaW5WTGFiZWwpOwotICAgICAgICAgICAgdmFyIGVkZ2VJZCA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsiaWQiXSk7Ci0gICAgICAgICAgICB2YXIgZWRnZUxhYmVsID0gKHN0cmluZykgZ3JhcGhzb25PYmplY3RbImxhYmVsIl0gPz8gImVkZ2UiOworICAgICAgICAgICAgdmFyIGVkZ2VJZCA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdC5HZXRQcm9wZXJ0eSgiaWQiKSk7CisgICAgICAgICAgICB2YXIgZWRnZUxhYmVsID0gZ3JhcGhzb25PYmplY3QuVHJ5R2V0UHJvcGVydHkoImxhYmVsIiwgb3V0IHZhciBsYWJlbFByb3BlcnR5KQorICAgICAgICAgICAgICAgID8gbGFiZWxQcm9wZXJ0eS5HZXRTdHJpbmcoKQorICAgICAgICAgICAgICAgIDogImVkZ2UiOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBFZGdlKGVkZ2VJZCwgb3V0ViwgZWRnZUxhYmVsLCBpblYpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9GbG9hdENvbnZlcnRlci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vRmxvYXRDb252ZXJ0ZXIuY3MKaW5kZXggNDMyYWVhYi4uNWJiZDliMiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9GbG9hdENvbnZlcnRlci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0Zsb2F0Q29udmVydGVyLmNzCkBAIC0yMSwxMyArMjEsMTMgQEAKIAogI2VuZHJlZ2lvbgogCi11c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7Ci0gICAgaW50ZXJuYWwgY2xhc3MgRmxvYXRDb252ZXJ0ZXIgOiBOdW1iZXJDb252ZXJ0ZXIKKyAgICBpbnRlcm5hbCBjbGFzcyBGbG9hdENvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcjxmbG9hdD4KICAgICB7CiAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR3JhcGhTT05UeXBlTmFtZSA9PiAiRmxvYXQiOwotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVHlwZSBIYW5kbGVkVHlwZSA9PiB0eXBlb2YoZmxvYXQpOworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZHluYW1pYyBGcm9tSnNvbkVsZW1lbnQoSnNvbkVsZW1lbnQgZ3JhcGhzb24pID0+IGdyYXBoc29uLkdldFNpbmdsZSgpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0dyYXBoU09OUmVhZGVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9HcmFwaFNPTlJlYWRlci5jcwppbmRleCA2MzY0MWYwLi4xNjkwMWJkIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0dyYXBoU09OUmVhZGVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vR3JhcGhTT05SZWFkZXIuY3MKQEAgLTI0LDcgKzI0LDcgQEAKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBOZXd0b25zb2Z0Lkpzb24uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KIHsKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJncmFwaFNvbkRhdGEiPlRoZSBHcmFwaFNPTiBjb2xsZWN0aW9uIHRvIGRlc2VyaWFsaXplLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZGVzZXJpYWxpemVkIG9iamVjdC48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIGR5bmFtaWMgVG9PYmplY3QoSUVudW1lcmFibGU8SlRva2VuPiBncmFwaFNvbkRhdGEpCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGR5bmFtaWMgVG9PYmplY3QoSUVudW1lcmFibGU8SnNvbkVsZW1lbnQ+IGdyYXBoU29uRGF0YSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGdyYXBoU29uRGF0YS5TZWxlY3QoZ3JhcGhzb24gPT4gVG9PYmplY3QoZ3JhcGhzb24pKTsKICAgICAgICAgfQpAQCAtOTgsNTIgKzk4LDUwIEBACiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vICAgICBEZXNlcmlhbGl6ZXMgR3JhcGhTT04gdG8gYW4gb2JqZWN0LgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImpUb2tlbiI+VGhlIEdyYXBoU09OIHRvIGRlc2VyaWFsaXplLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZ3JhcGhTb24iPlRoZSBHcmFwaFNPTiB0byBkZXNlcmlhbGl6ZS48L3BhcmFtPgogICAgICAgICAvLy8gPHJldHVybnM+VGhlIGRlc2VyaWFsaXplZCBvYmplY3QuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgdmlydHVhbCBkeW5hbWljIFRvT2JqZWN0KEpUb2tlbiBqVG9rZW4pCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGR5bmFtaWMgVG9PYmplY3QoSnNvbkVsZW1lbnQgZ3JhcGhTb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChqVG9rZW4gaXMgSkFycmF5KQorICAgICAgICAgICAgc3dpdGNoIChncmFwaFNvbi5WYWx1ZUtpbmQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGpUb2tlbi5TZWxlY3QodCA9PiBUb09iamVjdCh0KSk7CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLkFycmF5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JhcGhTb24uRW51bWVyYXRlQXJyYXkoKS5TZWxlY3QodCA9PiBUb09iamVjdCh0KSk7CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYXBoU29uLkdldFN0cmluZygpOworICAgICAgICAgICAgICAgIGNhc2UgSnNvblZhbHVlS2luZC5OdWxsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBjYXNlIEpzb25WYWx1ZUtpbmQuVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLkZhbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLk9iamVjdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YoZ3JhcGhTb24uVmFsdWVLaW5kKSwgZ3JhcGhTb24uVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJKU09OIHR5cGUgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqVG9rZW4gaXMgSlZhbHVlIGpWYWx1ZSkKKworICAgICAgICAgICAgaWYgKGdyYXBoU29uLlRyeUdldFByb3BlcnR5KEdyYXBoU09OVG9rZW5zLlR5cGVLZXksIG91dCB2YXIgZ3JhcGhTb25UeXBlUHJvcGVydHkpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBqVmFsdWUuVmFsdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRWYWx1ZU9mVHlwZShncmFwaFNvbiwgZ3JhcGhTb25UeXBlUHJvcGVydHkuR2V0U3RyaW5nKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFIYXNUeXBlS2V5KGpUb2tlbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWREaWN0aW9uYXJ5KGpUb2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUmVhZFR5cGVkVmFsdWUoalRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBSZWFkRGljdGlvbmFyeShncmFwaFNvbik7CisgICAgICAgICAgICAKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgYm9vbCBIYXNUeXBlS2V5KEpUb2tlbiBqVG9rZW4pCisgICAgICAgIHByaXZhdGUgZHluYW1pYyBSZWFkVmFsdWVPZlR5cGUoSnNvbkVsZW1lbnQgdHlwZWRWYWx1ZSwgc3RyaW5nIGdyYXBoU09OVHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGdyYXBoU09OVHlwZSA9IChzdHJpbmcpIGpUb2tlbltHcmFwaFNPTlRva2Vucy5UeXBlS2V5XTsKLSAgICAgICAgICAgIHJldHVybiBncmFwaFNPTlR5cGUgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZHluYW1pYyBSZWFkVHlwZWRWYWx1ZShKVG9rZW4gdHlwZWRWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGdyYXBoU09OVHlwZSA9IChzdHJpbmcpIHR5cGVkVmFsdWVbR3JhcGhTT05Ub2tlbnMuVHlwZUtleV07CiAgICAgICAgICAgICBpZiAoIURlc2VyaWFsaXplcnMuVHJ5R2V0VmFsdWUoZ3JhcGhTT05UeXBlLCBvdXQgdmFyIGRlc2VyaWFsaXplcikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oJCJEZXNlcmlhbGl6ZXIgZm9yIFwie2dyYXBoU09OVHlwZX1cIiBub3QgZm91bmQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZXIuT2JqZWN0aWZ5KHR5cGVkVmFsdWVbR3JhcGhTT05Ub2tlbnMuVmFsdWVLZXldLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZXIuT2JqZWN0aWZ5KHR5cGVkVmFsdWUuR2V0UHJvcGVydHkoR3JhcGhTT05Ub2tlbnMuVmFsdWVLZXkpLCB0aGlzKTsKICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZHluYW1pYyBSZWFkRGljdGlvbmFyeShKVG9rZW4ganRva2VuRGljdCkKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgZHluYW1pYyBSZWFkRGljdGlvbmFyeShKc29uRWxlbWVudCBqc29uRGljdCkKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGRpY3QgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGR5bmFtaWM+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZSBpbiBqdG9rZW5EaWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGUgYXMgSlByb3BlcnR5OwotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigkIkNhbm5vdCByZWFkIGdyYXBoc29uOiB7anRva2VuRGljdH0iKTsKLSAgICAgICAgICAgICAgICBkaWN0LkFkZChwcm9wZXJ0eS5OYW1lLCBUb09iamVjdChwcm9wZXJ0eS5WYWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRpY3Q7CisgICAgICAgICAgICByZXR1cm4ganNvbkRpY3QuRW51bWVyYXRlT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAuVG9EaWN0aW9uYXJ5KHByb3BlcnR5ID0+IHByb3BlcnR5Lk5hbWUsIHByb3BlcnR5ID0+IFRvT2JqZWN0KHByb3BlcnR5LlZhbHVlKSk7CiAgICAgICAgIH0KICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9HcmFwaFNPTldyaXRlci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vR3JhcGhTT05Xcml0ZXIuY3MKaW5kZXggZGJhNmU2MC4uZGQ0ZmEyNyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9HcmFwaFNPTldyaXRlci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0dyYXBoU09OV3JpdGVyLmNzCkBAIC0yNiwxMSArMjYsMTEgQEAKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7CiB1c2luZyBTeXN0ZW0uTnVtZXJpY3M7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0LkVuY29kaW5ncy5XZWI7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogdXNpbmcgR3JlbWxpbi5OZXQuRHJpdmVyLk1lc3NhZ2VzOwogdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWw7CiB1c2luZyBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbC5TdHJhdGVneTsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewpAQCAtMzksNiArMzksOSBAQAogICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoU09OV3JpdGVyCiAgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBKc29uU2VyaWFsaXplck9wdGlvbnMgX2pzb25PcHRpb25zID0gbmV3IEpzb25TZXJpYWxpemVyT3B0aW9ucworICAgICAgICAgICAge0VuY29kZXIgPSBKYXZhU2NyaXB0RW5jb2Rlci5VbnNhZmVSZWxheGVkSnNvbkVzY2FwaW5nfTsKKyAgICAgICAgCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBvZiBzZXJpYWxpemVycyBieSB0eXBlLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgpAQCAtMTAzLDcgKzEwNiw3IEBACiAgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgc2VyaWFsaXplZCBHcmFwaFNPTi48L3JldHVybnM+CiAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBXcml0ZU9iamVjdChkeW5hbWljIG9iamVjdERhdGEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBKc29uQ29udmVydC5TZXJpYWxpemVPYmplY3QoVG9EaWN0KG9iamVjdERhdGEpKTsKKyAgICAgICAgICAgIHJldHVybiBKc29uU2VyaWFsaXplci5TZXJpYWxpemUoVG9EaWN0KG9iamVjdERhdGEpLCBfanNvbk9wdGlvbnMpOwogICAgICAgICB9CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgpAQCAtMTEzLDE3ICsxMTYsMjAgQEAKICAgICAgICAgLy8vIDxyZXR1cm5zPkEgR3JhcGhTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdCByZWFkeSB0byBiZSBzZXJpYWxpemVkLjwvcmV0dXJucz4KICAgICAgICAgcHVibGljIGR5bmFtaWMgVG9EaWN0KGR5bmFtaWMgb2JqZWN0RGF0YSkKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHR5cGUgPSBvYmplY3REYXRhLkdldFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChvYmplY3REYXRhICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBvYmplY3REYXRhLkdldFR5cGUoKTsKIAotICAgICAgICAgICAgSUdyYXBoU09OU2VyaWFsaXplciBzZXJpYWxpemVyID0gVHJ5R2V0U2VyaWFsaXplckZvcih0eXBlKTsKKyAgICAgICAgICAgICAgICBJR3JhcGhTT05TZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBUcnlHZXRTZXJpYWxpemVyRm9yKHR5cGUpOwogCi0gICAgICAgICAgICBpZiAoc2VyaWFsaXplciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVyLkRpY3RpZnkob2JqZWN0RGF0YSwgdGhpcyk7Ci0gICAgICAgICAgICBpZiAoSXNEaWN0aW9uYXJ5VHlwZSh0eXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRGljdFRvR3JhcGhTT05EaWN0KG9iamVjdERhdGEpOwotICAgICAgICAgICAgaWYgKElzQ29sbGVjdGlvblR5cGUodHlwZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25Ub0dyYXBoU09OQ29sbGVjdGlvbihvYmplY3REYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3REYXRhOworICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVyLkRpY3RpZnkob2JqZWN0RGF0YSwgdGhpcyk7CisgICAgICAgICAgICAgICAgaWYgKElzRGljdGlvbmFyeVR5cGUodHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWN0VG9HcmFwaFNPTkRpY3Qob2JqZWN0RGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKElzQ29sbGVjdGlvblR5cGUodHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uVG9HcmFwaFNPTkNvbGxlY3Rpb24ob2JqZWN0RGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0RGF0YTsgICAgICAgICAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgSUdyYXBoU09OU2VyaWFsaXplciBUcnlHZXRTZXJpYWxpemVyRm9yKFR5cGUgdHlwZSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vSUdyYXBoU09ORGVzZXJpYWxpemVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9JR3JhcGhTT05EZXNlcmlhbGl6ZXIuY3MKaW5kZXggYjE1YjE2OS4uZTBjNDk5MyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9JR3JhcGhTT05EZXNlcmlhbGl6ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9JR3JhcGhTT05EZXNlcmlhbGl6ZXIuY3MKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2VuZHJlZ2lvbgogCi11c2luZyBOZXd0b25zb2Z0Lkpzb24uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KIHsKQEAgLTM2LDYgKzM2LDYgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJncmFwaHNvbk9iamVjdCI+VGhlIEdyYXBoU09OIG9iamVjdCB0byBvYmplY3RpZnkuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZWFkZXIiPkEgPHNlZSBjcmVmPSJHcmFwaFNPTlJlYWRlciIgLz4gdGhhdCBjYW4gYmUgdXNlZCB0byBvYmplY3RpZnkgcHJvcGVydGllcyBvZiB0aGUgR3JhcGhTT04gb2JqZWN0LjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZGVzZXJpYWxpemVkIG9iamVjdC48L3JldHVybnM+Ci0gICAgICAgIGR5bmFtaWMgT2JqZWN0aWZ5KEpUb2tlbiBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKTsKKyAgICAgICAgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcik7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vSW50MTZDb252ZXJ0ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0ludDE2Q29udmVydGVyLmNzCmluZGV4IGFiZTVhNzcuLjYxODJkZTkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vSW50MTZDb252ZXJ0ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9JbnQxNkNvbnZlcnRlci5jcwpAQCAtMjEsMTQgKzIxLDE1IEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewotICAgIGludGVybmFsIGNsYXNzIEludDE2Q29udmVydGVyIDogTnVtYmVyQ29udmVydGVyCisgICAgaW50ZXJuYWwgY2xhc3MgSW50MTZDb252ZXJ0ZXIgOiBOdW1iZXJDb252ZXJ0ZXI8c2hvcnQ+CiAgICAgewogICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdyYXBoU09OVHlwZU5hbWUgPT4gIkludDE2IjsKLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFR5cGUgSGFuZGxlZFR5cGUgPT4gdHlwZW9mKHNob3J0KTsKICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBQcmVmaXggPT4gImd4IjsKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBkeW5hbWljIEZyb21Kc29uRWxlbWVudChKc29uRWxlbWVudCBncmFwaHNvbikgPT4gZ3JhcGhzb24uR2V0SW50MTYoKTsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9JbnQzMkNvbnZlcnRlci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vSW50MzJDb252ZXJ0ZXIuY3MKaW5kZXggMDUyZjkzOC4uNmNkY2RmZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9JbnQzMkNvbnZlcnRlci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0ludDMyQ29udmVydGVyLmNzCkBAIC0yMSwxMyArMjEsMTQgQEAKIAogI2VuZHJlZ2lvbgogCi11c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7Ci0gICAgaW50ZXJuYWwgY2xhc3MgSW50MzJDb252ZXJ0ZXIgOiBOdW1iZXJDb252ZXJ0ZXIKKyAgICBpbnRlcm5hbCBjbGFzcyBJbnQzMkNvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcjxpbnQ+CiAgICAgewogICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdyYXBoU09OVHlwZU5hbWUgPT4gIkludDMyIjsKLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFR5cGUgSGFuZGxlZFR5cGUgPT4gdHlwZW9mKGludCk7CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGR5bmFtaWMgRnJvbUpzb25FbGVtZW50KEpzb25FbGVtZW50IGdyYXBoc29uKSA9PiBncmFwaHNvbi5HZXRJbnQzMigpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0ludDY0Q29udmVydGVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9JbnQ2NENvbnZlcnRlci5jcwppbmRleCBkZDAxNjBmLi5jMDE5MmE4IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0ludDY0Q29udmVydGVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vSW50NjRDb252ZXJ0ZXIuY3MKQEAgLTIxLDEzICsyMSwxNCBAQAogCiAjZW5kcmVnaW9uCiAKLXVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KIHsKLSAgICBpbnRlcm5hbCBjbGFzcyBJbnQ2NENvbnZlcnRlciA6IE51bWJlckNvbnZlcnRlcgorICAgIGludGVybmFsIGNsYXNzIEludDY0Q29udmVydGVyIDogTnVtYmVyQ29udmVydGVyPGxvbmc+CiAgICAgewogICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdyYXBoU09OVHlwZU5hbWUgPT4gIkludDY0IjsKLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFR5cGUgSGFuZGxlZFR5cGUgPT4gdHlwZW9mKGxvbmcpOworICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGR5bmFtaWMgRnJvbUpzb25FbGVtZW50KEpzb25FbGVtZW50IGdyYXBoc29uKSA9PiBncmFwaHNvbi5HZXRJbnQ2NCgpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0xpc3RTZXJpYWxpemVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9MaXN0U2VyaWFsaXplci5jcwppbmRleCBmNDMyYzdlLi5hZGQ4ZWI1IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL0xpc3RTZXJpYWxpemVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vTGlzdFNlcmlhbGl6ZXIuY3MKQEAgLTIxLDEyICsyMSw4IEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5XaW4zMi5TYWZlSGFuZGxlczsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewpAQCAtMzQsMTcgKzMwLDE2IEBACiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJUmVhZE9ubHlMaXN0PG9iamVjdD4gRW1wdHlMaXN0ID0gbmV3IG9iamVjdFswXTsKICAgICAgICAgCi0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBqQXJyYXkgPSBncmFwaHNvbk9iamVjdCBhcyBKQXJyYXk7Ci0gICAgICAgICAgICBpZiAoakFycmF5ID09IG51bGwpCisgICAgICAgICAgICBpZiAoZ3JhcGhzb25PYmplY3QuVmFsdWVLaW5kICE9IEpzb25WYWx1ZUtpbmQuQXJyYXkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVtcHR5TGlzdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0W2pBcnJheS5Db3VudF07CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdFtncmFwaHNvbk9iamVjdC5HZXRBcnJheUxlbmd0aCgpXTsKICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lkxlbmd0aDsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlYWRlci5Ub09iamVjdChqQXJyYXlbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFtpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBvYmplY3RbXSBpbXBsZW1lbnRzIElMaXN0PG9iamVjdD4KICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL01hcFNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL01hcFNlcmlhbGl6ZXIuY3MKaW5kZXggYTA5NmUzZS4uOTkxNjVhNyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9NYXBTZXJpYWxpemVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vTWFwU2VyaWFsaXplci5jcwpAQCAtMjQsMjMgKzI0LDIyIEBACiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewogICAgIGludGVybmFsIGNsYXNzIE1hcFNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIsIElHcmFwaFNPTlNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBqQXJyYXkgPSBncmFwaHNvbk9iamVjdCBhcyBKQXJyYXk7Ci0gICAgICAgICAgICBpZiAoakFycmF5ID09IG51bGwpCisgICAgICAgICAgICBpZiAoZ3JhcGhzb25PYmplY3QuVmFsdWVLaW5kICE9IEpzb25WYWx1ZUtpbmQuQXJyYXkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEaWN0aW9uYXJ5PG9iamVjdCwgb2JqZWN0PigwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgRGljdGlvbmFyeTxvYmplY3QsIG9iamVjdD4oakFycmF5LkNvdW50IC8gMik7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpBcnJheS5Db3VudDsgaSArPSAyKQorICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBEaWN0aW9uYXJ5PG9iamVjdCwgb2JqZWN0PihncmFwaHNvbk9iamVjdC5HZXRBcnJheUxlbmd0aCgpIC8gMik7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYXBoc29uT2JqZWN0LkdldEFycmF5TGVuZ3RoKCk7IGkgKz0gMikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbcmVhZGVyLlRvT2JqZWN0KGpBcnJheVtpXSldID0gcmVhZGVyLlRvT2JqZWN0KGpBcnJheVtpICsgMV0pOworICAgICAgICAgICAgICAgIHJlc3VsdFtyZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3RbaV0pXSA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFtpICsgMV0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSURpY3Rpb25hcnk8b2JqZWN0LCBvYmplY3Q+CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDgsOCArNDcsNyBAQAogICAgICAgICAKICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBkeW5hbWljPiBEaWN0aWZ5KGR5bmFtaWMgb2JqZWN0RGF0YSwgR3JhcGhTT05Xcml0ZXIgd3JpdGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gb2JqZWN0RGF0YSBhcyBJRGljdGlvbmFyeTsKLSAgICAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIGlmICghKG9iamVjdERhdGEgaXMgSURpY3Rpb25hcnkgbWFwKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiT2JqZWN0IG11c3QgaW1wbGVtZW50IElEaWN0aW9uYXJ5Iik7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL051bWJlckNvbnZlcnRlci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vTnVtYmVyQ29udmVydGVyLmNzCmluZGV4IDgxMjc0MTUuLjQ0OTI2ODUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vTnVtYmVyQ29udmVydGVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vTnVtYmVyQ29udmVydGVyLmNzCkBAIC0yMSwzMyArMjEsMzYgQEAKIAogI2VuZHJlZ2lvbgogCi11c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7Ci0gICAgaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgTnVtYmVyQ29udmVydGVyIDogSUdyYXBoU09ORGVzZXJpYWxpemVyLCBJR3JhcGhTT05TZXJpYWxpemVyCisgICAgaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgTnVtYmVyQ29udmVydGVyPFQ+IDogSUdyYXBoU09ORGVzZXJpYWxpemVyLCBJR3JhcGhTT05TZXJpYWxpemVyCiAgICAgewogICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RyaW5nIEdyYXBoU09OVHlwZU5hbWUgeyBnZXQ7IH0KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFR5cGUgSGFuZGxlZFR5cGUgeyBnZXQ7IH0KICAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgc3RyaW5nIFByZWZpeCA9PiAiZyI7CiAgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGJvb2wgU3RyaW5naWZ5VmFsdWUgPT4gZmFsc2U7CiAKLSAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpUb2tlbiBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQorICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdyYXBoc29uT2JqZWN0LlRvT2JqZWN0KEhhbmRsZWRUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBGcm9tSnNvbkVsZW1lbnQoZ3JhcGhzb25PYmplY3QpOwogICAgICAgICB9CiAKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGR5bmFtaWMgRnJvbUpzb25FbGVtZW50KEpzb25FbGVtZW50IGdyYXBoc29uKTsKKwogICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIGR5bmFtaWM+IERpY3RpZnkoZHluYW1pYyBvYmplY3REYXRhLCBHcmFwaFNPTldyaXRlciB3cml0ZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9IG9iamVjdERhdGE7CisgICAgICAgICAgICBUIG51bWJlciA9IG9iamVjdERhdGE7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBDb252ZXJ0SW52YWxpZE51bWJlcihudW1iZXIpOwogICAgICAgICAgICAgaWYgKFN0cmluZ2lmeVZhbHVlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nLkZvcm1hdChDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCAiezB9IiwgdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC5Ub1R5cGVkVmFsdWUoR3JhcGhTT05UeXBlTmFtZSwgdmFsdWUsIFByZWZpeCk7CiAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBvYmplY3QgQ29udmVydEludmFsaWROdW1iZXIoVCBudW1iZXIpID0+IG51bWJlcjsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9QYXRoM0Rlc2VyaWFsaXplci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vUGF0aDNEZXNlcmlhbGl6ZXIuY3MKaW5kZXggNDc1NDEzNS4uZDA1NjYzYiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9QYXRoM0Rlc2VyaWFsaXplci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1BhdGgzRGVzZXJpYWxpemVyLmNzCkBAIC0yMywyMSArMjMsMjEgQEAKIAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewogICAgIGludGVybmFsIGNsYXNzIFBhdGgzRGVzZXJpYWxpemVyIDogSUdyYXBoU09ORGVzZXJpYWxpemVyCiAgICAgewotICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSlRva2VuIGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCisgICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKc29uRWxlbWVudCBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyAibGFiZWxzIiBpcyBhIG9iamVjdFtdIHdoZXJlIGVhY2ggaXRlbSBpcyBJU2V0PG9iamVjdD4KLSAgICAgICAgICAgIHZhciBsYWJlbFByb3BlcnR5ID0gKG9iamVjdFtdKXJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsibGFiZWxzIl0pOworICAgICAgICAgICAgdmFyIGxhYmVsUHJvcGVydHkgPSAob2JqZWN0W10pcmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0LkdldFByb3BlcnR5KCJsYWJlbHMiKSk7CiAgICAgICAgICAgICB2YXIgbGFiZWxzID0gbGFiZWxQcm9wZXJ0eQogICAgICAgICAgICAgICAgIC5TZWxlY3QoeCA9PiBuZXcgSGFzaFNldDxzdHJpbmc+KCgoSVNldDxvYmplY3Q+KXgpLkNhc3Q8c3RyaW5nPigpKSkKICAgICAgICAgICAgICAgICAuVG9MaXN0PElTZXQ8c3RyaW5nPj4oKTsKICAgICAgICAgICAgIC8vICJvYmplY3RzIiBpcyBhbiBvYmplY3RbXQotICAgICAgICAgICAgb2JqZWN0W10gb2JqZWN0cyA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsib2JqZWN0cyJdKTsKKyAgICAgICAgICAgIG9iamVjdFtdIG9iamVjdHMgPSByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3QuR2V0UHJvcGVydHkoIm9iamVjdHMiKSk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGgobGFiZWxzLCBvYmplY3RzKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vUGF0aERlc2VyaWFsaXplci5jcyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vUGF0aERlc2VyaWFsaXplci5jcwppbmRleCBiMzIyZGY4Li4zYTM3ZjY2IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1BhdGhEZXNlcmlhbGl6ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9QYXRoRGVzZXJpYWxpemVyLmNzCkBAIC0yMywxOSArMjMsMjEgQEAKIAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewogICAgIGludGVybmFsIGNsYXNzIFBhdGhEZXNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZhciBsYWJlbHMgPQotICAgICAgICAgICAgICAgIGdyYXBoc29uT2JqZWN0WyJsYWJlbHMiXQotICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHJlYWRPYmpMYWJlbHMgPT4gbmV3IEhhc2hTZXQ8c3RyaW5nPihyZWFkT2JqTGFiZWxzLlNlbGVjdChsID0+IChzdHJpbmcpIGwpKSkKKyAgICAgICAgICAgICAgICBncmFwaHNvbk9iamVjdC5HZXRQcm9wZXJ0eSgibGFiZWxzIikuRW51bWVyYXRlQXJyYXkoKQorICAgICAgICAgICAgICAgICAgICAuU2VsZWN0KHJlYWRPYmpMYWJlbHMgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PHN0cmluZz4ocmVhZE9iakxhYmVscy5FbnVtZXJhdGVBcnJheSgpLlNlbGVjdChsID0+IGwuR2V0U3RyaW5nKCkpKSkKICAgICAgICAgICAgICAgICAgICAgLlRvTGlzdDxJU2V0PHN0cmluZz4+KCk7Ci0gICAgICAgICAgICB2YXIgb2JqZWN0cyA9IGdyYXBoc29uT2JqZWN0WyJvYmplY3RzIl0uU2VsZWN0KG8gPT4gcmVhZGVyLlRvT2JqZWN0KG8pKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHZhciBvYmplY3RzID0gZ3JhcGhzb25PYmplY3QuR2V0UHJvcGVydHkoIm9iamVjdHMiKS5FbnVtZXJhdGVBcnJheSgpLlNlbGVjdChvID0+IHJlYWRlci5Ub09iamVjdChvKSkKKyAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGgobGFiZWxzLCBvYmplY3RzKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vUHJvcGVydHlEZXNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1Byb3BlcnR5RGVzZXJpYWxpemVyLmNzCmluZGV4IDExZjE2MGUuLjdjOWVhMGMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vUHJvcGVydHlEZXNlcmlhbGl6ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9Qcm9wZXJ0eURlc2VyaWFsaXplci5jcwpAQCAtMjEsMTcgKzIxLDE5IEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7CiAgICAgaW50ZXJuYWwgY2xhc3MgUHJvcGVydHlEZXNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBrZXkgPSAoc3RyaW5nKSBncmFwaHNvbk9iamVjdFsia2V5Il07Ci0gICAgICAgICAgICB2YXIgdmFsdWUgPSByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3RbInZhbHVlIl0pOwotICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBncmFwaHNvbk9iamVjdFsiZWxlbWVudCJdICE9IG51bGwgPyByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3RbImVsZW1lbnQiXSkgOiBudWxsOworICAgICAgICAgICAgdmFyIGtleSA9IGdyYXBoc29uT2JqZWN0LkdldFByb3BlcnR5KCJrZXkiKS5HZXRTdHJpbmcoKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdC5HZXRQcm9wZXJ0eSgidmFsdWUiKSk7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGdyYXBoc29uT2JqZWN0LlRyeUdldFByb3BlcnR5KCJlbGVtZW50Iiwgb3V0IHZhciBlbGVtZW50UHJvcGVydHkpCisgICAgICAgICAgICAgICAgPyByZWFkZXIuVG9PYmplY3QoZWxlbWVudFByb3BlcnR5KQorICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHkoa2V5LCB2YWx1ZSwgZWxlbWVudCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1NldFNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1NldFNlcmlhbGl6ZXIuY3MKaW5kZXggZTY1N2JkOC4uNTkwMzkyZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9TZXRTZXJpYWxpemVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vU2V0U2VyaWFsaXplci5jcwpAQCAtMjEsMjQgKzIxLDIyIEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewogICAgIGludGVybmFsIGNsYXNzIFNldFNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIsIElHcmFwaFNPTlNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBqQXJyYXkgPSBncmFwaHNvbk9iamVjdCBhcyBKQXJyYXk7Ci0gICAgICAgICAgICBpZiAoakFycmF5ID09IG51bGwpCisgICAgICAgICAgICBpZiAoZ3JhcGhzb25PYmplY3QuVmFsdWVLaW5kICE9IEpzb25WYWx1ZUtpbmQuQXJyYXkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PG9iamVjdD4oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElTZXQ8b2JqZWN0PgotICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PG9iamVjdD4oakFycmF5LlNlbGVjdChyZWFkZXIuVG9PYmplY3QpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxvYmplY3Q+KGdyYXBoc29uT2JqZWN0LkVudW1lcmF0ZUFycmF5KCkuU2VsZWN0KHJlYWRlci5Ub09iamVjdCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBkeW5hbWljPiBEaWN0aWZ5KGR5bmFtaWMgb2JqZWN0RGF0YSwgR3JhcGhTT05Xcml0ZXIgd3JpdGVyKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9URGVzZXJpYWxpemVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9URGVzZXJpYWxpemVyLmNzCmluZGV4IGEzZDk3MmYuLmVmYmM1NDIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vVERlc2VyaWFsaXplci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1REZXNlcmlhbGl6ZXIuY3MKQEAgLTIxLDE2ICsyMSwxNiBAQAogCiAjZW5kcmVnaW9uCiAKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiB1c2luZyBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbDsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7CiAgICAgaW50ZXJuYWwgY2xhc3MgVERlc2VyaWFsaXplciA6IElHcmFwaFNPTkRlc2VyaWFsaXplcgogICAgIHsKLSAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpUb2tlbiBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQorICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFQuR2V0QnlWYWx1ZShncmFwaHNvbk9iamVjdC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBULkdldEJ5VmFsdWUoZ3JhcGhzb25PYmplY3QuR2V0U3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vVHJhdmVyc2VyUmVhZGVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9UcmF2ZXJzZXJSZWFkZXIuY3MKaW5kZXggYWJiYjQ1Zi4uMTk5NzMyNSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9UcmF2ZXJzZXJSZWFkZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9UcmF2ZXJzZXJSZWFkZXIuY3MKQEAgLTIxLDE3ICsyMSwxNyBAQAogCiAjZW5kcmVnaW9uCiAKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiB1c2luZyBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbDsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7CiAgICAgaW50ZXJuYWwgY2xhc3MgVHJhdmVyc2VyUmVhZGVyIDogSUdyYXBoU09ORGVzZXJpYWxpemVyCiAgICAgewotICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSlRva2VuIGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCisgICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKc29uRWxlbWVudCBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYnVsa09iaiA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsiYnVsayJdKTsKLSAgICAgICAgICAgIHZhciB2YWx1ZU9iaiA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsidmFsdWUiXSk7CisgICAgICAgICAgICB2YXIgYnVsa09iaiA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdC5HZXRQcm9wZXJ0eSgiYnVsayIpKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZU9iaiA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdC5HZXRQcm9wZXJ0eSgidmFsdWUiKSk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFRyYXZlcnNlcih2YWx1ZU9iaiwgYnVsa09iaik7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1V1aWREZXNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1V1aWREZXNlcmlhbGl6ZXIuY3MKaW5kZXggODJjYTQzZC4uNThjYWFjNyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9VdWlkRGVzZXJpYWxpemVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vVXVpZERlc2VyaWFsaXplci5jcwpAQCAtMjIsMTUgKzIyLDE3IEBACiAjZW5kcmVnaW9uCiAKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQuSnNvbjsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTgogewogICAgIGludGVybmFsIGNsYXNzIFV1aWREZXNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBncmFwaHNvbk9iamVjdC5Ub09iamVjdDxHdWlkPigpOworICAgICAgICAgICAgdmFyIHV1aWRTdHJpbmcgPSBncmFwaHNvbk9iamVjdC5HZXRTdHJpbmcoKTsKKworICAgICAgICAgICAgcmV0dXJuIEd1aWQuUGFyc2UodXVpZFN0cmluZyk7CiAgICAgICAgIH0KICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9WZXJ0ZXhEZXNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1ZlcnRleERlc2VyaWFsaXplci5jcwppbmRleCBmMWQ2NGVkLi43MjYxNWVmIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1ZlcnRleERlc2VyaWFsaXplci5jcworKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1ZlcnRleERlc2VyaWFsaXplci5jcwpAQCAtMjEsMTYgKzIxLDE4IEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7CiAgICAgaW50ZXJuYWwgY2xhc3MgVmVydGV4RGVzZXJpYWxpemVyIDogSUdyYXBoU09ORGVzZXJpYWxpemVyCiAgICAgewotICAgICAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSlRva2VuIGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCisgICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKc29uRWxlbWVudCBncmFwaHNvbk9iamVjdCwgR3JhcGhTT05SZWFkZXIgcmVhZGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaWQgPSByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3RbImlkIl0pOwotICAgICAgICAgICAgdmFyIGxhYmVsID0gKHN0cmluZykgZ3JhcGhzb25PYmplY3RbImxhYmVsIl0gPz8gVmVydGV4LkRlZmF1bHRMYWJlbDsKKyAgICAgICAgICAgIHZhciBpZCA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdC5HZXRQcm9wZXJ0eSgiaWQiKSk7CisgICAgICAgICAgICB2YXIgbGFiZWwgPSBncmFwaHNvbk9iamVjdC5UcnlHZXRQcm9wZXJ0eSgibGFiZWwiLCBvdXQgdmFyIGxhYmVsUHJvcGVydHkpCisgICAgICAgICAgICAgICAgPyBsYWJlbFByb3BlcnR5LkdldFN0cmluZygpCisgICAgICAgICAgICAgICAgOiBWZXJ0ZXguRGVmYXVsdExhYmVsOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXgoaWQsIGxhYmVsKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vVmVydGV4UHJvcGVydHlEZXNlcmlhbGl6ZXIuY3MgYi9ncmVtbGluLWRvdG5ldC9zcmMvR3JlbWxpbi5OZXQvU3RydWN0dXJlL0lPL0dyYXBoU09OL1ZlcnRleFByb3BlcnR5RGVzZXJpYWxpemVyLmNzCmluZGV4IDdjMjUwNWYuLjE1YTk5ZGMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3NyYy9HcmVtbGluLk5ldC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vVmVydGV4UHJvcGVydHlEZXNlcmlhbGl6ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvc3JjL0dyZW1saW4uTmV0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9WZXJ0ZXhQcm9wZXJ0eURlc2VyaWFsaXplci5jcwpAQCAtMjEsMTkgKzIxLDE5IEBACiAKICNlbmRyZWdpb24KIAotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OCiB7CiAgICAgaW50ZXJuYWwgY2xhc3MgVmVydGV4UHJvcGVydHlEZXNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpZCA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsiaWQiXSk7Ci0gICAgICAgICAgICB2YXIgbGFiZWwgPSAoc3RyaW5nKSBncmFwaHNvbk9iamVjdFsibGFiZWwiXTsKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsidmFsdWUiXSk7Ci0gICAgICAgICAgICB2YXIgdmVydGV4ID0gZ3JhcGhzb25PYmplY3RbInZlcnRleCJdICE9IG51bGwKLSAgICAgICAgICAgICAgICA/IG5ldyBWZXJ0ZXgocmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0WyJ2ZXJ0ZXgiXSkpCisgICAgICAgICAgICB2YXIgaWQgPSByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3QuR2V0UHJvcGVydHkoImlkIikpOworICAgICAgICAgICAgdmFyIGxhYmVsID0gZ3JhcGhzb25PYmplY3QuR2V0UHJvcGVydHkoImxhYmVsIikuR2V0U3RyaW5nKCk7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3QuR2V0UHJvcGVydHkoInZhbHVlIikpOworICAgICAgICAgICAgdmFyIHZlcnRleCA9IGdyYXBoc29uT2JqZWN0LlRyeUdldFByb3BlcnR5KCJ2ZXJ0ZXgiLCBvdXQgdmFyIHZlcnRleFByb3BlcnR5KQorICAgICAgICAgICAgICAgID8gbmV3IFZlcnRleChyZWFkZXIuVG9PYmplY3QodmVydGV4UHJvcGVydHkpKQogICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgICAgIHJldHVybiBuZXcgVmVydGV4UHJvcGVydHkoaWQsIGxhYmVsLCB2YWx1ZSwgdmVydGV4KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvc3JjL3BvbS54bWwgYi9ncmVtbGluLWRvdG5ldC9zcmMvcG9tLnhtbAppbmRleCAxMzExZTk5Li5lNmZmOWM4IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC9zcmMvcG9tLnhtbAorKysgYi9ncmVtbGluLWRvdG5ldC9zcmMvcG9tLnhtbApAQCAtMjEsNyArMjEsNyBAQAogICAgIDxwYXJlbnQ+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLWRvdG5ldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tZG90bmV0LXNvdXJjZTwvYXJ0aWZhY3RJZD4KICAgICA8bmFtZT5BcGFjaGUgVGlua2VyUG9wIDo6IEdyZW1saW4uTmV0IC0gU291cmNlPC9uYW1lPgpAQCAtMzMsMTQgKzMzLDQwIEBACiAKICAgICA8YnVpbGQ+CiAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPCEtLSBPdmVycmlkZSB0aGUgZXhlY3V0aW9uIGZyb20gZ3JlbWxpbi1kb3RuZXQgdG8gZGlzYWJsZSBjb2RlIGdlbmVyYXRpb24gZnJvbSBoYXBwZW5pbmcgYSBzZWNvbmQgdGltZSAtLT4KICAgICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdtYXZlbnBsdXM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z21hdmVucGx1cy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3Jvb3Z5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtZHNsPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZS8+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dXBkYXRlLXZlcnNpb248L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmV4ZWN1dGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+CitkZWYgbWF2ZW5WZXJzaW9uID0gIiR7cHJvamVjdC52ZXJzaW9ufSIKK2RlZiBmaWxlID0gbmV3IEZpbGUoIiR7cHJvamVjdC5iYXNlZGlyfS9HcmVtbGluLk5ldC9HcmVtbGluLk5ldC5jc3Byb2oiKQorZmlsZS53cml0ZShmaWxlLmdldFRleHQoIlVURi04IikucmVwbGFjZUZpcnN0KC8mbHQ7VmVyc2lvbiZndDsoLiopJmx0O1wvVmVyc2lvbiZndDsvLCAiJmx0O1ZlcnNpb24mZ3Q7IiArIG1hdmVuVmVyc2lvbiArICImbHQ7L1ZlcnNpb24mZ3Q7IikpCisKK2ZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0LmJhc2VkaXJ9L0dyZW1saW4uTmV0LlRlbXBsYXRlL0dyZW1saW4uTmV0LlRlbXBsYXRlLmNzcHJvaiIpCitmaWxlLndyaXRlKGZpbGUuZ2V0VGV4dCgiVVRGLTgiKS5yZXBsYWNlRmlyc3QoL1ZlcnNpb249IiguKikiLywgIlZlcnNpb249XCIiICsgbWF2ZW5WZXJzaW9uICsgIlwiIikpCisKK2ZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0LmJhc2VkaXJ9L0dyZW1saW4uTmV0LlRlbXBsYXRlL0dyZW1saW4uTmV0LlRlbXBsYXRlLm51c3BlYyIpCitmaWxlLndyaXRlKGZpbGUuZ2V0VGV4dCgiVVRGLTgiKS5yZXBsYWNlRmlyc3QoLyZsdDt2ZXJzaW9uJmd0OyguKikmbHQ7XC92ZXJzaW9uJmd0Oy8sICImbHQ7dmVyc2lvbiZndDsiICsgbWF2ZW5WZXJzaW9uICsgIiZsdDsvdmVyc2lvbiZndDsiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CiAgICAgICAgICAgICA8L3BsdWdpbj4KQEAgLTMwMSwxOCArMzI3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdHM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD48IVtDREFUQVsKLS8vIHJldmVydCBiYWNrIHRoZSB2ZXJzaW9uIGFmdGVyIGEgU05BUFNIT1QgZGVwbG95bWVudAorLy8gcHJldmVudCBTTkFQU0hPVCBkZXBsb3ltZW50IGZvciAuTkVUCiBkZWYgdmVyc2lvblRvVXNlID0gJyR7cHJvamVjdC52ZXJzaW9ufScKLWRlZiBlbmdpbmUgPSBuZXcgZ3Jvb3Z5LnRleHQuR1N0cmluZ1RlbXBsYXRlRW5naW5lKCkKLWRlZiBjc3Byb2pUZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgnJHtwcm9qZWN0LnBhcmVudC5iYXNlZGlyfS9nbHYvR3JlbWxpbi5OZXQuY3Nwcm9qLnRlbXBsYXRlJykpLm1ha2UoWyJwcm9qZWN0VmVyc2lvbiI6dmVyc2lvblRvVXNlXSkKLWRlZiBjc3Byb2pGaWxlID0gbmV3IEZpbGUoJyR7cHJvamVjdC5iYXNlZGlyfS9HcmVtbGluLk5ldC9HcmVtbGluLk5ldC5jc3Byb2onKQotY3Nwcm9qRmlsZS5uZXdXcml0ZXIoKS53aXRoV3JpdGVyeyBpdCA8PCBjc3Byb2pUZW1wbGF0ZSB9Ci1kZWYgdGVtcGxhdGVDc3Byb2pUZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgnJHtwcm9qZWN0LnBhcmVudC5iYXNlZGlyfS9nbHYvR3JlbWxpbi5OZXQuVGVtcGxhdGUuY3Nwcm9qLnRlbXBsYXRlJykpLm1ha2UoWyJwcm9qZWN0VmVyc2lvbiI6dmVyc2lvblRvVXNlXSkKLWRlZiB0ZW1wbGF0ZUNzcHJvakZpbGUgPSBuZXcgRmlsZSgnJHtwcm9qZWN0LmJhc2VkaXJ9L0dyZW1saW4uTmV0LlRlbXBsYXRlL0dyZW1saW4uTmV0LlRlbXBsYXRlLmNzcHJvaicpCi10ZW1wbGF0ZUNzcHJvakZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgdGVtcGxhdGVDc3Byb2pUZW1wbGF0ZSB9Ci1kZWYgbnVzcGVjVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoJyR7cHJvamVjdC5wYXJlbnQuYmFzZWRpcn0vZ2x2L0dyZW1saW4uTmV0LlRlbXBsYXRlLm51c3BlYy50ZW1wbGF0ZScpKS5tYWtlKFsicHJvamVjdFZlcnNpb24iOnZlcnNpb25Ub1VzZV0pCi1kZWYgbnVzcGVjRmlsZSA9IG5ldyBGaWxlKCcke3Byb2plY3QuYmFzZWRpcn0vR3JlbWxpbi5OZXQuVGVtcGxhdGUvR3JlbWxpbi5OZXQuVGVtcGxhdGUubnVzcGVjJykKLW51c3BlY0ZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgbnVzcGVjVGVtcGxhdGUgfQoraWYgKHZlcnNpb25Ub1VzZS5lbmRzV2l0aCgiLVNOQVBTSE9UIikKKyAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkN1cnJlbnQgdmVyc2lvbiBpcyBhIFNOQVBTSE9UIHdoaWNoIGNhbiBub3QgYmUgZGVwbG95ZWQgdG8gbnVnZXQiKQogXV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdHM+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Eb2NzL0Rldi9Qcm92aWRlci9JbmRleFRlc3RzLmNzIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvRG9jcy9EZXYvUHJvdmlkZXIvSW5kZXhUZXN0cy5jcwppbmRleCA2ZDhjZGEyLi45MDZhMTE3IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Eb2NzL0Rldi9Qcm92aWRlci9JbmRleFRlc3RzLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0RvY3MvRGV2L1Byb3ZpZGVyL0luZGV4VGVzdHMuY3MKQEAgLTIzLDkgKzIzLDkgQEAKIAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogdXNpbmcgR3JlbWxpbi5OZXQuRHJpdmVyOwogdXNpbmcgR3JlbWxpbi5OZXQuU3RydWN0dXJlLklPLkdyYXBoU09OOwotdXNpbmcgTmV3dG9uc29mdC5Kc29uLkxpbnE7CiB1c2luZyBYdW5pdDsKIHVzaW5nIFh1bml0LlNkazsKIApAQCAtNjQsMTAgKzY0LDEwIEBACiAKIGludGVybmFsIGNsYXNzIE15VHlwZVJlYWRlciA6IElHcmFwaFNPTkRlc2VyaWFsaXplcgogewotICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICBwdWJsaWMgZHluYW1pYyBPYmplY3RpZnkoSnNvbkVsZW1lbnQgZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKICAgICB7Ci0gICAgICAgIHZhciB4ID0gcmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0WyJ4Il0pOwotICAgICAgICB2YXIgeSA9IHJlYWRlci5Ub09iamVjdChncmFwaHNvbk9iamVjdFsieSJdKTsKKyAgICAgICAgdmFyIHggPSByZWFkZXIuVG9PYmplY3QoZ3JhcGhzb25PYmplY3QuR2V0UHJvcGVydHkoIngiKSk7CisgICAgICAgIHZhciB5ID0gcmVhZGVyLlRvT2JqZWN0KGdyYXBoc29uT2JqZWN0LkdldFByb3BlcnR5KCJ5IikpOwogICAgICAgICByZXR1cm4gbmV3IE15VHlwZSh4LCB5KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Ecml2ZXIvR3JlbWxpbkNsaWVudFRlc3RzLmNzIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvRHJpdmVyL0dyZW1saW5DbGllbnRUZXN0cy5jcwppbmRleCBlMmM2ZWY2Li4zNzcwNDBjIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Ecml2ZXIvR3JlbWxpbkNsaWVudFRlc3RzLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0RyaXZlci9HcmVtbGluQ2xpZW50VGVzdHMuY3MKQEAgLTI0LDEyICsyNCwxMiBAQAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTmV0LldlYlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGV4dC5Kc29uOwogdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKIHVzaW5nIEdyZW1saW4uTmV0LkRyaXZlcjsKIHVzaW5nIEdyZW1saW4uTmV0LkRyaXZlci5FeGNlcHRpb25zOwogdXNpbmcgR3JlbWxpbi5OZXQuRHJpdmVyLk1lc3NhZ2VzOwogdXNpbmcgR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0LlV0aWw7Ci11c2luZyBOZXd0b25zb2Z0Lkpzb24uTGlucTsKIHVzaW5nIFh1bml0OwogCiBuYW1lc3BhY2UgR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0LkRyaXZlcgpAQCAtNzAsMzEgKzcwLDI5IEBACiAgICAgICAgIH0KIAogICAgICAgICBbRmFjdF0KLSAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgU2hvdWxkUmV0dXJuUmVzdWx0V2l0aG91dERlc2VyaWFsaXppbmdJdEZvckpUb2tlblR5cGUoKQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBTaG91bGRSZXR1cm5SZXN1bHRXaXRob3V0RGVzZXJpYWxpemluZ0l0Rm9ySnNvbkVsZW1lbnRUeXBlKCkKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGdyZW1saW5TZXJ2ZXIgPSBuZXcgR3JlbWxpblNlcnZlcihUZXN0SG9zdCwgVGVzdFBvcnQpOwotICAgICAgICAgICAgdXNpbmcgKHZhciBncmVtbGluQ2xpZW50ID0gbmV3IEdyZW1saW5DbGllbnQoZ3JlbWxpblNlcnZlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGdyZW1saW5TY3JpcHQgPSAiJ3NvbWVTdHJpbmcnIjsKKyAgICAgICAgICAgIHVzaW5nIHZhciBncmVtbGluQ2xpZW50ID0gbmV3IEdyZW1saW5DbGllbnQoZ3JlbWxpblNlcnZlcik7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JlbWxpblNjcmlwdCA9ICInc29tZVN0cmluZyciOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IGdyZW1saW5DbGllbnQuU3VibWl0V2l0aFNpbmdsZVJlc3VsdEFzeW5jPEpUb2tlbj4oZ3JlbWxpblNjcmlwdCk7CisgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBncmVtbGluQ2xpZW50LlN1Ym1pdFdpdGhTaW5nbGVSZXN1bHRBc3luYzxKc29uRWxlbWVudD4oZ3JlbWxpblNjcmlwdCk7CiAKLSAgICAgICAgICAgICAgICAvL0V4cGVjdGVkOgotICAgICAgICAgICAgICAgIC8qIHsKKyAgICAgICAgICAgIC8vRXhwZWN0ZWQ6CisgICAgICAgICAgICAvKiB7CiAgICAgICAgICAgICAgICAgICAiQHR5cGUiOiAiZzpMaXN0IiwKICAgICAgICAgICAgICAgICAgICJAdmFsdWUiOiBbCiAgICAgICAgICAgICAgICAgICAgICJzb21lU3RyaW5nIgogICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgIH0qLwogCi0gICAgICAgICAgICAgICAgQXNzZXJ0LklzVHlwZTxKT2JqZWN0PihyZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJnOkxpc3QiLCByZXNwb25zZVsiQHR5cGUiXSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUeXBlPEpzb25FbGVtZW50PihyZXNwb25zZSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoImc6TGlzdCIsIHJlc3BvbnNlLkdldFByb3BlcnR5KCJAdHlwZSIpLkdldFN0cmluZygpKTsKIAotICAgICAgICAgICAgICAgIHZhciBqQXJyYXkgPSByZXNwb25zZVsiQHZhbHVlIl0gYXMgSkFycmF5OwotICAgICAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKGpBcnJheSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIGpBcnJheS5Db3VudCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJzb21lU3RyaW5nIiwgKGpBcnJheVswXSBhcyBKVmFsdWUpPy5WYWx1ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdmFsdWVQcm9wZXJ0eSA9IHJlc3BvbnNlLkdldFByb3BlcnR5KCJAdmFsdWUiKTsKKyAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKHZhbHVlUHJvcGVydHkpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIHZhbHVlUHJvcGVydHkuR2V0QXJyYXlMZW5ndGgoKSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoInNvbWVTdHJpbmciLCAodmFsdWVQcm9wZXJ0eVswXS5HZXRTdHJpbmcoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgW0ZhY3RdCkBAIC0xMjksNyArMTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQXNzZXJ0LlRocm93c0FzeW5jPFJlc3BvbnNlRXhjZXB0aW9uPigoKSA9PiBncmVtbGluQ2xpZW50LlN1Ym1pdEFzeW5jKHJlcXVlc3RNc2cpKTsKIAogICAgICAgICAgICAgICAgIEFzc2VydC5FcXVhbCh0eXBlb2YoUmVzcG9uc2VFeGNlcHRpb24pLCBleGNlcHRpb24uR2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQ29udGFpbnMoJCJTY3JpcHRFdmFsdWF0aW9uRXJyb3I6IE5vIHN1Y2ggcHJvcGVydHk6IHtyZXF1ZXN0TXNnfSIsCisgICAgICAgICAgICAgICAgQXNzZXJ0LkNvbnRhaW5zKCQiU2VydmVyRXZhbHVhdGlvbkVycm9yOiBObyBzdWNoIHByb3BlcnR5OiB7cmVxdWVzdE1zZ30iLAogICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uTWVzc2FnZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwMSwxNiArMTk5LDE0IEBACiAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFNob3VsZFJldHVyblJlc3BvbnNlQXR0cmlidXRlcygpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZhciBncmVtbGluU2VydmVyID0gbmV3IEdyZW1saW5TZXJ2ZXIoVGVzdEhvc3QsIFRlc3RQb3J0KTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgZ3JlbWxpbkNsaWVudCA9IG5ldyBHcmVtbGluQ2xpZW50KGdyZW1saW5TZXJ2ZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByZXF1ZXN0TXNnID0gX3JlcXVlc3RNZXNzYWdlUHJvdmlkZXIuR2V0RHVtbXlNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdmFyIHJlc3VsdFNldCA9IGF3YWl0IGdyZW1saW5DbGllbnQuU3VibWl0QXN5bmM8aW50PihyZXF1ZXN0TXNnKTsKKyAgICAgICAgICAgIHVzaW5nIHZhciBncmVtbGluQ2xpZW50ID0gbmV3IEdyZW1saW5DbGllbnQoZ3JlbWxpblNlcnZlcik7CisgICAgICAgICAgICB2YXIgcmVxdWVzdE1zZyA9IF9yZXF1ZXN0TWVzc2FnZVByb3ZpZGVyLkdldER1bW15TWVzc2FnZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdFNldCA9IGF3YWl0IGdyZW1saW5DbGllbnQuU3VibWl0QXN5bmM8aW50PihyZXF1ZXN0TXNnKTsKIAotICAgICAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKHJlc3VsdFNldC5TdGF0dXNBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKHJlc3VsdFNldC5TdGF0dXNBdHRyaWJ1dGVzKTsKIAotICAgICAgICAgICAgICAgIHZhciB2YWx1ZXM9IHJlc3VsdFNldC5TdGF0dXNBdHRyaWJ1dGVzWyJAdmFsdWUiXSBhcyBKQXJyYXk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LlRydWUodmFsdWVzLkZpcnN0LlRvU3RyaW5nKCkuRXF1YWxzKCJob3N0IikpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHZhbHVlcyA9IChKc29uRWxlbWVudCkgcmVzdWx0U2V0LlN0YXR1c0F0dHJpYnV0ZXNbIkB2YWx1ZSJdOworICAgICAgICAgICAgQXNzZXJ0LlRydWUodmFsdWVzWzBdLlRvU3RyaW5nKCkuRXF1YWxzKCJob3N0IikpOwogICAgICAgICB9CiAKICAgICAgICAgW0ZhY3RdCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Ecml2ZXIvTWVzc2FnZXNUZXN0cy5jcyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0RyaXZlci9NZXNzYWdlc1Rlc3RzLmNzCmluZGV4IDA0NjE1NzIuLmJiYjEwN2IgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0RyaXZlci9NZXNzYWdlc1Rlc3RzLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0RyaXZlci9NZXNzYWdlc1Rlc3RzLmNzCkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgICAgICAgICB2YXIgdGhyb3duRXhjZXB0aW9uID0KICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQXNzZXJ0LlRocm93c0FzeW5jPFJlc3BvbnNlRXhjZXB0aW9uPigoKSA9PiBncmVtbGluQ2xpZW50LlN1Ym1pdEFzeW5jKHJlcXVlc3RNc2cpKTsKIAotICAgICAgICAgICAgICAgIEFzc2VydC5Db250YWlucygiU2NyaXB0RXZhbHVhdGlvbkVycm9yIiwgdGhyb3duRXhjZXB0aW9uLk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIEFzc2VydC5Db250YWlucygiU2VydmVyRXZhbHVhdGlvbkVycm9yIiwgdGhyb3duRXhjZXB0aW9uLk1lc3NhZ2UpOwogICAgICAgICAgICAgICAgIEFzc2VydC5Db250YWlucyh1bmtub3duTGFuZ3VhZ2UsIHRocm93bkV4Y2VwdGlvbi5NZXNzYWdlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9Db21tb25TdGVwcy5jcyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vQ29tbW9uU3RlcHMuY3MKaW5kZXggOGI1NmI3My4uMTAyMjg1NiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9Db21tb25TdGVwcy5jcworKysgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9HaGVya2luL0NvbW1vblN0ZXBzLmNzCkBAIC0yNiwxMyArMjYsMTMgQEAKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CiB1c2luZyBHaGVya2luLkFzdDsKIHVzaW5nIEdyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC5HaGVya2luLkF0dHJpYnV0ZXM7CiB1c2luZyBHcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QuR2hlcmtpbi5UcmF2ZXJzYWxFdmFsdWF0aW9uOwogdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWw7CiB1c2luZyBHcmVtbGluLk5ldC5TdHJ1Y3R1cmU7Ci11c2luZyBOZXd0b25zb2Z0Lkpzb24uTGlucTsKIHVzaW5nIFh1bml0OwogCiB1c2luZyBzdGF0aWMgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWwuQW5vbnltb3VzVHJhdmVyc2FsU291cmNlOwpAQCAtNDYsNiArNDYsOCBAQAogICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiBfcGFyYW1ldGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOwogICAgICAgICBwcml2YXRlIElUcmF2ZXJzYWwgX3RyYXZlcnNhbDsKICAgICAgICAgcHJpdmF0ZSBvYmplY3RbXSBfcmVzdWx0OworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBKc29uU2VyaWFsaXplck9wdGlvbnMgSnNvbkRlc2VyaWFsaXppbmdPcHRpb25zID0gbmV3IEpzb25TZXJpYWxpemVyT3B0aW9ucworICAgICAgICAgICAge1Byb3BlcnR5TmFtaW5nUG9saWN5ID0gSnNvbk5hbWluZ1BvbGljeS5DYW1lbENhc2V9OwogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElEaWN0aW9uYXJ5PFJlZ2V4LCBGdW5jPHN0cmluZywgc3RyaW5nLCBvYmplY3Q+PiBQYXJzZXJzID0KICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRnVuYzxzdHJpbmcsIHN0cmluZywgb2JqZWN0Pj4KQEAgLTYzLDcgKzY1LDggQEAKICAgICAgICAgICAgICAgICB7QCJzXFsoLiopXF0iLCBUb1NldH0sCiAgICAgICAgICAgICAgICAge0AibVxbKC4rKVxdIiwgVG9NYXB9LAogICAgICAgICAgICAgICAgIHtAImNcWyguKylcXSIsIFRvTGFtYmRhfSwKLSAgICAgICAgICAgICAgICB7QCJ0XFsoLispXF0iLCBUb1R9CisgICAgICAgICAgICAgICAge0AidFxbKC4rKVxdIiwgVG9UfSwKKyAgICAgICAgICAgICAgICB7Im51bGwiLCAoXywgX18pID0+IG51bGx9CiAgICAgICAgICAgICB9LlRvRGljdGlvbmFyeShrdiA9PiBuZXcgUmVnZXgoIl4iICsga3YuS2V5ICsgIiQiLCBSZWdleE9wdGlvbnMuQ29tcGlsZWQpLCBrdiA9PiBrdi5WYWx1ZSk7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSURpY3Rpb25hcnk8Y2hhciwgRnVuYzxzdHJpbmcsIG9iamVjdD4+IE51bWVyaWNQYXJzZXJzID0KQEAgLTE4MCw2ICsxODMsNyBAQAogICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IHRhYmxlLlJvd3MuVG9BcnJheSgpOwogICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoInJlc3VsdCIsIHJvd3NbMF0uQ2VsbHMuRmlyc3QoKS5WYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHJvd3MuU2tpcCgxKS5TZWxlY3QoeCA9PiBQYXJzZVZhbHVlKHguQ2VsbHMuRmlyc3QoKS5WYWx1ZSwgX2dyYXBoTmFtZSkpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcmVkKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoZXhwZWN0ZWQsIF9yZXN1bHQpOwpAQCAtMjMyLDcgKzIzNiw4IEBACiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFRvTWFwKHN0cmluZyBzdHJpbmdNYXAsIHN0cmluZyBncmFwaE5hbWUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBQYXJzZU1hcFZhbHVlKEpPYmplY3QuUGFyc2Uoc3RyaW5nTWFwKSwgZ3JhcGhOYW1lKTsKKyAgICAgICAgICAgIHZhciBqc29uTWFwID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KHN0cmluZ01hcCwgSnNvbkRlc2VyaWFsaXppbmdPcHRpb25zKTsKKyAgICAgICAgICAgIHJldHVybiBQYXJzZU1hcFZhbHVlKGpzb25NYXAsIGdyYXBoTmFtZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgVG9MYW1iZGEoc3RyaW5nIHN0cmluZ0xhbWJkYSwgc3RyaW5nIGdyYXBoTmFtZSkKQEAgLTI1NiwyOSArMjYxLDQ1IEBACiAgICAgICAgICAgICAgICAgc3RyaW5nTnVtYmVyLlN1YnN0cmluZygwLCBzdHJpbmdOdW1iZXIuTGVuZ3RoIC0gMSkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFBhcnNlTWFwVmFsdWUoSlRva2VuIHZhbHVlLCBzdHJpbmcgZ3JhcGhOYW1lKQorICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgUGFyc2VNYXBWYWx1ZShKc29uRWxlbWVudCB2YWx1ZSwgc3RyaW5nIGdyYXBoTmFtZSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlLlR5cGUgPT0gSlRva2VuVHlwZS5PYmplY3QpCisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLlZhbHVlS2luZCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIEpUb2tlbj4ganNvbk1hcCA9IChKT2JqZWN0KXZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybiBqc29uTWFwLlRvRGljdGlvbmFyeShrdiA9PiBQYXJzZU1hcFZhbHVlKGt2LktleSwgZ3JhcGhOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAga3YgPT4gUGFyc2VNYXBWYWx1ZShrdi5WYWx1ZSwgZ3JhcGhOYW1lKSk7CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLk9iamVjdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5FbnVtZXJhdGVPYmplY3QoKS5Ub0RpY3Rpb25hcnkocHJvcGVydHkgPT4gUGFyc2VWYWx1ZShwcm9wZXJ0eS5OYW1lLCBncmFwaE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPT4gUGFyc2VNYXBWYWx1ZShwcm9wZXJ0eS5WYWx1ZSwgZ3JhcGhOYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgSnNvblZhbHVlS2luZC5BcnJheToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLkVudW1lcmF0ZUFycmF5KCkuU2VsZWN0KHYgPT4gUGFyc2VNYXBWYWx1ZSh2LCBncmFwaE5hbWUpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLk51bWJlcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIG1heWJlIGJlIHNpbXBsaWZpZWQgd2hlbiB0aGlzIGlzc3VlIGlzIHJlc29sdmVkOgorICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L3J1bnRpbWUvaXNzdWVzLzMxMjc0CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5UcnlHZXRJbnQzMihvdXQgdmFyIGludGVnZXIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5UcnlHZXREb3VibGUob3V0IHZhciBmbG9hdGluZykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdGluZzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKHZhbHVlKSwgdmFsdWUsICJOb3QgYSBzdXBwb3J0ZWQgbnVtYmVyIHR5cGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlVmFsdWUodmFsdWUuR2V0U3RyaW5nKCksIGdyYXBoTmFtZSk7CisgICAgICAgICAgICAgICAgY2FzZSBKc29uVmFsdWVLaW5kLlRydWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgSnNvblZhbHVlS2luZC5GYWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGNhc2UgSnNvblZhbHVlS2luZC5OdWxsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZih2YWx1ZS5WYWx1ZUtpbmQpLCB2YWx1ZS5WYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZS5UeXBlID09IEpUb2tlblR5cGUuQXJyYXkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLlNlbGVjdCh2ID0+IFBhcnNlTWFwVmFsdWUodiwgZ3JhcGhOYW1lKSkuVG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIG9ialZhbHVlID0gdmFsdWUuVG9PYmplY3Q8b2JqZWN0PigpOwotICAgICAgICAgICAgaWYgKG9ialZhbHVlIGlzIGxvbmcgbG9uZ1ZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEpTT04gTnVtZXJpYyB2YWx1ZXMgY29udmVydGVkIHRvIGludDY0IGJ5IGRlZmF1bHQKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0ludDMyKGxvbmdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqVmFsdWUgaXMgc3RyaW5nIHN0cmluZ1ZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVZhbHVlKHN0cmluZ1ZhbHVlLCBncmFwaE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9ialZhbHVlOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSVNldDxvYmplY3Q+IFRvU2V0KHN0cmluZyBzdHJpbmdTZXQsIHN0cmluZyBncmFwaE5hbWUpCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9HaGVya2luL0doZXJraW5UZXN0UnVubmVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9HaGVya2luVGVzdFJ1bm5lci5jcwppbmRleCA1OWZkMTFlLi4yNjQ5ZTY4IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9HaGVya2luL0doZXJraW5UZXN0UnVubmVyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vR2hlcmtpblRlc3RSdW5uZXIuY3MKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSWdub3JlUmVhc29uPgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIEFkZCBoZXJlIHRoZSBuYW1lIG9mIHNjZW5hcmlvcyB0byBpZ25vcmUgYW5kIHRoZSByZWFzb24sIGUuZy46CisgICAgICAgICAgICAgICAgeyAiZ19WX2dyb3VwX2J5WGFnZVgiLCBJZ25vcmVSZWFzb24uTnVsbEtleXNJbk1hcE5vdFN1cHBvcnRlZCB9CiAgICAgICAgICAgICAgICAgLy97ICJnX1ZfcHJvcGVydGllc19wcm9wZXJ0aWVzWHN0YXJ0VGltZVhfZHJvcCIsIElnbm9yZVJlYXNvbi5Ob1JlYXNvbiB9LAogICAgICAgICAgICAgfTsKICAgICAgICAgCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9HaGVya2luL0lnbm9yZUV4Y2VwdGlvbi5jcyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vSWdub3JlRXhjZXB0aW9uLmNzCmluZGV4IDcyNmU2ODQuLjBlMjU0NDAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vSWdub3JlRXhjZXB0aW9uLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vSWdub3JlRXhjZXB0aW9uLmNzCkBAIC01MCwxMiArNTAsMTEgQEAKICAgICAKICAgICBwdWJsaWMgZW51bSBJZ25vcmVSZWFzb24KICAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlc2VyaWFsaXphdGlvbiBvZiBnOlQgb24gR3JhcGhTT04zIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFRyYXZlcnNhbFREZXNlcmlhbGl6YXRpb25Ob3RTdXBwb3J0ZWQsCi0gICAgICAgIFJlY2VpdmVkRGF0YURvZXNudE1hdGNoRXhwZWN0ZWQsCiAgICAgICAgIE5vUmVhc29uLAotICAgICAgICBFbWJlZGRlZExpc3RBc3NlcnRpb24KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDIyBkb2VzIG5vdCBhbGxvdyBhIGBudWxsYCB2YWx1ZSB0byBiZSB1c2VkIGFzIGEga2V5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBOdWxsS2V5c0luTWFwTm90U3VwcG9ydGVkCiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vU2NlbmFyaW9EYXRhLmNzIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9TY2VuYXJpb0RhdGEuY3MKaW5kZXggOGM4MDk4Mi4uNGExNTE3OCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9TY2VuYXJpb0RhdGEuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9TY2VuYXJpb0RhdGEuY3MKQEAgLTEwNCwxNCArMTA0LDE0IEBACiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSURpY3Rpb25hcnk8c3RyaW5nLCBWZXJ0ZXg+IEdldFZlcnRpY2VzKEdyYXBoVHJhdmVyc2FsU291cmNlIGcpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgLy8gUHJvcGVydHkgbmFtZSBtaWdodCBub3QgZXhpc3QgYW5kIEMjIGRvZXNuJ3Qgc3VwcG9ydCAibnVsbCIga2V5cyBpbiBEaWN0aW9uYXJ5CisgICAgICAgICAgICBpZiAoZy5WKCkuQ291bnQoKS5OZXh0KCkgPT0gZy5WKCkuSGFzKCJuYW1lIikuQ291bnQoKS5OZXh0KCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGcuVigpLkdyb3VwPHN0cmluZywgb2JqZWN0PigpLkJ5KCJuYW1lIikuQnkoX18uVGFpbDxWZXJ0ZXg+KCkpLk5leHQoKQogICAgICAgICAgICAgICAgICAgICAuVG9EaWN0aW9uYXJ5KGt2ID0+IGt2LktleSwga3YgPT4gKFZlcnRleCkga3YuVmFsdWUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJlc3BvbnNlRXhjZXB0aW9uKQorICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG5hbWUgbWlnaHQgbm90IGV4aXN0CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVtcHR5VmVydGljZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vVHJhdmVyc2FsRXZhbHVhdGlvbi9MaXRlcmFsUGFyYW1ldGVyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9UcmF2ZXJzYWxFdmFsdWF0aW9uL0xpdGVyYWxQYXJhbWV0ZXIuY3MKaW5kZXggZGEwYWMyNC4uMTBhODhhMiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9UcmF2ZXJzYWxFdmFsdWF0aW9uL0xpdGVyYWxQYXJhbWV0ZXIuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9UcmF2ZXJzYWxFdmFsdWF0aW9uL0xpdGVyYWxQYXJhbWV0ZXIuY3MKQEAgLTI5LDEwICsyOSwxNSBAQAogICAgIC8vLyA8c3VtbWFyeT4KICAgICAvLy8gUmVwcmVzZW50cyBhIGxpdGVyYWwgKG51bWJlciAvIGJvb2xlYW4pIHRoYXQgaXMgYWxsb3dlZCBhcyBhIGdyZW1saW4gcGFyYW1ldGVyLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIExpdGVyYWxQYXJhbWV0ZXI8VD4gOiBJVG9rZW5QYXJhbWV0ZXIsIElFcXVhdGFibGU8TGl0ZXJhbFBhcmFtZXRlcjxUPj4gd2hlcmUgVCA6IHN0cnVjdAorICAgIHB1YmxpYyBjbGFzcyBMaXRlcmFsUGFyYW1ldGVyPFQ+IDogSVRva2VuUGFyYW1ldGVyLCBJRXF1YXRhYmxlPExpdGVyYWxQYXJhbWV0ZXI8VD4+CiAgICAgewogICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoTGl0ZXJhbFBhcmFtZXRlcjxUPiBvdGhlcikKICAgICAgICAgeworICAgICAgICAgICAgaWYgKFZhbHVlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyLlZhbHVlID09IG51bGw7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBWYWx1ZS5FcXVhbHMob3RoZXIuVmFsdWUpOwogICAgICAgICB9CiAKQEAgLTQ2LDcgKzUxLDcgQEAKIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFZhbHVlLkdldEhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gVmFsdWU/LkdldEhhc2hDb2RlKCkgPz8gMDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBUIFZhbHVlIHsgZ2V0OyB9CkBAIC03OSw3ICs4NCw3IEBACiAKICAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgTGl0ZXJhbFBhcmFtZXRlcgogICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXRlcmFsUGFyYW1ldGVyPFRUeXBlPiBDcmVhdGU8VFR5cGU+KFRUeXBlIHZhbHVlKSB3aGVyZSBUVHlwZSA6IHN0cnVjdAorICAgICAgICBwdWJsaWMgc3RhdGljIExpdGVyYWxQYXJhbWV0ZXI8VFR5cGU+IENyZWF0ZTxUVHlwZT4oVFR5cGUgdmFsdWUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFBhcmFtZXRlcjxUVHlwZT4odmFsdWUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9HaGVya2luL1RyYXZlcnNhbEV2YWx1YXRpb24vVHJhdmVyc2FsUGFyc2VyLmNzIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvR2hlcmtpbi9UcmF2ZXJzYWxFdmFsdWF0aW9uL1RyYXZlcnNhbFBhcnNlci5jcwppbmRleCAxMDU5MzJmLi5iNzQ3MjAwIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9HaGVya2luL1RyYXZlcnNhbEV2YWx1YXRpb24vVHJhdmVyc2FsUGFyc2VyLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L0doZXJraW4vVHJhdmVyc2FsRXZhbHVhdGlvbi9UcmF2ZXJzYWxQYXJzZXIuY3MKQEAgLTM2LDcgKzM2LDEwIEBACiAgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElEaWN0aW9uYXJ5PHN0cmluZywgRnVuYzxHcmFwaFRyYXZlcnNhbFNvdXJjZSwgSVRyYXZlcnNhbD4+IEZpeGVkVHJhbnNsYXRpb25zID0gCiAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEZ1bmM8R3JhcGhUcmF2ZXJzYWxTb3VyY2UsIElUcmF2ZXJzYWw+PgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsgImcuVigpLmZvbGQoKS5jb3VudChTY29wZS5sb2NhbCkiLCBnID0+IGcuVigpLkZvbGQoKS5Db3VudChTY29wZS5Mb2NhbCl9CisgICAgICAgICAgICAgICAgeyAiZy5WKCkuZm9sZCgpLmNvdW50KFNjb3BlLmxvY2FsKSIsIGcgPT4gZy5WKCkuRm9sZCgpLkNvdW50KFNjb3BlLkxvY2FsKX0sCisgICAgICAgICAgICAgICAgeyAiZy5pbmplY3QoMTAsMjAsbnVsbCwyMCwxMCwxMCkuZ3JvdXBDb3VudChcInhcIikuZGVkdXAoKS5hcyhcInlcIikucHJvamVjdChcImFcIixcImJcIikuYnkoKS5ieShfXy5zZWxlY3QoXCJ4XCIpLnNlbGVjdChfXy5zZWxlY3QoXCJ5XCIpKSkiLCAKKyAgICAgICAgICAgICAgICAgICAgZyA9PiBnLkluamVjdDxvYmplY3Q+KDEwLDIwLG51bGwsMjAsMTAsMTApLkdyb3VwQ291bnQoIngiKS5EZWR1cCgpLkFzKCJ5IikuUHJvamVjdDxvYmplY3Q+KCJhIiwiYiIpLkJ5KCkuQnkoX18uU2VsZWN0PGludD4oIngiKS5TZWxlY3Q8b2JqZWN0PihfXy5TZWxlY3Q8aW50PigieSIpKSl9LAorICAgICAgICAgICAgICAgIHsgImcuaW5qZWN0KG0pLnNlbGVjdChcIm5hbWVcIixcImFnZVwiKSIsIGcgPT4gZy5JbmplY3QobmV3IERpY3Rpb25hcnk8c3RyaW5nLG9iamVjdD4oKSB7eyJuYW1lIiwgIm1hcmtvIn0sIHsiYWdlIiwgbnVsbH19KS5TZWxlY3Q8b2JqZWN0PigibmFtZSIsICJhZ2UiKSB9CiAgICAgICAgICAgICB9OwogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlZ2V4IFJlZ2V4TnVtZXJpYyA9CkBAIC0xNjksNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpYyhtZXRob2RQYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZSkgJiYgSXNOdW1lcmljKHRva2VuUGFyYW1ldGVyVHlwZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNvdW50IGZvciBpbXBsaWNpdCBjb252ZXJzaW9uIG9mIG51bWVyaWMgdmFsdWVzIGFzIGFuIGV4YWN0IG1hdGNoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIGltcGxpY2l0IGNvbnZlcnNpb24gb2YgbnVtZXJpYyB2YWx1ZXMgYXMgYW4gZXhhY3QgbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdE1hdGNoZXMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFtZXRob2RQYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5HZXRUeXBlSW5mbygpLklzQXNzaWduYWJsZUZyb20odG9rZW5QYXJhbWV0ZXJUeXBlKSkKQEAgLTIzMyw2ICsyMzYsNyBAQAogICAgICAgICAgICAgdmFyIHBhcmFtc0luZm8gPSBtZXRob2QuR2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBuZXcgb2JqZWN0W3BhcmFtc0luZm8uTGVuZ3RoXTsKICAgICAgICAgICAgIGdlbmVyaWNQYXJhbWV0ZXJUeXBlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgVHlwZT4oKTsKKwogICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXNJbmZvLkxlbmd0aDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZhciBpbmZvID0gcGFyYW1zSW5mb1tpXTsKQEAgLTI0NiwxNSArMjUwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBwcm92aWRlZCBhIHZhbHVlIGZvciBwYXJhbWV0ZXIgb2YgYSBnZW5lcmljIHR5cGUsIHdlIGNhbiBpbmZlciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgb2YgdGhlIGdlbmVyaWMgYXJndW1lbnQgYmFzZWQgb24gdGhlIHBhcmFtZXRlci4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBgQ29uc3RhbnQ8RTI+KEUyIHZhbHVlKWAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdGhlIHR5cGUgb2YgdmFsdWUgd2UgaGF2ZSB0aGUgdHlwZSBvZiBFMi4gCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHRoZSB0eXBlIG9mIHZhbHVlIHdlIGhhdmUgdGhlIHR5cGUgb2YgRTIuCiAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljUGFyYW1ldGVyVHlwZXMuQWRkKGluZm8uUGFyYW1ldGVyVHlwZS5OYW1lLCB0b2tlblBhcmFtZXRlci5HZXRQYXJhbWV0ZXJUeXBlKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElzUGFyYW1zQXJyYXkoaW5mbykgJiYgaW5mby5QYXJhbWV0ZXJUeXBlLkdldEVsZW1lbnRUeXBlKCkuSXNHZW5lcmljUGFyYW1ldGVyKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdHMgYSBtZXRob2Qgd2hlcmUgdGhlIHR5cGUgcGFyYW1ldGVyIGNvbWVzIGZyb20gYW4gcGFyYW1zIEFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuLCBJbmplY3Q8Uz4ocGFyYW1zIFNbXSB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNQYXJhbWV0ZXJUeXBlcy5BZGQoaW5mby5QYXJhbWV0ZXJUeXBlLkdldEVsZW1lbnRUeXBlKCkuTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblBhcmFtZXRlci5HZXRQYXJhbWV0ZXJUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0b2tlblBhcmFtZXRlci5HZXRQYXJhbWV0ZXJUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljUGFyYW1ldGVyVHlwZXMuQWRkKGluZm8uUGFyYW1ldGVyVHlwZS5HZXRFbGVtZW50VHlwZSgpLk5hbWUsIHR5cGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYSBwbGFjZWhvbGRlciB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0eXBlLklzVmFsdWVUeXBlID8gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGUpIDogbmV3IG9iamVjdCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uUGFyYW1ldGVyVHlwZSAhPSB0b2tlblBhcmFtZXRlci5HZXRQYXJhbWV0ZXJUeXBlKCkgJiYgSXNOdW1lcmljKGluZm8uUGFyYW1ldGVyVHlwZSkgJiYKQEAgLTI3MCw3ICsyNzcsNiBAQAogICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYHBhcmFtcyB0eXBlW10gdmFsdWVgIHdlIHNob3VsZCBwcm92aWRlIGFuIGVtcHR5IGFycmF5CiAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBlbXB0eSBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBcnJheS5DcmVhdGVJbnN0YW5jZShpbmZvLlBhcmFtZXRlclR5cGUuR2V0RWxlbWVudFR5cGUoKSwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXZhbHVlLkdldFR5cGUoKS5Jc0FycmF5KQpAQCAtMjg2LDggKzI5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnIgPSBBcnJheS5DcmVhdGVJbnN0YW5jZShlbGVtZW50VHlwZSwgdG9rZW4uUGFyYW1ldGVycy5Db3VudCAtIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXJyLlNldFZhbHVlKHZhbHVlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgdG9rZW4uUGFyYW1ldGVycy5Db3VudCAtIGk7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG9rZW4uUGFyYW1ldGVycy5Db3VudCAtIGk7IGorKykKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIuU2V0VmFsdWUodG9rZW4uUGFyYW1ldGVyc1tpICsgal0uR2V0VmFsdWUoKSwgaik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00NDksNiArNDU0LDExIEBACiAgICAgICAgICAgICAgICAgaSArPSBwYXJhbWV0ZXJUZXh0Lkxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICAgcmV0dXJuIExpdGVyYWxQYXJhbWV0ZXIuQ3JlYXRlKENvbnZlcnQuVG9Cb29sZWFuKHBhcmFtZXRlclRleHQpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJUZXh0ID09ICJudWxsIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpICs9IHBhcmFtZXRlclRleHQuTGVuZ3RoIC0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTGl0ZXJhbFBhcmFtZXRlci5DcmVhdGU8b2JqZWN0PihudWxsKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChSZWdleElPLklzTWF0Y2gocGFyYW1ldGVyVGV4dCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaSArPSBwYXJhbWV0ZXJUZXh0Lkxlbmd0aCAtIDE7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Qcm9jZXNzL1RyYXZlcnNhbC9Ecml2ZXJSZW1vdGVDb25uZWN0aW9uL0dyYXBoVHJhdmVyc2FsVGVzdHMuY3MgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Qcm9jZXNzL1RyYXZlcnNhbC9Ecml2ZXJSZW1vdGVDb25uZWN0aW9uL0dyYXBoVHJhdmVyc2FsVGVzdHMuY3MKaW5kZXggMGY2YmVhNi4uNWUxMWUzMyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvUHJvY2Vzcy9UcmF2ZXJzYWwvRHJpdmVyUmVtb3RlQ29ubmVjdGlvbi9HcmFwaFRyYXZlcnNhbFRlc3RzLmNzCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuSW50ZWdyYXRpb25UZXN0L1Byb2Nlc3MvVHJhdmVyc2FsL0RyaXZlclJlbW90ZUNvbm5lY3Rpb24vR3JhcGhUcmF2ZXJzYWxUZXN0cy5jcwpAQCAtMjIwLDYgKzIyMCwyMCBAQAogICAgICAgICB9CiAKICAgICAgICAgW0ZhY3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFVzZVNlZWRTdHJhdGVneVRvUmV0dXJuRGV0ZXJtaW5pc3RpY1Jlc3VsdHMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IF9jb25uZWN0aW9uRmFjdG9yeS5DcmVhdGVSZW1vdGVDb25uZWN0aW9uKCk7CisgICAgICAgICAgICB2YXIgZyA9IEFub255bW91c1RyYXZlcnNhbFNvdXJjZS5UcmF2ZXJzYWwoKS5XaXRoUmVtb3RlKGNvbm5lY3Rpb24pLldpdGhTdHJhdGVnaWVzKG5ldyBTZWVkU3RyYXRlZ3koNjY0NjY0KSk7CisKKyAgICAgICAgICAgIHZhciBzaHVmZmxlZFJlc3VsdHMgPSBnLlYoKS5WYWx1ZXM8c3RyaW5nPigibmFtZSIpLk9yZGVyKCkuQnkoT3JkZXIuU2h1ZmZsZSkuVG9MaXN0KCk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoc2h1ZmZsZWRSZXN1bHRzLCBnLlYoKS5WYWx1ZXM8c3RyaW5nPigibmFtZSIpLk9yZGVyKCkuQnkoT3JkZXIuU2h1ZmZsZSkuVG9MaXN0KCkpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKHNodWZmbGVkUmVzdWx0cywgZy5WKCkuVmFsdWVzPHN0cmluZz4oIm5hbWUiKS5PcmRlcigpLkJ5KE9yZGVyLlNodWZmbGUpLlRvTGlzdCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChzaHVmZmxlZFJlc3VsdHMsIGcuVigpLlZhbHVlczxzdHJpbmc+KCJuYW1lIikuT3JkZXIoKS5CeShPcmRlci5TaHVmZmxlKS5Ub0xpc3QoKSk7CisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoc2h1ZmZsZWRSZXN1bHRzLCBnLlYoKS5WYWx1ZXM8c3RyaW5nPigibmFtZSIpLk9yZGVyKCkuQnkoT3JkZXIuU2h1ZmZsZSkuVG9MaXN0KCkpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKHNodWZmbGVkUmVzdWx0cywgZy5WKCkuVmFsdWVzPHN0cmluZz4oIm5hbWUiKS5PcmRlcigpLkJ5KE9yZGVyLlNodWZmbGUpLlRvTGlzdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGYWN0XQogICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBTaG91bGRFeGVjdXRlQXN5bmNocm9ub3VzbHlXaGVuUHJvbWlzZUlzQ2FsbGVkKCkKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSBfY29ubmVjdGlvbkZhY3RvcnkuQ3JlYXRlUmVtb3RlQ29ubmVjdGlvbigpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5JbnRlZ3JhdGlvblRlc3QvUHJvY2Vzcy9UcmF2ZXJzYWwvRHJpdmVyUmVtb3RlQ29ubmVjdGlvbi9TaWRlRWZmZWN0VGVzdHMuY3MgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Qcm9jZXNzL1RyYXZlcnNhbC9Ecml2ZXJSZW1vdGVDb25uZWN0aW9uL1NpZGVFZmZlY3RUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5OGY5Ny4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC9Qcm9jZXNzL1RyYXZlcnNhbC9Ecml2ZXJSZW1vdGVDb25uZWN0aW9uL1NpZGVFZmZlY3RUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi3vu7/vu78jcmVnaW9uIExpY2Vuc2UKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwotdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWw7Ci11c2luZyBYdW5pdDsKLQotbmFtZXNwYWNlIEdyZW1saW4uTmV0LkludGVncmF0aW9uVGVzdC5Qcm9jZXNzLlRyYXZlcnNhbC5Ecml2ZXJSZW1vdGVDb25uZWN0aW9uCi17Ci0gICAgcHVibGljIGNsYXNzIFNpZGVFZmZlY3RUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDb25uZWN0aW9uRmFjdG9yeSBfY29ubmVjdGlvbkZhY3RvcnkgPSBuZXcgUmVtb3RlQ29ubmVjdGlvbkZhY3RvcnkoKTsKLQotICAgICAgICBbRmFjdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuQ2FjaGVkU2lkZUVmZmVjdFdoZW5HZXRJc0NhbGxlZEFmdGVyQ2xvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IF9jb25uZWN0aW9uRmFjdG9yeS5DcmVhdGVSZW1vdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICB2YXIgZyA9IEFub255bW91c1RyYXZlcnNhbFNvdXJjZS5UcmF2ZXJzYWwoKS5XaXRoUmVtb3RlKGNvbm5lY3Rpb24pOwotICAgICAgICAgICAgdmFyIHQgPSBnLlYoKS5BZ2dyZWdhdGUoImEiKS5JdGVyYXRlKCk7Ci0KLSAgICAgICAgICAgIHQuU2lkZUVmZmVjdHMuR2V0KCJhIik7Ci0gICAgICAgICAgICB0LlNpZGVFZmZlY3RzLkNsb3NlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHQuU2lkZUVmZmVjdHMuR2V0KCJhIik7Ci0KLSAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKHJlc3VsdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgW0ZhY3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRocm93V2hlbkdldElzQ2FsbGVkQWZ0ZXJDbG9zZUFuZE5vU2lkZUVmZmVjdHNBcmVDYWNoZWMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IF9jb25uZWN0aW9uRmFjdG9yeS5DcmVhdGVSZW1vdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICB2YXIgZyA9IEFub255bW91c1RyYXZlcnNhbFNvdXJjZS5UcmF2ZXJzYWwoKS5XaXRoUmVtb3RlKGNvbm5lY3Rpb24pOwotICAgICAgICAgICAgdmFyIHQgPSBnLlYoKS5BZ2dyZWdhdGUoImEiKS5JdGVyYXRlKCk7Ci0KLSAgICAgICAgICAgIHQuU2lkZUVmZmVjdHMuQ2xvc2UoKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbj4oKCkgPT4gdC5TaWRlRWZmZWN0cy5HZXQoImEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbRmFjdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dXaGVuR2V0SXNDYWxsZWRBZnRlckRpc3Bvc2VBbmROb1NpZGVFZmZlY3RzQXJlQ2FjaGVjKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSBfY29ubmVjdGlvbkZhY3RvcnkuQ3JlYXRlUmVtb3RlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgdmFyIGcgPSBBbm9ueW1vdXNUcmF2ZXJzYWxTb3VyY2UuVHJhdmVyc2FsKCkuV2l0aFJlbW90ZShjb25uZWN0aW9uKTsKLSAgICAgICAgICAgIHZhciB0ID0gZy5WKCkuQWdncmVnYXRlKCJhIikuSXRlcmF0ZSgpOwotCi0gICAgICAgICAgICB0LlNpZGVFZmZlY3RzLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbj4oKCkgPT4gdC5TaWRlRWZmZWN0cy5HZXQoImEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbRmFjdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dXaGVuR2V0SXNDYWxsZWRXaXRoQW5Vbmtub3duS2V5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSBfY29ubmVjdGlvbkZhY3RvcnkuQ3JlYXRlUmVtb3RlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgdmFyIGcgPSBBbm9ueW1vdXNUcmF2ZXJzYWxTb3VyY2UuVHJhdmVyc2FsKCkuV2l0aFJlbW90ZShjb25uZWN0aW9uKTsKLSAgICAgICAgICAgIHZhciB0ID0gZy5WKCkuSXRlcmF0ZSgpOwotCi0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEtleU5vdEZvdW5kRXhjZXB0aW9uPigoKSA9PiB0LlNpZGVFZmZlY3RzLkdldCgibSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtGYWN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5BbkVtcHR5Q29sbGVjdGlvbldoZW5LZXlzSXNDYWxsZWRGb3JUcmF2ZXJzYWxXaXRob3V0U2lkZUVmZmVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb25uZWN0aW9uID0gX2Nvbm5lY3Rpb25GYWN0b3J5LkNyZWF0ZVJlbW90ZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIHZhciBnID0gQW5vbnltb3VzVHJhdmVyc2FsU291cmNlLlRyYXZlcnNhbCgpLldpdGhSZW1vdGUoY29ubmVjdGlvbik7Ci0KLSAgICAgICAgICAgIHZhciB0ID0gZy5WKCkuSXRlcmF0ZSgpOwotICAgICAgICAgICAgdmFyIGtleXMgPSB0LlNpZGVFZmZlY3RzLktleXMoKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDAsIGtleXMuQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW0ZhY3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybkNhY2hlZEtleXNXaGVuRm9yQ2xvc2VBZnRlclNvbWVHZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IF9jb25uZWN0aW9uRmFjdG9yeS5DcmVhdGVSZW1vdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICB2YXIgZyA9IEFub255bW91c1RyYXZlcnNhbFNvdXJjZS5UcmF2ZXJzYWwoKS5XaXRoUmVtb3RlKGNvbm5lY3Rpb24pOwotICAgICAgICAgICAgdmFyIHQgPSBnLlYoKS5BZ2dyZWdhdGUoImEiKS5BZ2dyZWdhdGUoImIiKS5JdGVyYXRlKCk7Ci0KLSAgICAgICAgICAgIHQuU2lkZUVmZmVjdHMuR2V0KCJhIik7Ci0gICAgICAgICAgICB0LlNpZGVFZmZlY3RzLkNsb3NlKCk7Ci0gICAgICAgICAgICB2YXIga2V5cyA9IHQuU2lkZUVmZmVjdHMuS2V5cygpOwotCi0gICAgICAgICAgICBBc3NlcnQuRXF1YWwoMiwga2V5cy5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQ29udGFpbnMoImEiLCBrZXlzKTsKLSAgICAgICAgICAgIEFzc2VydC5Db250YWlucygiYiIsIGtleXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgW0ZhY3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVyblNpZGVFZmZlY3RLZXlXaGVuS2V5c0lzQ2FsbGVkRm9yTmFtZWRHcm91cENvdW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSBfY29ubmVjdGlvbkZhY3RvcnkuQ3JlYXRlUmVtb3RlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgdmFyIGcgPSBBbm9ueW1vdXNUcmF2ZXJzYWxTb3VyY2UuVHJhdmVyc2FsKCkuV2l0aFJlbW90ZShjb25uZWN0aW9uKTsKLSAgICAgICAgICAgIHZhciB0ID0gZy5WKCkuT3V0KCJjcmVhdGVkIikuR3JvdXBDb3VudCgibSIpLkJ5KCJuYW1lIikuSXRlcmF0ZSgpOwotCi0gICAgICAgICAgICB2YXIga2V5cyA9IHQuU2lkZUVmZmVjdHMuS2V5cygpOwotCi0gICAgICAgICAgICB2YXIga2V5c0xpc3QgPSBrZXlzLlRvTGlzdCgpOwotICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIGtleXNMaXN0LkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5Db250YWlucygibSIsIGtleXNMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtGYWN0XQotICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBTaG91bGRSZXR1cm5TaWRlRWZmZWN0c0tleXNXaGVuS2V5c0lzQ2FsbGVkT25UcmF2ZXJzYWxUaGF0RXhlY3V0ZWRBc3luY2hyb25vdXNseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb25uZWN0aW9uID0gX2Nvbm5lY3Rpb25GYWN0b3J5LkNyZWF0ZVJlbW90ZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIHZhciBnID0gQW5vbnltb3VzVHJhdmVyc2FsU291cmNlLlRyYXZlcnNhbCgpLldpdGhSZW1vdGUoY29ubmVjdGlvbik7Ci0KLSAgICAgICAgICAgIHZhciB0ID0gYXdhaXQgZy5WKCkuQWdncmVnYXRlKCJhIikuUHJvbWlzZSh4ID0+IHgpOwotICAgICAgICAgICAgdmFyIGtleXMgPSB0LlNpZGVFZmZlY3RzLktleXMoKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIGtleXMuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkNvbnRhaW5zKCJhIiwga2V5cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBbRmFjdF0KLSAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgU2hvdWxkUmV0dXJuU2lkZUVmZmVjdFZhbHVlV2hlbkdldElzQ2FsbGVkT25UcmF2ZXJzYWxUaGF0RXhlY3V0ZWRBc3luY2hyb25vdXNseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb25uZWN0aW9uID0gX2Nvbm5lY3Rpb25GYWN0b3J5LkNyZWF0ZVJlbW90ZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIHZhciBnID0gQW5vbnltb3VzVHJhdmVyc2FsU291cmNlLlRyYXZlcnNhbCgpLldpdGhSZW1vdGUoY29ubmVjdGlvbik7Ci0KLSAgICAgICAgICAgIHZhciB0ID0gYXdhaXQgZy5WKCkuQWdncmVnYXRlKCJhIikuUHJvbWlzZSh4ID0+IHgpOwotICAgICAgICAgICAgdmFyIHZhbHVlID0gdC5TaWRlRWZmZWN0cy5HZXQoImEiKTsKLQotICAgICAgICAgICAgQXNzZXJ0Lk5vdE51bGwodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW0ZhY3RdCi0gICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFNob3VsZE5vdFRocm93V2hlbkNsb3NlSXNDYWxsZWRPblRyYXZlcnNhbFRoYXRFeGVjdXRlZEFzeW5jaHJvbm91c2x5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSBfY29ubmVjdGlvbkZhY3RvcnkuQ3JlYXRlUmVtb3RlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgdmFyIGcgPSBBbm9ueW1vdXNUcmF2ZXJzYWxTb3VyY2UuVHJhdmVyc2FsKCkuV2l0aFJlbW90ZShjb25uZWN0aW9uKTsKLQotICAgICAgICAgICAgdmFyIHQgPSBhd2FpdCBnLlYoKS5BZ2dyZWdhdGUoImEiKS5Qcm9taXNlKHggPT4geCk7Ci0gICAgICAgICAgICB0LlNpZGVFZmZlY3RzLkNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC9Ecml2ZXIvSnNvbk1lc3NhZ2VTZXJpYWxpemVyVGVzdHMuY3MgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L0RyaXZlci9Kc29uTWVzc2FnZVNlcmlhbGl6ZXJUZXN0cy5jcwppbmRleCA2Nzc2NmE1Li43OWMxNzMxIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L0RyaXZlci9Kc29uTWVzc2FnZVNlcmlhbGl6ZXJUZXN0cy5jcworKysgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L0RyaXZlci9Kc29uTWVzc2FnZVNlcmlhbGl6ZXJUZXN0cy5jcwpAQCAtMjMsMTUgKzIzLDEyIEBACiAKIHVzaW5nIEdyZW1saW4uTmV0LkRyaXZlcjsKIHVzaW5nIEdyZW1saW4uTmV0LkRyaXZlci5NZXNzYWdlczsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbjsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBYdW5pdDsKIAogbmFtZXNwYWNlIEdyZW1saW4uTmV0LlVuaXRUZXN0LkRyaXZlcgogewotICAgIC8vIFdpbGwgYmUgdXNlZCBpbiBmdXR1cmUgdG8gc3dpdGNoIHRvIG5ldyAuTkVUIENvcmUgSnNvbiBkZXNlcmlhbGl6ZXIKICAgICBwdWJsaWMgY2xhc3MgSnNvbk1lc3NhZ2VTZXJpYWxpemVyVGVzdHMKICAgICB7CiAgICAgICAgIFtGYWN0XQpAQCAtMzksNyArMzYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB2YXIgc3V0ID0gbmV3IEpzb25NZXNzYWdlU2VyaWFsaXplcihHcmVtbGluQ2xpZW50LkRlZmF1bHRNaW1lVHlwZSk7CiAKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKT0+IHN1dC5EZXNlcmlhbGl6ZU1lc3NhZ2U8UmVzcG9uc2VNZXNzYWdlPEpUb2tlbj4+KG51bGwpKTsKKyAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKT0+IHN1dC5EZXNlcmlhbGl6ZU1lc3NhZ2U8UmVzcG9uc2VNZXNzYWdlPihudWxsKSk7CiAgICAgICAgIH0KIAogICAgICAgICBbRmFjdF0KQEAgLTQ3LDcgKzQ0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdmFyIHN1dCA9IG5ldyBKc29uTWVzc2FnZVNlcmlhbGl6ZXIoR3JlbWxpbkNsaWVudC5EZWZhdWx0TWltZVR5cGUpOwogCi0gICAgICAgICAgICBBc3NlcnQuTnVsbChzdXQuRGVzZXJpYWxpemVNZXNzYWdlPFJlc3BvbnNlTWVzc2FnZTxKVG9rZW4+PihuZXcgYnl0ZVswXSkpOyAgICAgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0Lk51bGwoc3V0LkRlc2VyaWFsaXplTWVzc2FnZTxSZXNwb25zZU1lc3NhZ2U+KG5ldyBieXRlWzBdKSk7ICAgICAgICAgICAgCiAgICAgICAgIH0KIAogICAgICAgICBbRmFjdF0KQEAgLTU2LDcgKzUzLDcgQEAKICAgICAgICAgICAgIHZhciBzdXQgPSBuZXcgSnNvbk1lc3NhZ2VTZXJpYWxpemVyKEdyZW1saW5DbGllbnQuRGVmYXVsdE1pbWVUeXBlKTsKICAgICAgICAgICAgIHZhciBvZkVtcHR5ID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcygiIik7CiAKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKHN1dC5EZXNlcmlhbGl6ZU1lc3NhZ2U8UmVzcG9uc2VNZXNzYWdlPEpUb2tlbj4+KG9mRW1wdHkpKTsKKyAgICAgICAgICAgIEFzc2VydC5OdWxsKHN1dC5EZXNlcmlhbGl6ZU1lc3NhZ2U8UmVzcG9uc2VNZXNzYWdlPihvZkVtcHR5KSk7CiAgICAgICAgIH0KIAogICAgICAgICBbRmFjdF0KQEAgLTY1LDcgKzYyLDcgQEAKICAgICAgICAgICAgIHZhciBzdXQgPSBuZXcgSnNvbk1lc3NhZ2VTZXJpYWxpemVyKEdyZW1saW5DbGllbnQuRGVmYXVsdE1pbWVUeXBlKTsKICAgICAgICAgICAgIHZhciBvZk51bGwgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCJudWxsIik7CiAKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKHN1dC5EZXNlcmlhbGl6ZU1lc3NhZ2U8UmVzcG9uc2VNZXNzYWdlPEpUb2tlbj4+KG9mTnVsbCkpOworICAgICAgICAgICAgQXNzZXJ0Lk51bGwoc3V0LkRlc2VyaWFsaXplTWVzc2FnZTxSZXNwb25zZU1lc3NhZ2U+KG9mTnVsbCkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC5jc3Byb2ogYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0LmNzcHJvagppbmRleCA0MTUwNzJmLi45MDI5NmJlIDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0LmNzcHJvagorKysgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0LmNzcHJvagpAQCAtMTIsNyArMTIsNiBAQAogICA8L0l0ZW1Hcm91cD4KIAogICA8SXRlbUdyb3VwPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik5ld3RvbnNvZnQuSnNvbiIgVmVyc2lvbj0iMTEuMC4yIiAvPgogICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5ORVQuVGVzdC5TZGsiIFZlcnNpb249IjE1LjMuMCIgLz4KICAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNb3EiIFZlcnNpb249IjQuNy45OSIgLz4KICAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJ4dW5pdC5ydW5uZXIudmlzdWFsc3R1ZGlvIiBWZXJzaW9uPSIyLjIuMCIgLz4KZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhUcmF2ZXJzYWxTb3VyY2VUZXN0cy5jcyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvUHJvY2Vzcy9UcmF2ZXJzYWwvR3JhcGhUcmF2ZXJzYWxTb3VyY2VUZXN0cy5jcwppbmRleCBiM2MyODVmLi4yY2MzOWE2IDEwMDY0NAotLS0gYS9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L1Byb2Nlc3MvVHJhdmVyc2FsL0dyYXBoVHJhdmVyc2FsU291cmNlVGVzdHMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC9Qcm9jZXNzL1RyYXZlcnNhbC9HcmFwaFRyYXZlcnNhbFNvdXJjZVRlc3RzLmNzCkBAIC0yMSw2ICsyMSw3IEBACiAKICNlbmRyZWdpb24KIAordXNpbmcgU3lzdGVtOwogdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWw7CiB1c2luZyBYdW5pdDsKIApAQCAtODMsNSArODQsMTUgQEAKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCg1LCBjbG9uZS5CeXRlY29kZS5TdGVwSW5zdHJ1Y3Rpb25zLkNvdW50KTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCg0LCBjbG9uZUNsb25lLkJ5dGVjb2RlLlN0ZXBJbnN0cnVjdGlvbnMuQ291bnQpOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBbRmFjdF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkT25seUFsbG93Q2hpbGRUcmF2ZXJzYWxzVGhhdEFyZUFub255bW91cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBnID0gQW5vbnltb3VzVHJhdmVyc2FsU291cmNlLlRyYXZlcnNhbCgpOworCisgICAgICAgICAgICBnLlYoMCkuQWRkRSgic2VsZiIpLlRvKF9fLlYoMSkpOworCisgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiBnLlYoMCkuQWRkRSgic2VsZiIpLlRvKGcuVigxKSkpOworICAgICAgICB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvUHJvY2Vzcy9UcmF2ZXJzYWwvVHJhdmVyc2FsVGVzdHMuY3MgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L1Byb2Nlc3MvVHJhdmVyc2FsL1RyYXZlcnNhbFRlc3RzLmNzCmluZGV4IGE3ZDYyYWMuLmU3NzNmNzQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvUHJvY2Vzcy9UcmF2ZXJzYWwvVHJhdmVyc2FsVGVzdHMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC9Qcm9jZXNzL1RyYXZlcnNhbC9UcmF2ZXJzYWxUZXN0cy5jcwpAQCAtMjQsNyArMjQsNiBAQAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1vcTsKIHVzaW5nIFh1bml0OwogdXNpbmcgR3JlbWxpbi5OZXQuUHJvY2Vzcy5UcmF2ZXJzYWw7CiAKQEAgLTE4MCwxNiArMTc5LDUgQEAKICAgICAgICAgICAgIHZhciBleHBlY3RlZE9ianMgPSBVbmZvbGRCdWxrcyhvYmpzLCBidWxrcyk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoZXhwZWN0ZWRPYmpzLCB0cmF2ZXJzZWRPYmpzKTsKICAgICAgICAgfQotCi0gICAgICAgIFtGYWN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREaXNwb3NlU2lkZUVmZmVjdHNXaGVuRGlzcG9zZUlzQ2FsbGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNpZGVFZmZlY3RzTW9jayA9IG5ldyBNb2NrPElUcmF2ZXJzYWxTaWRlRWZmZWN0cz4oKTsKLSAgICAgICAgICAgIHZhciB0cmF2ZXJzYWwgPSBuZXcgVGVzdFRyYXZlcnNhbChuZXcgTGlzdDxvYmplY3Q+KCkpIHtTaWRlRWZmZWN0cyA9IHNpZGVFZmZlY3RzTW9jay5PYmplY3R9OwotCi0gICAgICAgICAgICB0cmF2ZXJzYWwuRGlzcG9zZSgpOwotCi0gICAgICAgICAgICBzaWRlRWZmZWN0c01vY2suVmVyaWZ5KG0gPT4gbS5EaXNwb3NlKCkpOwotICAgICAgICB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvU3RydWN0dXJlL0lPL0dyYXBoU09OL0J5dGVjb2RlR3JhcGhTT05TZXJpYWxpemVyVGVzdHMuY3MgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9CeXRlY29kZUdyYXBoU09OU2VyaWFsaXplclRlc3RzLmNzCmluZGV4IDliMzkzOTEuLjI5YTQzNGYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvU3RydWN0dXJlL0lPL0dyYXBoU09OL0J5dGVjb2RlR3JhcGhTT05TZXJpYWxpemVyVGVzdHMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vQnl0ZWNvZGVHcmFwaFNPTlNlcmlhbGl6ZXJUZXN0cy5jcwpAQCAtMTYyLDYgKzE2Miw3IEBACiAgICAgICAgIHB1YmxpYyBUZXN0VHJhdmVyc2FsKEJ5dGVjb2RlIGJ5dGVjb2RlKQogICAgICAgICB7CiAgICAgICAgICAgICBCeXRlY29kZSA9IGJ5dGVjb2RlOworICAgICAgICAgICAgSXNBbm9ueW1vdXMgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvU3RydWN0dXJlL0lPL0dyYXBoU09OL0dyYXBoU09OUmVhZGVyVGVzdHMuY3MgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9HcmFwaFNPTlJlYWRlclRlc3RzLmNzCmluZGV4IDNhNDkxNDMuLmQ1MGRhOWMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvU3RydWN0dXJlL0lPL0dyYXBoU09OL0dyYXBoU09OUmVhZGVyVGVzdHMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vR3JhcGhTT05SZWFkZXJUZXN0cy5jcwpAQCAtMjQsMTEgKzI0LDExIEBACiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5OdW1lcmljczsKK3VzaW5nIFN5c3RlbS5UZXh0Lkpzb247CiB1c2luZyBHcmVtbGluLk5ldC5Qcm9jZXNzLlRyYXZlcnNhbDsKIHVzaW5nIEdyZW1saW4uTmV0LlN0cnVjdHVyZTsKIHVzaW5nIEdyZW1saW4uTmV0LlN0cnVjdHVyZS5JTy5HcmFwaFNPTjsKIHVzaW5nIE1vcTsKLXVzaW5nIE5ld3RvbnNvZnQuSnNvbi5MaW5xOwogdXNpbmcgWHVuaXQ7CiAKIG5hbWVzcGFjZSBHcmVtbGluLk5ldC5Vbml0VGVzdC5TdHJ1Y3R1cmUuSU8uR3JhcGhTT04KQEAgLTYxLDE3ICs2MSw2IEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IEdyYXBoU09OMlJlYWRlcigpOwogICAgICAgICB9CiAKLSAgICAgICAgLy9EdXJpbmcgQ0ksIHdlIGVuY291bnRlcmVkIGEgY2FzZSB3aGVyZSBOZXd0b25zb2Z0Lkpzb24gdmVyc2lvbiA5LjAuMAotICAgICAgICAvL3dhcyBsb2FkZWQgYWx0aG91Z2ggdGhlcmUgaXMgbm8gb2J2aW91cyBkaXJlY3Qgbm9yIGluZGlyZWN0IGRlcGVuZGVuY3kKLSAgICAgICAgLy9vbiB0aGF0IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIEFuIGV4cGxpY2l0IHJlZmVyZW5jZSB0byB2ZXJzaW9uCi0gICAgICAgIC8vMTEuMC4wIGZyb20gR3JlbWxpbi5OZXQuVW5pdFRlc3QgZml4ZXMgdGhhdCwgaG93ZXZlciwgaXQgaXMKLSAgICAgICAgLy9zdGlsbCB1bmNsZWFyIHdoYXQgY2F1c2VzIHRoZSBkb3duZ3JhZGUuIFVudGlsIHJlc29sdXRpb24sIHdlIGtlZXAgdGhpcyB0ZXN0LgotICAgICAgICBbRmFjdF0KLSAgICAgICAgcHVibGljIHZvaWQgTmV3dG9uc29mdEpzb25WZXJzaW9uU2hvdWxkU3VwcG9ydFJlYWxseUJpZ0ludGVnZXJzKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKG5ldyBWZXJzaW9uKDExLCAwLCAwLCAwKSwgdHlwZW9mKEpUb2tlbikuQXNzZW1ibHkuR2V0TmFtZSgpLlZlcnNpb24pOwotICAgICAgICB9Ci0KICAgICAgICAgW0ZhY3RdCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplV2l0aEN1c3RvbURlc2VyaWFsaXplckZvck5ld1R5cGUoKQogICAgICAgICB7CkBAIC04MCwyNTkgKzY5LDI5NyBAQAogICAgICAgICAgICAgICAgIHsiTlM6VGVzdENsYXNzIiwgbmV3IFRlc3RHcmFwaFNPTkRlc2VyaWFsaXplcigpfQogICAgICAgICAgICAgfTsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgR3JhcGhTT04yUmVhZGVyKGRlc2VyaWFsaXplckJ5R3JhcGhTT05UeXBlKTsKLSAgICAgICAgICAgIHZhciBncmFwaFNPTiA9ICJ7XCJAdHlwZVwiOlwiTlM6VGVzdENsYXNzXCIsXCJAdmFsdWVcIjpcInRlc3RcIn0iOwotCi0gICAgICAgICAgICB2YXIgak9iamVjdCA9IEpPYmplY3QuUGFyc2UoZ3JhcGhTT04pOwotICAgICAgICAgICAgdmFyIHJlYWRPYmogPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5FcXVhbCgidGVzdCIsIHJlYWRPYmouVmFsdWUpOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGdyYXBoU09OID0gIntcIkB0eXBlXCI6XCJOUzpUZXN0Q2xhc3NcIixcIkB2YWx1ZVwiOlwidGVzdFwifSI7CisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU09OKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJ0ZXN0IiwgZGVzZXJpYWxpemVkVmFsdWUuVmFsdWUpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtGYWN0XQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZVdpdGhDdXN0b21EZXNlcmlhbGl6ZXJGb3JDb21tb25UeXBlKCkKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGN1c3RvbVNlcmlhbGl6ZXJNb2NrID0gbmV3IE1vY2s8SUdyYXBoU09ORGVzZXJpYWxpemVyPigpOwotICAgICAgICAgICAgdmFyIG92ZXJyaWRlVHlwZVN0cmluZyA9ICJnOkludDY0IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBvdmVycmlkZVR5cGVTdHJpbmcgPSAiZzpJbnQ2NCI7CiAgICAgICAgICAgICB2YXIgY3VzdG9tU2VyaWFsaXplckJ5VHlwZSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSUdyYXBoU09ORGVzZXJpYWxpemVyPgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHtvdmVycmlkZVR5cGVTdHJpbmcsIGN1c3RvbVNlcmlhbGl6ZXJNb2NrLk9iamVjdH0KICAgICAgICAgICAgIH07CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEdyYXBoU09OMlJlYWRlcihjdXN0b21TZXJpYWxpemVyQnlUeXBlKTsKIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0KKyAgICAgICAgICAgICAgICBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oJCJ7e1wiQHR5cGVcIjpcIntvdmVycmlkZVR5cGVTdHJpbmd9XCIsXCJAdmFsdWVcIjoxMn19Iik7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOwogCi0gICAgICAgICAgICByZWFkZXIuVG9PYmplY3QoSk9iamVjdC5QYXJzZSgkInt7XCJAdHlwZVwiOlwie292ZXJyaWRlVHlwZVN0cmluZ31cIixcIkB2YWx1ZVwiOjEyfX0iKSk7Ci0KLSAgICAgICAgICAgIGN1c3RvbVNlcmlhbGl6ZXJNb2NrLlZlcmlmeShtID0+IG0uT2JqZWN0aWZ5KEl0LklzQW55PEpUb2tlbj4oKSwgSXQuSXNBbnk8R3JhcGhTT05SZWFkZXI+KCkpKTsKKyAgICAgICAgICAgIGN1c3RvbVNlcmlhbGl6ZXJNb2NrLlZlcmlmeShtID0+IG0uT2JqZWN0aWZ5KEl0LklzQW55PEpzb25FbGVtZW50PigpLCBJdC5Jc0FueTxHcmFwaFNPTlJlYWRlcj4oKSkpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplRGF0ZVRvRGF0ZVRpbWVPZmZzZXQoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpEYXRlXCIsXCJAdmFsdWVcIjoxNDc1NTgzNDQyNTUyfSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6RGF0ZVwiLFwiQHZhbHVlXCI6MTQ3NTU4MzQ0MjU1Mn0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIERhdGVUaW1lT2Zmc2V0IGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KEpPYmplY3QuUGFyc2UoZ3JhcGhTb24pKTsKLQorICAgICAgICAKKyAgICAgICAgICAgIHZhciBqc29uRWxlbWVudCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPEpzb25FbGVtZW50PihncmFwaFNvbik7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKICAgICAgICAgICAgIHZhciBleHBlY3RlZERhdGVUaW1lT2Zmc2V0ID0gVGVzdFV0aWxzLkZyb21KYXZhVGltZSgxNDc1NTgzNDQyNTUyKTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbChleHBlY3RlZERhdGVUaW1lT2Zmc2V0LCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVEaWN0aW9uYXJ5KGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VyaWFsaXplZERpY3QgPSAie1wiYWdlXCI6W3tcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjoyOX1dLFwibmFtZVwiOltcIm1hcmtvXCJdfSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgc2VyaWFsaXplZERpY3QgPSAie1wiYWdlXCI6W3tcIkB0eXBlXCI6XCJnOkludDMyXCIsIFwiQHZhbHVlXCI6Mjl9XSwgXCJuYW1lXCI6W1wibWFya29cIl0sICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZ2VuZGVyXCI6IG51bGx9IjsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwotCi0gICAgICAgICAgICB2YXIgak9iamVjdCA9IEpPYmplY3QuUGFyc2Uoc2VyaWFsaXplZERpY3QpOwotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZERpY3QgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oc2VyaWFsaXplZERpY3QpOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICB2YXIgZXhwZWN0ZWREaWN0ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBkeW5hbWljPgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHsiYWdlIiwgbmV3IExpc3Q8b2JqZWN0PiB7Mjl9fSwKLSAgICAgICAgICAgICAgICB7Im5hbWUiLCBuZXcgTGlzdDxvYmplY3Q+IHsibWFya28ifX0KKyAgICAgICAgICAgICAgICB7Im5hbWUiLCBuZXcgTGlzdDxvYmplY3Q+IHsibWFya28ifX0sCisgICAgICAgICAgICAgICAgeyJnZW5kZXIiLCBudWxsfQogICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIEFzc2VydC5FcXVhbChleHBlY3RlZERpY3QsIGRlc2VyaWFsaXplZERpY3QpOworICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKGV4cGVjdGVkRGljdCwgZGVzZXJpYWxpemVkVmFsdWUpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplRWRnZShpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGdyYXBoU29uID0KLSAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjpcImc6RWRnZVwiLCBcIkB2YWx1ZVwiOntcImlkXCI6e1wiQHR5cGVcIjpcImc6SW50NjRcIixcIkB2YWx1ZVwiOjE3fSxcImxhYmVsXCI6XCJrbm93c1wiLFwiaW5WXCI6XCJ4XCIsXCJvdXRWXCI6XCJ5XCIsXCJpblZMYWJlbFwiOlwieExhYlwiLFwicHJvcGVydGllc1wiOntcImFLZXlcIjpcImFWYWx1ZVwiLFwiYktleVwiOnRydWV9fX0iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGdyYXBoU29uID0gIntcIkB0eXBlXCI6XCJnOkVkZ2VcIiwgXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsIFwiQHZhbHVlXCI6MTd9LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcImxhYmVsXCI6XCJrbm93c1wiLCBcImluVlwiOlwieFwiLCBcIm91dFZcIjpcInlcIiwgXCJpblZMYWJlbFwiOlwieExhYlwiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcInByb3BlcnRpZXNcIjp7XCJhS2V5XCI6XCJhVmFsdWVcIiwgXCJiS2V5XCI6dHJ1ZX19fSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgRWRnZSByZWFkRWRnZSA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgRWRnZSByZWFkRWRnZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKChsb25nKSAxNywgcmVhZEVkZ2UuSWQpOwogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJrbm93cyIsIHJlYWRFZGdlLkxhYmVsKTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbChuZXcgVmVydGV4KCJ4IiwgInhMYWJlbCIpLCByZWFkRWRnZS5JblYpOwogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKG5ldyBWZXJ0ZXgoInkiKSwgcmVhZEVkZ2UuT3V0Vik7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVJbnQoaW50IHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIHZhciBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjV9IjsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwogCi0gICAgICAgICAgICB2YXIgak9iamVjdCA9IEpPYmplY3QuUGFyc2Uoc2VyaWFsaXplZFZhbHVlKTsKLSAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqT2JqZWN0KTsKLQorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KHNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCg1LCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVMb25nKGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjo1fSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjo1fSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oc2VyaWFsaXplZFZhbHVlKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKChsb25nKSA1LCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVGbG9hdChpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZzpGbG9hdFwiLFwiQHZhbHVlXCI6MzEuM30iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZzpGbG9hdFwiLFwiQHZhbHVlXCI6MzEuM30iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIHZhciBqT2JqZWN0ID0gSk9iamVjdC5QYXJzZShzZXJpYWxpemVkVmFsdWUpOwotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KHNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgoZmxvYXQpIDMxLjMsIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZURvdWJsZShpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZzpEb3VibGVcIixcIkB2YWx1ZVwiOjMxLjJ9IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImc6RG91YmxlXCIsXCJAdmFsdWVcIjozMS4yfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oc2VyaWFsaXplZFZhbHVlKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDMxLjIsIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZU5hTihpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZzpEb3VibGVcIixcIkB2YWx1ZVwiOidOYU4nfSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJnOkRvdWJsZVwiLFwiQHZhbHVlXCI6XCJOYU5cIn0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIHZhciBqT2JqZWN0ID0gSk9iamVjdC5QYXJzZShzZXJpYWxpemVkVmFsdWUpOwotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KHNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKICAgICAgICAgICAgIEFzc2VydC5FcXVhbChEb3VibGUuTmFOLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVQb3NpdGl2ZUluZmluaXR5KGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJnOkRvdWJsZVwiLFwiQHZhbHVlXCI6J0luZmluaXR5J30iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZzpEb3VibGVcIixcIkB2YWx1ZVwiOlwiSW5maW5pdHlcIn0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIHZhciBqT2JqZWN0ID0gSk9iamVjdC5QYXJzZShzZXJpYWxpemVkVmFsdWUpOwotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCi0gICAgICAgICAgICBBc3NlcnQuRXF1YWwoRG91YmxlLlBvc2l0aXZlSW5maW5pdHksIGRlc2VyaWFsaXplZFZhbHVlKTsKKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oc2VyaWFsaXplZFZhbHVlKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5LCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVOZWdhdGl2ZUluZmluaXR5KGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJnOkRvdWJsZVwiLFwiQHZhbHVlXCI6Jy1JbmZpbml0eSd9IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImc6RG91YmxlXCIsXCJAdmFsdWVcIjpcIi1JbmZpbml0eVwifSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5FcXVhbChEb3VibGUuTmVnYXRpdmVJbmZpbml0eSwgZGVzZXJpYWxpemVkVmFsdWUpOworICAgICAgICAKKyAgICAgICAgICAgIHZhciBqc29uRWxlbWVudCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPEpzb25FbGVtZW50PihzZXJpYWxpemVkVmFsdWUpOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoZG91YmxlLk5lZ2F0aXZlSW5maW5pdHksIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZURlY2ltYWwoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImd4OkJpZ0RlY2ltYWxcIixcIkB2YWx1ZVwiOi04LjIwMX0iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZ3g6QmlnRGVjaW1hbFwiLFwiQHZhbHVlXCI6LTguMjAxfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICBkZWNpbWFsIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KHNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgtOC4yMDFNLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVEZWNpbWFsVmFsdWVBc1N0cmluZyhpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZ3g6QmlnRGVjaW1hbFwiLFwiQHZhbHVlXCI6XCI3LjUwXCJ9IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImd4OkJpZ0RlY2ltYWxcIixcIkB2YWx1ZVwiOlwiNy41MFwifSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICBkZWNpbWFsIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KHNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgICAgICBkZWNpbWFsIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoNy41TSwgZGVzZXJpYWxpemVkVmFsdWUpOwogICAgICAgICB9Ci0KKyAgICAgICAgCisgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplQnl0ZShpbnQgdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZ3g6Qnl0ZVwiLFwiQHZhbHVlXCI6MX0iOworICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7CisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KHNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgxLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplQ2hhcihpbnQgdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZ3g6Q2hhclwiLFwiQHZhbHVlXCI6XCJ4XCJ9IjsKKyAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOworICAgICAgICAKKyAgICAgICAgICAgIHZhciBqc29uRWxlbWVudCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPEpzb25FbGVtZW50PihzZXJpYWxpemVkVmFsdWUpOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoJ3gnLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplTGlzdChpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRWYWx1ZSA9ICJbe1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjV9LHtcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjo2fV0iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHNlcmlhbGl6ZWRWYWx1ZSA9ICJbe1wiQHR5cGVcIjpcImc6SW50MzJcIiwgXCJAdmFsdWVcIjo1fSwge1wiQHR5cGVcIjpcImc6SW50MzJcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiQHZhbHVlXCI6Nn0sIG51bGxdIjsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwotCi0gICAgICAgICAgICB2YXIgak9iamVjdCA9IEpBcnJheS5QYXJzZShzZXJpYWxpemVkVmFsdWUpOwotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCi0gICAgICAgICAgICBBc3NlcnQuRXF1YWwobmV3IExpc3Q8b2JqZWN0PiB7NSwgNn0sIGRlc2VyaWFsaXplZFZhbHVlKTsKKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oc2VyaWFsaXplZFZhbHVlKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKG5ldyBMaXN0PG9iamVjdD4gezUsIDYsIG51bGx9LCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVUKGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6VFwiLFwiQHZhbHVlXCI6XCJsYWJlbFwifSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6VFwiLFwiQHZhbHVlXCI6XCJsYWJlbFwifSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgVCByZWFkVCA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgVCByZWFkVCA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKFQuTGFiZWwsIHJlYWRUKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZURpcmVjdGlvbihpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRWYWx1ZSA9ICJ7XCJAdHlwZVwiOlwiZzpEaXJlY3Rpb25cIixcIkB2YWx1ZVwiOlwiT1VUXCJ9IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImc6RGlyZWN0aW9uXCIsXCJAdmFsdWVcIjpcIk9VVFwifSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oc2VyaWFsaXplZFZhbHVlKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKERpcmVjdGlvbi5PdXQsIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbRmFjdF0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVQYXRoRnJvbUdyYXBoU09OMigpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBncmFwaFNvbiA9CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPQogICAgICAgICAgICAgICAgICJ7XCJAdHlwZVwiOlwiZzpQYXRoXCIsXCJAdmFsdWVcIjp7XCJsYWJlbHNcIjpbW1wiYVwiXSxbXCJiXCIsXCJjXCJdLFtdXSxcIm9iamVjdHNcIjpbe1wiQHR5cGVcIjpcImc6VmVydGV4XCIsXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjoxfSxcImxhYmVsXCI6XCJwZXJzb25cIixcInByb3BlcnRpZXNcIjp7XCJuYW1lXCI6W3tcIkB0eXBlXCI6XCJnOlZlcnRleFByb3BlcnR5XCIsXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjowfSxcInZhbHVlXCI6XCJtYXJrb1wiLFwibGFiZWxcIjpcIm5hbWVcIn19XSxcImFnZVwiOlt7XCJAdHlwZVwiOlwiZzpWZXJ0ZXhQcm9wZXJ0eVwiLFwiQHZhbHVlXCI6e1wiaWRcIjp7XCJAdHlwZVwiOlwiZzpJbnQ2NFwiLFwiQHZhbHVlXCI6MX0sXCJ2YWx1ZVwiOntcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjoyOX0sXCJsYWJlbFwiOlwiYWdlXCJ9fV19fX0se1wiQHR5cGVcIjpcImc6VmVydGV4XCIsXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjozfSxcImxhYmVsXCI6XCJzb2Z0d2FyZVwiLFwicHJvcGVydGllc1wiOntcIm5hbWVcIjpbe1wiQHR5cGVcIjpcImc6VmVydGV4UHJvcGVydHlcIixcIkB2YWx1ZVwiOntcImlkXCI6e1wiQHR5cGVcIjpcImc6SW50NjRcIixcIkB2YWx1ZVwiOjR9LFwidmFsdWVcIjpcImxvcFwiLFwibGFiZWxcIjpcIm5hbWVcIn19XSxcImxhbmdcIjpbe1wiQHR5cGVcIjpcImc6VmVydGV4UHJvcGVydHlcIixcIkB2YWx1ZVwiOntcImlkXCI6e1wiQHR5cGVcIjpcImc6SW50NjRcIixcIkB2YWx1ZVwiOjV9LFwidmFsdWVcIjpcImphdmFcIixcImxhYmVsXCI6XCJsYW5nXCJ9fV19fX0sXCJsb3BcIl19fSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcigyKTsKLQotICAgICAgICAgICAgUGF0aCByZWFkUGF0aCA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgUGF0aCByZWFkUGF0aCA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJwYXRoW3ZbMV0sIHZbM10sIGxvcF0iLCByZWFkUGF0aC5Ub1N0cmluZygpKTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbChuZXcgVmVydGV4KDEpLCByZWFkUGF0aFswXSk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwobmV3IFZlcnRleCgxKSwgcmVhZFBhdGhbImEiXSk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoImxvcCIsIHJlYWRQYXRoWzJdKTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgzLCByZWFkUGF0aC5Db3VudCk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW0ZhY3RdCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplUGF0aEZyb21HcmFwaFNPTjMoKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6UGF0aFwiLFwiQHZhbHVlXCI6eyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwibGFiZWxzXCI6e1wiQHR5cGVcIjpcImc6TGlzdFwiLFwiQHZhbHVlXCI6W3tcIkB0eXBlXCI6XCJnOlNldFwiLFwiQHZhbHVlXCI6W1wielwiXX1dfSwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIm9iamVjdHNcIjp7XCJAdHlwZVwiOlwiZzpMaXN0XCIsXCJAdmFsdWVcIjpbe1wiQHR5cGVcIjpcImc6VmVydGV4XCIsXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjo1fSxcImxhYmVsXCI6XCJcIn19XX19fSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6UGF0aFwiLFwiQHZhbHVlXCI6eyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwibGFiZWxzXCI6e1wiQHR5cGVcIjpcImc6TGlzdFwiLFwiQHZhbHVlXCI6W3tcIkB0eXBlXCI6XCJnOlNldFwiLFwiQHZhbHVlXCI6W1wielwiXX1dfSwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIm9iamVjdHNcIjp7XCJAdHlwZVwiOlwiZzpMaXN0XCIsXCJAdmFsdWVcIjpbe1wiQHR5cGVcIjpcImc6VmVydGV4XCIsXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjo1fSxcImxhYmVsXCI6XCJcIn19XX19fSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcigzKTsKLQotICAgICAgICAgICAgUGF0aCByZWFkUGF0aCA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgUGF0aCByZWFkUGF0aCA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJwYXRoW3ZbNV1dIiwgcmVhZFBhdGguVG9TdHJpbmcoKSk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwobmV3IFZlcnRleCg1TCksIHJlYWRQYXRoWzBdKTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbChuZXcgVmVydGV4KDVMKSwgcmVhZFBhdGhbInoiXSk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoMSwgcmVhZFBhdGguQ291bnQpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplUHJvcGVydHlXaXRoRWRnZUVsZW1lbnQoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBncmFwaFNvbiA9Ci0gICAgICAgICAgICAgICAgIntcIkB0eXBlXCI6XCJnOlByb3BlcnR5XCIsXCJAdmFsdWVcIjp7XCJrZXlcIjpcImFLZXlcIixcInZhbHVlXCI6e1wiQHR5cGVcIjpcImc6SW50NjRcIixcIkB2YWx1ZVwiOjE3fSxcImVsZW1lbnRcIjp7XCJAdHlwZVwiOlwiZzpFZGdlXCIsXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjoxMjJ9LFwibGFiZWxcIjpcImtub3dzXCIsXCJpblZcIjpcInhcIixcIm91dFZcIjpcInlcIixcImluVkxhYmVsXCI6XCJ4TGFiXCJ9fX19IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpQcm9wZXJ0eVwiLCBcIkB2YWx1ZVwiOntcImtleVwiOlwiYUtleVwiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcInZhbHVlXCI6e1wiQHR5cGVcIjpcImc6SW50NjRcIiwgXCJAdmFsdWVcIjoxN30sICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZWxlbWVudFwiOntcIkB0eXBlXCI6XCJnOkVkZ2VcIiwgXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiQHZhbHVlXCI6MTIyfSwgXCJsYWJlbFwiOlwia25vd3NcIiwgXCJpblZcIjpcInhcIiwgXCJvdXRWXCI6XCJ5XCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiaW5WTGFiZWxcIjpcInhMYWJcIn19fX0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5IHJlYWRQcm9wZXJ0eSA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgUHJvcGVydHkgcmVhZFByb3BlcnR5ID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoImFLZXkiLCByZWFkUHJvcGVydHkuS2V5KTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgobG9uZykgMTcsIHJlYWRQcm9wZXJ0eS5WYWx1ZSk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwodHlwZW9mKEVkZ2UpLCByZWFkUHJvcGVydHkuRWxlbWVudC5HZXRUeXBlKCkpOwpAQCAtMzQyLDI2NSArMzY5LDI4NSBAQAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJ4IiwgZWRnZS5JblYuSWQpOwogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJ5IiwgZWRnZS5PdXRWLklkKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZVRpbWVzdGFtcFRvRGF0ZVRpbWVPZmZzZXQoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpUaW1lc3RhbXBcIixcIkB2YWx1ZVwiOjE0NzU1ODM0NDI1NTh9IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpUaW1lc3RhbXBcIixcIkB2YWx1ZVwiOjE0NzU1ODM0NDI1NTh9IjsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwotCi0gICAgICAgICAgICBEYXRlVGltZU9mZnNldCBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICB2YXIgZXhwZWN0ZWREYXRlVGltZU9mZnNldCA9IFRlc3RVdGlscy5Gcm9tSmF2YVRpbWUoMTQ3NTU4MzQ0MjU1OCk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoZXhwZWN0ZWREYXRlVGltZU9mZnNldCwgZGVzZXJpYWxpemVkVmFsdWUpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplR3VpZChpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGdyYXBoU29uID0gIntcIkB0eXBlXCI6XCJnOlVVSURcIixcIkB2YWx1ZVwiOlwiNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2XCJ9IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpVVUlEXCIsXCJAdmFsdWVcIjpcIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NlwifSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgR3VpZCByZWFkR3VpZCA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5FcXVhbChHdWlkLlBhcnNlKCI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiKSwgcmVhZEd1aWQpOworICAgICAgICAKKyAgICAgICAgICAgIHZhciBqc29uRWxlbWVudCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPEpzb25FbGVtZW50PihncmFwaFNvbik7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbChHdWlkLlBhcnNlKCI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiKSwgZGVzZXJpYWxpemVkVmFsdWUpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplVmVydGV4UHJvcGVydHkoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBncmFwaFNvbiA9Ci0gICAgICAgICAgICAgICAgIntcIkB0eXBlXCI6XCJnOlZlcnRleFByb3BlcnR5XCIsXCJAdmFsdWVcIjp7XCJpZFwiOlwiYW5JZFwiLFwibGFiZWxcIjpcImFLZXlcIixcInZhbHVlXCI6dHJ1ZSxcInZlcnRleFwiOntcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjo5fX19IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpWZXJ0ZXhQcm9wZXJ0eVwiLCBcIkB2YWx1ZVwiOntcImlkXCI6XCJhbklkXCIsIFwibGFiZWxcIjpcImFLZXlcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJ2YWx1ZVwiOnRydWUsIFwidmVydGV4XCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIiwgXCJAdmFsdWVcIjo5fX19IjsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwotCi0gICAgICAgICAgICBWZXJ0ZXhQcm9wZXJ0eSByZWFkVmVydGV4UHJvcGVydHkgPSByZWFkZXIuVG9PYmplY3QoSk9iamVjdC5QYXJzZShncmFwaFNvbikpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU29uKTsKKyAgICAgICAgICAgIFZlcnRleFByb3BlcnR5IHJlYWRWZXJ0ZXhQcm9wZXJ0eSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKCJhbklkIiwgcmVhZFZlcnRleFByb3BlcnR5LklkKTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiYUtleSIsIHJlYWRWZXJ0ZXhQcm9wZXJ0eS5MYWJlbCk7CiAgICAgICAgICAgICBBc3NlcnQuVHJ1ZShyZWFkVmVydGV4UHJvcGVydHkuVmFsdWUpOwogICAgICAgICAgICAgQXNzZXJ0Lk5vdE51bGwocmVhZFZlcnRleFByb3BlcnR5LlZlcnRleCk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVWZXJ0ZXhQcm9wZXJ0eVdpdGhMYWJlbChpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGdyYXBoU29uID0KLSAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjpcImc6VmVydGV4UHJvcGVydHlcIiwgXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjoxfSxcImxhYmVsXCI6XCJuYW1lXCIsXCJ2YWx1ZVwiOlwibWFya29cIn19IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpWZXJ0ZXhQcm9wZXJ0eVwiLCBcIkB2YWx1ZVwiOntcImlkXCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJAdmFsdWVcIjoxfSwgXCJsYWJlbFwiOlwibmFtZVwiLCBcInZhbHVlXCI6XCJtYXJrb1wifX0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIFZlcnRleFByb3BlcnR5IHJlYWRWZXJ0ZXhQcm9wZXJ0eSA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgVmVydGV4UHJvcGVydHkgcmVhZFZlcnRleFByb3BlcnR5ID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoMSwgcmVhZFZlcnRleFByb3BlcnR5LklkKTsKICAgICAgICAgICAgIEFzc2VydC5FcXVhbCgibmFtZSIsIHJlYWRWZXJ0ZXhQcm9wZXJ0eS5MYWJlbCk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoIm1hcmtvIiwgcmVhZFZlcnRleFByb3BlcnR5LlZhbHVlKTsKICAgICAgICAgICAgIEFzc2VydC5OdWxsKHJlYWRWZXJ0ZXhQcm9wZXJ0eS5WZXJ0ZXgpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplVmVydGV4KGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6VmVydGV4XCIsIFwiQHZhbHVlXCI6e1wiaWRcIjp7XCJAdHlwZVwiOlwiZzpGbG9hdFwiLFwiQHZhbHVlXCI6NDUuMjN9fX0iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGdyYXBoU29uID0gIntcIkB0eXBlXCI6XCJnOlZlcnRleFwiLCBcIkB2YWx1ZVwiOntcImlkXCI6e1wiQHR5cGVcIjpcImc6RmxvYXRcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJAdmFsdWVcIjo0NS4yM319fSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIHJlYWRWZXJ0ZXggPSByZWFkZXIuVG9PYmplY3QoSk9iamVjdC5QYXJzZShncmFwaFNvbikpOwotCi0gICAgICAgICAgICBBc3NlcnQuRXF1YWwobmV3IFZlcnRleCg0NS4yM2YpLCByZWFkVmVydGV4KTsKKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwobmV3IFZlcnRleCg0NS4yM2YpLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKKyAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVWZXJ0ZXhXaXRoTGFiZWwoaW50IHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpWZXJ0ZXhcIiwgXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkZsb2F0XCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiQHZhbHVlXCI6NDUuMjN9LCBcImxhYmVsXCI6IFwicGVyc29uXCJ9fSI7CisgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgVmVydGV4IGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuRXF1YWwoInBlcnNvbiIsIGRlc2VyaWFsaXplZFZhbHVlLkxhYmVsKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVWZXJ0ZXhXaXRoRWRnZXMoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBncmFwaFNvbiA9CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPQogICAgICAgICAgICAgICAgICJ7XCJAdHlwZVwiOlwiZzpWZXJ0ZXhcIiwgXCJAdmFsdWVcIjp7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjoxfSxcImxhYmVsXCI6XCJwZXJzb25cIixcIm91dEVcIjp7XCJjcmVhdGVkXCI6W3tcImlkXCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjl9LFwiaW5WXCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjN9LFwicHJvcGVydGllc1wiOntcIndlaWdodFwiOntcIkB0eXBlXCI6XCJnOkRvdWJsZVwiLFwiQHZhbHVlXCI6MC40fX19XSxcImtub3dzXCI6W3tcImlkXCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjd9LFwiaW5WXCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjJ9LFwicHJvcGVydGllc1wiOntcIndlaWdodFwiOntcIkB0eXBlXCI6XCJnOkRvdWJsZVwiLFwiQHZhbHVlXCI6MC41fX19LHtcImlkXCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjh9LFwiaW5WXCI6e1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjR9LFwicHJvcGVydGllc1wiOntcIndlaWdodFwiOntcIkB0eXBlXCI6XCJnOkRvdWJsZVwiLFwiQHZhbHVlXCI6MS4wfX19XX0sXCJwcm9wZXJ0aWVzXCI6e1wibmFtZVwiOlt7XCJpZFwiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjowfSxcInZhbHVlXCI6XCJtYXJrb1wifV0sXCJhZ2VcIjpbe1wiaWRcIjp7XCJAdHlwZVwiOlwiZzpJbnQ2NFwiLFwiQHZhbHVlXCI6MX0sXCJ2YWx1ZVwiOntcIkB0eXBlXCI6XCJnOkludDMyXCIsXCJAdmFsdWVcIjoyOX19XX19fSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIHJlYWRWZXJ0ZXggPSByZWFkZXIuVG9PYmplY3QoSk9iamVjdC5QYXJzZShncmFwaFNvbikpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU29uKTsKKyAgICAgICAgICAgIFZlcnRleCByZWFkVmVydGV4ID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwobmV3IFZlcnRleCgxKSwgcmVhZFZlcnRleCk7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoInBlcnNvbiIsIHJlYWRWZXJ0ZXguTGFiZWwpOwogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKHR5cGVvZihpbnQpLCByZWFkVmVydGV4LklkLkdldFR5cGUoKSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnNTdXBwb3J0aW5nQ29sbGVjdGlvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVFbXB0eUdMaXN0KGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZ3JhcGhTb24gPQotICAgICAgICAgICAgICAgICJ7XCJAdHlwZVwiOlwiZzpMaXN0XCIsIFwiQHZhbHVlXCI6IFtdfSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6TGlzdFwiLCBcIkB2YWx1ZVwiOiBbXX0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChKT2JqZWN0LlBhcnNlKGdyYXBoU29uKSk7CisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU29uKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgICAgICAKICAgICAgICAgICAgIEFzc2VydC5FcXVhbChuZXcgb2JqZWN0WzBdLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnNTdXBwb3J0aW5nQ29sbGVjdGlvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVHTGlzdChpbnQgdmVyc2lvbikKICAgICAgICAgewogICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGpzb24gPSAie1wiQHR5cGVcIjpcImc6TGlzdFwiLCBcIkB2YWx1ZVwiOiBbe1wiQHR5cGVcIjogXCJnOkludDMyXCIsIFwiQHZhbHVlXCI6IDF9LCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjogXCJnOkludDMyXCIsIFwiQHZhbHVlXCI6IDJ9LCB7XCJAdHlwZVwiOiBcImc6SW50MzJcIiwgXCJAdmFsdWVcIjogM31dfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KEpPYmplY3QuUGFyc2UoanNvbikpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGpzb24pOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoKElMaXN0PG9iamVjdD4pbmV3IG9iamVjdFtdIHsgMSwgMiwgM30sIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9uc1N1cHBvcnRpbmdDb2xsZWN0aW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUdTZXQoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IHN0cmluZyBqc29uID0gIntcIkB0eXBlXCI6XCJnOlNldFwiLCBcIkB2YWx1ZVwiOiBbe1wiQHR5cGVcIjogXCJnOkludDMyXCIsIFwiQHZhbHVlXCI6IDF9LCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjogXCJnOkludDMyXCIsIFwiQHZhbHVlXCI6IDJ9LCB7XCJAdHlwZVwiOiBcImc6SW50MzJcIiwgXCJAdmFsdWVcIjogM31dfSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImc6U2V0XCIsIFwiQHZhbHVlXCI6IFt7XCJAdHlwZVwiOiBcImc6SW50MzJcIiwgXCJAdmFsdWVcIjogMX0sIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjogXCJnOkludDMyXCIsIFwiQHZhbHVlXCI6IDJ9LCB7XCJAdHlwZVwiOiBcImc6SW50MzJcIiwgXCJAdmFsdWVcIjogM31dfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KEpPYmplY3QuUGFyc2UoanNvbikpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU29uKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKChJU2V0PG9iamVjdD4pbmV3IEhhc2hTZXQ8b2JqZWN0PnsgMSwgMiwgM30sIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9uc1N1cHBvcnRpbmdDb2xsZWN0aW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUdNYXAoaW50IHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IHN0cmluZyBqc29uID0gIntcIkB0eXBlXCI6XCJnOk1hcFwiLCBcIkB2YWx1ZVwiOiBbXCJhXCIse1wiQHR5cGVcIjogXCJnOkludDMyXCIsIFwiQHZhbHVlXCI6IDF9LCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiYlwiLCB7XCJAdHlwZVwiOiBcImc6SW50MzJcIiwgXCJAdmFsdWVcIjogMn1dfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KEpPYmplY3QuUGFyc2UoanNvbikpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGpzb24pOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwobmV3IERpY3Rpb25hcnk8b2JqZWN0LCBvYmplY3Q+eyB7ICJhIiwgMSB9LCB7ICJiIiwgMiB9fSwgZGVzZXJpYWxpemVkVmFsdWUpOwogICAgICAgICB9Ci0KKyAgICAgICAgCisgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zU3VwcG9ydGluZ0NvbGxlY3Rpb25zKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplR01hcFdpdGhOb25TdHJpbmdLZXlzKGludCB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcganNvbiA9ICJ7XCJAdHlwZVwiOlwiZzpNYXBcIiwgXCJAdmFsdWVcIjogW3tcIkB0eXBlXCI6XCJnOkludDMyXCIsIFwiQHZhbHVlXCI6MTIzfSwgXCJyZWRcIl19IjsKKyAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOworICAgICAgICAKKyAgICAgICAgICAgIHZhciBqc29uRWxlbWVudCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPEpzb25FbGVtZW50Pihqc29uKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKG5ldyBEaWN0aW9uYXJ5PG9iamVjdCwgb2JqZWN0PnsgeyAxMjMsICJyZWQiIH19LCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zU3VwcG9ydGluZ0NvbGxlY3Rpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplQnVsa1NldChpbnQgdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGpzb24gPSAie1wiQHR5cGVcIjogXCJnOkJ1bGtTZXRcIiwgXCJAdmFsdWVcIjogWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJtYXJrb1wiLCB7XCJAdHlwZVwiOiBcImc6SW50NjRcIiwgXCJAdmFsdWVcIjogMX0sICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJqb3NoXCIsIHtcIkB0eXBlXCI6IFwiZzpJbnQ2NFwiLCBcIkB2YWx1ZVwiOiAzfV19IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOiBcImc6QnVsa1NldFwiLCBcIkB2YWx1ZVwiOiBbIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJtYXJrb1wiLCB7XCJAdHlwZVwiOiBcImc6SW50NjRcIiwgXCJAdmFsdWVcIjogMX0sICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiam9zaFwiLCB7XCJAdHlwZVwiOiBcImc6SW50NjRcIiwgXCJAdmFsdWVcIjogM31dfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KEpPYmplY3QuUGFyc2UoanNvbikpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU29uKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKG5ldyBMaXN0PG9iamVjdD57ICJtYXJrbyIsICJqb3NoIiwgImpvc2giLCAiam9zaCIgfSwgZGVzZXJpYWxpemVkVmFsdWUpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtGYWN0XQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUJ1bGtTZXRXaXRoR3JhcGhTT04zKCkKICAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGpzb24gPQorICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGdyYXBoU29uID0KICAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjpcImc6TGlzdFwiLFwiQHZhbHVlXCI6W3tcIkB0eXBlXCI6XCJnOlRyYXZlcnNlclwiLFwiQHZhbHVlXCI6e1wiYnVsa1wiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjoxfSxcInZhbHVlXCI6e1wiQHR5cGVcIjpcImc6QnVsa1NldFwiLFwiQHZhbHVlXCI6W3tcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjoxfSx7XCJAdHlwZVwiOlwiZzpJbnQ2NFwiLFwiQHZhbHVlXCI6Mn0se1wiQHR5cGVcIjpcImc6SW50NjRcIixcIkB2YWx1ZVwiOjB9LHtcIkB0eXBlXCI6XCJnOkludDY0XCIsXCJAdmFsdWVcIjozfSx7XCJAdHlwZVwiOlwiZzpJbnQ2NFwiLFwiQHZhbHVlXCI6Mn0se1wiQHR5cGVcIjpcImc6SW50NjRcIixcIkB2YWx1ZVwiOjF9LHtcIkB0eXBlXCI6XCJnOkRvdWJsZVwiLFwiQHZhbHVlXCI6MS4wfSx7XCJAdHlwZVwiOlwiZzpJbnQ2NFwiLFwiQHZhbHVlXCI6Mn1dfX19XX0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIoMyk7Ci0gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoSk9iamVjdC5QYXJzZShqc29uKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBqc29uRWxlbWVudCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPEpzb25FbGVtZW50PihncmFwaFNvbik7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOwogICAgICAgICB9Ci0KLSAgICAgICAgW0ZhY3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplVHJhdmVyc2VyKCkKKyAgICAgICAgCisgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zU3VwcG9ydGluZ0NvbGxlY3Rpb25zKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplVHJhdmVyc2VyKGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICBkeW5hbWljIGQgPSBKT2JqZWN0LlBhcnNlKCJ7XCJAdHlwZVwiOlwiZzpUcmF2ZXJzZXJcIixcIkB2YWx1ZVwiOjEsXCJidWxrXCI6IHtcInR5cGVcIjpcImc6SW50NjRcIixcInZhbHVlXCI6MTB9fSIpOwotCi0gICAgICAgICAgICBBc3NlcnQuTm90TnVsbChkKTsKLSAgICAgICAgICAgIEFzc2VydC5FcXVhbCgiZzpUcmF2ZXJzZXIiLCAoc3RyaW5nKWRbIkB0eXBlIl0pOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGpzb24gPSAie1wiQHR5cGVcIjpcImc6VHJhdmVyc2VyXCIsIFwiQHZhbHVlXCI6e1wiYnVsa1wiOntcIkB0eXBlXCI6XCJnOkludDY0XCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJAdmFsdWVcIjoxMH0sIFwidmFsdWVcIjp7XCJAdHlwZVwiOlwiZzpJbnQzMlwiLCBcIkB2YWx1ZVwiOjF9fX0iOworICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7CisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGpzb24pOworICAgICAgICAgICAgVHJhdmVyc2VyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEwLCBkZXNlcmlhbGl6ZWRWYWx1ZS5CdWxrKTsKKyAgICAgICAgICAgIEFzc2VydC5FcXVhbCgxLCBkZXNlcmlhbGl6ZWRWYWx1ZS5PYmplY3QpOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIFtUaGVvcnksIE1lbWJlckRhdGEobmFtZW9mKFZlcnNpb25zKSldCiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZERlc2VyaWFsaXplRHVyYXRpb25Ub1RpbWVTcGFuKGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJneDpEdXJhdGlvblwiLFwiQHZhbHVlXCI6XCJQVDEyMEhcIn0iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGdyYXBoU29uID0gIntcIkB0eXBlXCI6XCJneDpEdXJhdGlvblwiLFwiQHZhbHVlXCI6XCJQVDEyMEhcIn0iOwogICAgICAgICAgICAgdmFyIHJlYWRlciA9IENyZWF0ZVN0YW5kYXJkR3JhcGhTT05SZWFkZXIodmVyc2lvbik7Ci0KLSAgICAgICAgICAgIHZhciBqT2JqZWN0ID0gSk9iamVjdC5QYXJzZShzZXJpYWxpemVkVmFsdWUpOwotICAgICAgICAgICAgVGltZVNwYW4gZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoVGltZVNwYW4uRnJvbURheXMoNSksIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUJpZ0ludGVnZXIoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImd4OkJpZ0ludGVnZXJcIixcIkB2YWx1ZVwiOjEyMzQ1Njc4OX0iOworICAgICAgICAgICAgdmFyIGdyYXBoU29uID0gIntcIkB0eXBlXCI6XCJneDpCaWdJbnRlZ2VyXCIsXCJAdmFsdWVcIjoxMjM0NTY3ODl9IjsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwotCi0gICAgICAgICAgICB2YXIgak9iamVjdCA9IEpPYmplY3QuUGFyc2Uoc2VyaWFsaXplZFZhbHVlKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoQmlnSW50ZWdlci5QYXJzZSgiMTIzNDU2Nzg5IiksIGRlc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUJpZ0ludGVnZXJWYWx1ZUFzU3RyaW5nKGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJneDpCaWdJbnRlZ2VyXCIsXCJAdmFsdWVcIjpcIjEyMzQ1Njc4OVwifSI7CisgICAgICAgICAgICB2YXIgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImd4OkJpZ0ludGVnZXJcIiwgXCJAdmFsdWVcIjpcIjEyMzQ1Njc4OVwifSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU29uKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKEJpZ0ludGVnZXIuUGFyc2UoIjEyMzQ1Njc4OSIpLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgW1RoZW9yeSwgTWVtYmVyRGF0YShuYW1lb2YoVmVyc2lvbnMpKV0KICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGVzZXJpYWxpemVSZWFsbHlCaWdJbnRlZ2VyVmFsdWUoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImd4OkJpZ0ludGVnZXJcIixcIkB2YWx1ZVwiOjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMX0iOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGdyYXBoU29uID0gIntcIkB0eXBlXCI6XCJneDpCaWdJbnRlZ2VyXCIsIFwiQHZhbHVlXCI6MTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpPYmplY3QpOwotCisgICAgICAgIAorICAgICAgICAgICAgdmFyIGpzb25FbGVtZW50ID0gSnNvblNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8SnNvbkVsZW1lbnQ+KGdyYXBoU29uKTsKKyAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqc29uRWxlbWVudCk7CisgICAgICAgIAogICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKEJpZ0ludGVnZXIuUGFyc2UoIjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMSIpLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQotICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUJ5dGUoaW50IHZlcnNpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImd4OkJ5dGVcIixcIkB2YWx1ZVwiOjF9IjsKLSAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwotCi0gICAgICAgICAgICB2YXIgak9iamVjdCA9IEpPYmplY3QuUGFyc2Uoc2VyaWFsaXplZFZhbHVlKTsKLSAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqT2JqZWN0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkVxdWFsKDEsIGRlc2VyaWFsaXplZFZhbHVlKTsKLSAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUJ5dGVCdWZmZXIoaW50IHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImd4OkJ5dGVCdWZmZXJcIixcIkB2YWx1ZVwiOlwiYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxXCJ9IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBncmFwaFNvbiA9ICJ7XCJAdHlwZVwiOlwiZ3g6Qnl0ZUJ1ZmZlclwiLCBcIkB2YWx1ZVwiOlwiYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxXCJ9IjsKICAgICAgICAgICAgIHZhciByZWFkZXIgPSBDcmVhdGVTdGFuZGFyZEdyYXBoU09OUmVhZGVyKHZlcnNpb24pOwotCi0gICAgICAgICAgICB2YXIgak9iamVjdCA9IEpPYmplY3QuUGFyc2Uoc2VyaWFsaXplZFZhbHVlKTsKLSAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHJlYWRlci5Ub09iamVjdChqT2JqZWN0KTsKLQorICAgICAgICAKKyAgICAgICAgICAgIHZhciBqc29uRWxlbWVudCA9IEpzb25TZXJpYWxpemVyLkRlc2VyaWFsaXplPEpzb25FbGVtZW50PihncmFwaFNvbik7CisgICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3QoanNvbkVsZW1lbnQpOworICAgICAgICAKICAgICAgICAgICAgIEFzc2VydC5FcXVhbChDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoImMyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSIpLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KLQotICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUNoYXIoaW50IHZlcnNpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZXJpYWxpemVkVmFsdWUgPSAie1wiQHR5cGVcIjpcImd4OkNoYXJcIixcIkB2YWx1ZVwiOlwieFwifSI7Ci0gICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5FcXVhbCgneCcsIGRlc2VyaWFsaXplZFZhbHVlKTsKLSAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBbVGhlb3J5LCBNZW1iZXJEYXRhKG5hbWVvZihWZXJzaW9ucykpXQogICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREZXNlcmlhbGl6ZUludDE2KGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VyaWFsaXplZFZhbHVlID0gIntcIkB0eXBlXCI6XCJneDpJbnQxNlwiLFwiQHZhbHVlXCI6MTAwfSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZ3JhcGhTb24gPSAie1wiQHR5cGVcIjpcImd4OkludDE2XCIsIFwiQHZhbHVlXCI6MTAwfSI7CiAgICAgICAgICAgICB2YXIgcmVhZGVyID0gQ3JlYXRlU3RhbmRhcmRHcmFwaFNPTlJlYWRlcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgdmFyIGpPYmplY3QgPSBKT2JqZWN0LlBhcnNlKHNlcmlhbGl6ZWRWYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkVmFsdWUgPSByZWFkZXIuVG9PYmplY3Qoak9iamVjdCk7Ci0KKyAgICAgICAgCisgICAgICAgICAgICB2YXIganNvbkVsZW1lbnQgPSBKc29uU2VyaWFsaXplci5EZXNlcmlhbGl6ZTxKc29uRWxlbWVudD4oZ3JhcGhTb24pOworICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZFZhbHVlID0gcmVhZGVyLlRvT2JqZWN0KGpzb25FbGVtZW50KTsKKyAgICAgICAgCiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoMTAwLCBkZXNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpbnRlcm5hbCBjbGFzcyBUZXN0R3JhcGhTT05EZXNlcmlhbGl6ZXIgOiBJR3JhcGhTT05EZXNlcmlhbGl6ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBkeW5hbWljIE9iamVjdGlmeShKVG9rZW4gZ3JhcGhzb25PYmplY3QsIEdyYXBoU09OUmVhZGVyIHJlYWRlcikKKyAgICAgICAgcHVibGljIGR5bmFtaWMgT2JqZWN0aWZ5KEpzb25FbGVtZW50IGdyYXBoc29uT2JqZWN0LCBHcmFwaFNPTlJlYWRlciByZWFkZXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdENsYXNzIHtWYWx1ZSA9IGdyYXBoc29uT2JqZWN0LlRvU3RyaW5nKCl9OworICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0Q2xhc3Mge1ZhbHVlID0gZ3JhcGhzb25PYmplY3QuR2V0U3RyaW5nKCl9OwogICAgICAgICB9CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvU3RydWN0dXJlL0lPL0dyYXBoU09OL0dyYXBoU09OV3JpdGVyVGVzdHMuY3MgYi9ncmVtbGluLWRvdG5ldC90ZXN0L0dyZW1saW4uTmV0LlVuaXRUZXN0L1N0cnVjdHVyZS9JTy9HcmFwaFNPTi9HcmFwaFNPTldyaXRlclRlc3RzLmNzCmluZGV4IDQwOTc3NmIuLmNlNTkzZjcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZG90bmV0L3Rlc3QvR3JlbWxpbi5OZXQuVW5pdFRlc3QvU3RydWN0dXJlL0lPL0dyYXBoU09OL0dyYXBoU09OV3JpdGVyVGVzdHMuY3MKKysrIGIvZ3JlbWxpbi1kb3RuZXQvdGVzdC9HcmVtbGluLk5ldC5Vbml0VGVzdC9TdHJ1Y3R1cmUvSU8vR3JhcGhTT04vR3JhcGhTT05Xcml0ZXJUZXN0cy5jcwpAQCAtMjAzLDYgKzIwMyw4IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFNlcmlhbGl6ZVdpdGhDdXN0b21TZXJpYWxpemVyRm9yQ29tbW9uVHlwZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZhciBjdXN0b21TZXJpYWxpemVyTW9jayA9IG5ldyBNb2NrPElHcmFwaFNPTlNlcmlhbGl6ZXI+KCk7CisgICAgICAgICAgICBjdXN0b21TZXJpYWxpemVyTW9jay5TZXR1cChtID0+IG0uRGljdGlmeShJdC5Jc0FueTxpbnQ+KCksIEl0LklzQW55PEdyYXBoU09OV3JpdGVyPigpKSkKKyAgICAgICAgICAgICAgICAuUmV0dXJucyhuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGR5bmFtaWM+KCkpOwogICAgICAgICAgICAgdmFyIGN1c3RvbVNlcmlhbGl6ZXJCeVR5cGUgPSBuZXcgRGljdGlvbmFyeTxUeXBlLCBJR3JhcGhTT05TZXJpYWxpemVyPgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHt0eXBlb2YoaW50KSwgY3VzdG9tU2VyaWFsaXplck1vY2suT2JqZWN0fQpAQCAtMjgyLDEyICsyODQsMTIgQEAKICAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2VyaWFsaXplR0xpc3QoaW50IHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIHZhciB3cml0ZXIgPSBDcmVhdGVHcmFwaFNPTldyaXRlcih2ZXJzaW9uKTsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IExpc3Q8b2JqZWN0PiB7NSwgNn07CisgICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PG9iamVjdD4gezUsIDYsIG51bGx9OwogCiAgICAgICAgICAgICB2YXIgc2VyaWFsaXplZEdyYXBoU09OID0gd3JpdGVyLldyaXRlT2JqZWN0KGxpc3QpOwogCiAgICAgICAgICAgICB2YXIgZXhwZWN0ZWRHcmFwaFNPTiA9ICJ7XCJAdHlwZVwiOlwiZzpMaXN0XCIsXCJAdmFsdWVcIjpbe1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjV9LCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjZ9XX0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1wiQHR5cGVcIjpcImc6SW50MzJcIixcIkB2YWx1ZVwiOjZ9LG51bGxdfSI7CiAgICAgICAgICAgICBBc3NlcnQuRXF1YWwoZXhwZWN0ZWRHcmFwaFNPTiwgc2VyaWFsaXplZEdyYXBoU09OKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRvdG5ldC90ZXN0L3BvbS54bWwgYi9ncmVtbGluLWRvdG5ldC90ZXN0L3BvbS54bWwKaW5kZXggNjdkYjY3Ni4uZTM1NjVmZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kb3RuZXQvdGVzdC9wb20ueG1sCisrKyBiL2dyZW1saW4tZG90bmV0L3Rlc3QvcG9tLnhtbApAQCAtMjEsNyArMjEsNyBAQAogICAgIDxwYXJlbnQ+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLWRvdG5ldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tZG90bmV0LXRlc3RzPC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogR3JlbWxpbi5OZXQgLSBUZXN0czwvbmFtZT4KQEAgLTEwMywyMSArMTAzLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nbWF2ZW5wbHVzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE3PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1zZXJ2ZXI8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLXRlc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtsb2c0ai52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdyb292eTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtncm9vdnkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CkBAIC0xMzQsMTAgKzE0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke3NraXBUZXN0c308L3ZhbHVlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5weXRob248L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5mYWxzZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmdyZW1saW5TZXJ2ZXJEaXI8L25hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke2dyZW1saW4uc2VydmVyLmRpcn08L3ZhbHVlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9wb20ueG1sIGIvZ3JlbWxpbi1kcml2ZXIvcG9tLnhtbAppbmRleCBiZDk5N2E2Li5jNjNmN2VkIDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9wb20ueG1sCisrKyBiL2dyZW1saW4tZHJpdmVyL3BvbS54bWwKQEAgLTIxLDcgKzIxLDcgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VycG9wPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1kcml2ZXI8L2FydGlmYWN0SWQ+CiAgICAgPG5hbWU+QXBhY2hlIFRpbmtlclBvcCA6OiBHcmVtbGluIERyaXZlcjwvbmFtZT4KQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0PC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPC9kZXBlbmRlbmNpZXM+CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NoYW5uZWxpemVyLmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NoYW5uZWxpemVyLmphdmEKaW5kZXggYzczOWExNS4uNjlhMDcyNSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9DaGFubmVsaXplci5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ2hhbm5lbGl6ZXIuamF2YQpAQCAtMjMsOCArMjMsNiBAQAogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC53ZWJzb2NrZXR4LkNsb3NlV2ViU29ja2V0RnJhbWU7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLndlYnNvY2tldHguUGluZ1dlYlNvY2tldEZyYW1lOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLmV4Y2VwdGlvbi5Db25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLmhhbmRsZXIuTmlvR3JlbWxpblJlcXVlc3RFbmNvZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLmhhbmRsZXIuTmlvR3JlbWxpblJlc3BvbnNlRGVjb2RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5oYW5kbGVyLldlYlNvY2tldENsaWVudEhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuaGFuZGxlci5XZWJTb2NrZXRHcmVtbGluUmVxdWVzdEVuY29kZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuaGFuZGxlci5XZWJTb2NrZXRHcmVtbGluUmVzcG9uc2VEZWNvZGVyOwpAQCAtMjMxLDIzICsyMjksNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogTklPIHtAbGluayBDaGFubmVsaXplcn0gaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy4xMCwgbm90IHJlcGxhY2VkLCB1c2Uge0BsaW5rIFdlYlNvY2tldENsaWVudH0uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgZmluYWwgY2xhc3MgTmlvQ2hhbm5lbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdENoYW5uZWxpemVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBzdXBlci5pbml0KGNvbm5lY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDaGFubmVsUGlwZWxpbmUgcGlwZWxpbmUpIHsKLSAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoImdyZW1saW4tZGVjb2RlciIsIG5ldyBOaW9HcmVtbGluUmVzcG9uc2VEZWNvZGVyKGNsdXN0ZXIuZ2V0U2VyaWFsaXplcigpKSk7Ci0gICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJncmVtbGluLWVuY29kZXIiLCBuZXcgTmlvR3JlbWxpblJlcXVlc3RFbmNvZGVyKHRydWUsIGNsdXN0ZXIuZ2V0U2VyaWFsaXplcigpKSk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NsaWVudC5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9DbGllbnQuamF2YQppbmRleCA5Y2JjMzM3Li41MWI4ZWQ2IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NsaWVudC5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ2xpZW50LmphdmEKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgICAgICAgICAgIC5hZGQoVG9rZW5zLkFSR1NfQkFUQ0hfU0laRSwgYmF0Y2hTaXplKTsKIAogICAgICAgICAvLyBhcHBseSBzZXR0aW5ncyBpZiB0aGV5IHdlcmUgbWFkZSBhdmFpbGFibGUKLSAgICAgICAgb3B0aW9ucy5nZXRUaW1lb3V0KCkuaWZQcmVzZW50KHRpbWVvdXQgLT4gcmVxdWVzdC5hZGQoVG9rZW5zLkFSR1NfU0NSSVBUX0VWQUxfVElNRU9VVCwgdGltZW91dCkpOworICAgICAgICBvcHRpb25zLmdldFRpbWVvdXQoKS5pZlByZXNlbnQodGltZW91dCAtPiByZXF1ZXN0LmFkZChUb2tlbnMuQVJHU19FVkFMX1RJTUVPVVQsIHRpbWVvdXQpKTsKICAgICAgICAgb3B0aW9ucy5nZXRQYXJhbWV0ZXJzKCkuaWZQcmVzZW50KHBhcmFtcyAtPiByZXF1ZXN0LmFkZEFyZyhUb2tlbnMuQVJHU19CSU5ESU5HUywgcGFyYW1zKSk7CiAgICAgICAgIG9wdGlvbnMuZ2V0QWxpYXNlcygpLmlmUHJlc2VudChhbGlhc2VzIC0+IHJlcXVlc3QuYWRkQXJnKFRva2Vucy5BUkdTX0FMSUFTRVMsIGFsaWFzZXMpKTsKICAgICAgICAgb3B0aW9ucy5nZXRPdmVycmlkZVJlcXVlc3RJZCgpLmlmUHJlc2VudChyZXF1ZXN0OjpvdmVycmlkZVJlcXVlc3RJZCk7CkBAIC01NjQsNyArNTY0LDcgQEAKIAogICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNldHRpbmdzIGlmIHRoZXkgd2VyZSBtYWRlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0QmF0Y2hTaXplKCkuaWZQcmVzZW50KGJhdGNoU2l6ZSAtPiByZXF1ZXN0LmFkZChUb2tlbnMuQVJHU19CQVRDSF9TSVpFLCBiYXRjaFNpemUpKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLmdldFRpbWVvdXQoKS5pZlByZXNlbnQodGltZW91dCAtPiByZXF1ZXN0LmFkZChUb2tlbnMuQVJHU19TQ1JJUFRfRVZBTF9USU1FT1VULCB0aW1lb3V0KSk7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXRUaW1lb3V0KCkuaWZQcmVzZW50KHRpbWVvdXQgLT4gcmVxdWVzdC5hZGQoVG9rZW5zLkFSR1NfRVZBTF9USU1FT1VULCB0aW1lb3V0KSk7CiAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXRPdmVycmlkZVJlcXVlc3RJZCgpLmlmUHJlc2VudChyZXF1ZXN0OjpvdmVycmlkZVJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXRVc2VyQWdlbnQoKS5pZlByZXNlbnQodXNlckFnZW50IC0+IHJlcXVlc3QuYWRkKFRva2Vucy5BUkdTX1VTRVJfQUdFTlQsIHVzZXJBZ2VudCkpOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NsdXN0ZXIuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ2x1c3Rlci5qYXZhCmluZGV4IDhhZjcyN2QuLjQ0OTM3YzYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ2x1c3Rlci5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ2x1c3Rlci5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dEJ1aWxkZXI7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsUHJvdmlkZXI7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wudXRpbC5JbnNlY3VyZVRydXN0TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlcXVlc3RNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5TZXJpYWxpemVyczsKIGltcG9ydCBpby5uZXR0eS5ib290c3RyYXAuQm9vdHN0cmFwOwpAQCAtMTgxLDExICsxODEsNyBAQAogICAgICAgICAgICAgICAgIC5wb3J0KHNldHRpbmdzLnBvcnQpCiAgICAgICAgICAgICAgICAgLnBhdGgoc2V0dGluZ3MucGF0aCkKICAgICAgICAgICAgICAgICAuZW5hYmxlU3NsKHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLmVuYWJsZVNzbCkKLSAgICAgICAgICAgICAgICAudHJ1c3RDZXJ0aWZpY2F0ZUNoYWluRmlsZShzZXR0aW5ncy5jb25uZWN0aW9uUG9vbC50cnVzdENlcnRDaGFpbkZpbGUpCiAgICAgICAgICAgICAgICAgLmtlZXBBbGl2ZUludGVydmFsKHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLmtlZXBBbGl2ZUludGVydmFsKQotICAgICAgICAgICAgICAgIC5rZXlDZXJ0Q2hhaW5GaWxlKHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLmtleUNlcnRDaGFpbkZpbGUpCi0gICAgICAgICAgICAgICAgLmtleUZpbGUoc2V0dGluZ3MuY29ubmVjdGlvblBvb2wua2V5RmlsZSkKLSAgICAgICAgICAgICAgICAua2V5UGFzc3dvcmQoc2V0dGluZ3MuY29ubmVjdGlvblBvb2wua2V5UGFzc3dvcmQpCiAgICAgICAgICAgICAgICAgLmtleVN0b3JlKHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLmtleVN0b3JlKQogICAgICAgICAgICAgICAgIC5rZXlTdG9yZVBhc3N3b3JkKHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLmtleVN0b3JlUGFzc3dvcmQpCiAgICAgICAgICAgICAgICAgLmtleVN0b3JlVHlwZShzZXR0aW5ncy5jb25uZWN0aW9uUG9vbC5rZXlTdG9yZVR5cGUpCkBAIC0zOTgsMTYgKzM5NCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBob3cgbG9uZyBhIHNlc3Npb24gd2lsbCBzdGF5IG9wZW4gYXNzdW1pbmcgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBhY3R1YWxseSBpcyBjb25maWd1cmVkIGZvciB0aGVpciB1c2UuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy4xMSwgcmVwbGFjZWQgaW4gZXNzZW5jZSBieSB7QGxpbmsgI2dldE1heFdhaXRGb3JDbG9zZSgpfS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBpbnQgZ2V0TWF4V2FpdEZvclNlc3Npb25DbG9zZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hbmFnZXIuY29ubmVjdGlvblBvb2xTZXR0aW5ncy5tYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldHMgaG93IGxvbmcgYSBjb25uZWN0aW9uIHdpbGwgd2FpdCBmb3IgYWxsIHBlbmRpbmcgbWVzc2FnZXMgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIGJlZm9yZSBjbG9zaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4V2FpdEZvckNsb3NlKCkgewpAQCAtNTAxLDIxICs0ODcsNiBAQAogICAgICAgICBmaW5hbCBTZXR0aW5ncy5Db25uZWN0aW9uUG9vbFNldHRpbmdzIGNvbm5lY3Rpb25Qb29sU2V0dGluZ3MgPSBjb25uZWN0aW9uUG9vbFNldHRpbmdzKCk7CiAgICAgICAgIGZpbmFsIFNzbENvbnRleHRCdWlsZGVyIGJ1aWxkZXIgPSBTc2xDb250ZXh0QnVpbGRlci5mb3JDbGllbnQoKTsKIAotICAgICAgICBpZiAoY29ubmVjdGlvblBvb2xTZXR0aW5ncy50cnVzdENlcnRDaGFpbkZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVzaW5nIGRlcHJlY2F0ZWQgU1NMIHRydXN0Q2VydENoYWluRmlsZSBzdXBwb3J0Iik7Ci0gICAgICAgICAgICBidWlsZGVyLnRydXN0TWFuYWdlcihuZXcgRmlsZShjb25uZWN0aW9uUG9vbFNldHRpbmdzLnRydXN0Q2VydENoYWluRmlsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gY29ubmVjdGlvblBvb2xTZXR0aW5ncy5rZXlDZXJ0Q2hhaW5GaWxlICYmIG51bGwgIT0gY29ubmVjdGlvblBvb2xTZXR0aW5ncy5rZXlGaWxlKSB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiVXNpbmcgZGVwcmVjYXRlZCBTU0wga2V5RmlsZSBzdXBwb3J0Iik7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIGtleUNlcnRDaGFpbkZpbGUgPSBuZXcgRmlsZShjb25uZWN0aW9uUG9vbFNldHRpbmdzLmtleUNlcnRDaGFpbkZpbGUpOwotICAgICAgICAgICAgZmluYWwgRmlsZSBrZXlGaWxlID0gbmV3IEZpbGUoY29ubmVjdGlvblBvb2xTZXR0aW5ncy5rZXlGaWxlKTsKLQotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IGtleVBhc3N3b3JkIG1heSBiZSBudWxsIGhlcmUgaWYgdGhlIGtleUZpbGUgaXMgbm90Ci0gICAgICAgICAgICAvLyBwYXNzd29yZC1wcm90ZWN0ZWQuCi0gICAgICAgICAgICBidWlsZGVyLmtleU1hbmFnZXIoa2V5Q2VydENoYWluRmlsZSwga2V5RmlsZSwgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5rZXlQYXNzd29yZCk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBCdWlsZCBKU1NFIFNTTENvbnRleHQKICAgICAgICAgdHJ5IHsKIApAQCAtNTg2LDcgKzU1Nyw2IEBACiAgICAgICAgIHByaXZhdGUgaW50IG1heEluUHJvY2Vzc1BlckNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLk1BWF9JTl9QUk9DRVNTOwogICAgICAgICBwcml2YXRlIGludCBtaW5JblByb2Nlc3NQZXJDb25uZWN0aW9uID0gQ29ubmVjdGlvbi5NSU5fSU5fUFJPQ0VTUzsKICAgICAgICAgcHJpdmF0ZSBpbnQgbWF4V2FpdEZvckNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLk1BWF9XQUlUX0ZPUl9DT05ORUNUSU9OOwotICAgICAgICBwcml2YXRlIGludCBtYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlID0gQ29ubmVjdGlvbi5NQVhfV0FJVF9GT1JfU0VTU0lPTl9DTE9TRTsKICAgICAgICAgcHJpdmF0ZSBpbnQgbWF4V2FpdEZvckNsb3NlID0gQ29ubmVjdGlvbi5NQVhfV0FJVF9GT1JfQ0xPU0U7CiAgICAgICAgIHByaXZhdGUgaW50IG1heENvbnRlbnRMZW5ndGggPSBDb25uZWN0aW9uLk1BWF9DT05URU5UX0xFTkdUSDsKICAgICAgICAgcHJpdmF0ZSBpbnQgcmVjb25uZWN0SW50ZXJ2YWwgPSBDb25uZWN0aW9uLlJFQ09OTkVDVF9JTlRFUlZBTDsKQEAgLTU5NCwxMCArNTY0LDYgQEAKICAgICAgICAgcHJpdmF0ZSBsb25nIGtlZXBBbGl2ZUludGVydmFsID0gQ29ubmVjdGlvbi5LRUVQX0FMSVZFX0lOVEVSVkFMOwogICAgICAgICBwcml2YXRlIFN0cmluZyBjaGFubmVsaXplciA9IENoYW5uZWxpemVyLldlYlNvY2tldENoYW5uZWxpemVyLmNsYXNzLmdldE5hbWUoKTsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZVNzbCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIFN0cmluZyB0cnVzdENlcnRDaGFpbkZpbGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIFN0cmluZyBrZXlDZXJ0Q2hhaW5GaWxlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcga2V5RmlsZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGtleVBhc3N3b3JkID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcga2V5U3RvcmUgPSBudWxsOwogICAgICAgICBwcml2YXRlIFN0cmluZyBrZXlTdG9yZVBhc3N3b3JkID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdHJ1c3RTdG9yZSA9IG51bGw7CkBAIC02OTMsMTcgKzY1OSw2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogRmlsZSBsb2NhdGlvbiBmb3IgYSBTU0wgQ2VydGlmaWNhdGUgQ2hhaW4gdG8gdXNlIHdoZW4gU1NMIGlzIGVuYWJsZWQuIElmIHRoaXMgdmFsdWUgaXMgbm90IHByb3ZpZGVkIGFuZAotICAgICAgICAgKiBTU0wgaXMgZW5hYmxlZCwgdGhlIGRlZmF1bHQge0BsaW5rIFRydXN0TWFuYWdlcn0gd2lsbCBiZSB1c2VkLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMi4xMCwgcmVwbGFjZWQgYnkge0BsaW5rICN0cnVzdFN0b3JlfQotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgdHJ1c3RDZXJ0aWZpY2F0ZUNoYWluRmlsZShmaW5hbCBTdHJpbmcgY2VydGlmaWNhdGVDaGFpbkZpbGUpIHsKLSAgICAgICAgICAgIHRoaXMudHJ1c3RDZXJ0Q2hhaW5GaWxlID0gY2VydGlmaWNhdGVDaGFpbkZpbGU7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgogICAgICAgICAgKiBMZW5ndGggb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBvbiBhbiBpZGxlIGNvbm5lY3Rpb24gYmVmb3JlIHNlbmRpbmcgYSBrZWVwLWFsaXZlIHJlcXVlc3QuIFRoaXMKICAgICAgICAgICogc2V0dGluZyBpcyBvbmx5IHJlbGV2YW50IHRvIHtAbGluayBDaGFubmVsaXplcn0gaW1wbGVtZW50YXRpb25zIHRoYXQgcmV0dXJuIHtAY29kZSB0cnVlfSBmb3IKICAgICAgICAgICoge0BsaW5rIENoYW5uZWxpemVyI3N1cHBvcnRzS2VlcEFsaXZlKCl9LiAgU2V0IHRvIHplcm8gdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCkBAIC03MTQsMzYgKzY2OSw2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFguNTA5IGNlcnRpZmljYXRlIGNoYWluIGZpbGUgaW4gUEVNIGZvcm1hdC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAja2V5U3RvcmV9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciBrZXlDZXJ0Q2hhaW5GaWxlKGZpbmFsIFN0cmluZyBrZXlDZXJ0Q2hhaW5GaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLmtleUNlcnRDaGFpbkZpbGUgPSBrZXlDZXJ0Q2hhaW5GaWxlOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFBLQ1MjOCBwcml2YXRlIGtleSBmaWxlIGluIFBFTSBmb3JtYXQuCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCByZXBsYWNlZCBieSB7QGxpbmsgI2tleVN0b3JlfQotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIEJ1aWxkZXIga2V5RmlsZShmaW5hbCBTdHJpbmcga2V5RmlsZSkgewotICAgICAgICAgICAgdGhpcy5rZXlGaWxlID0ga2V5RmlsZTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBwYXNzd29yZCBvZiB0aGUge0BsaW5rICNrZXlGaWxlfSwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0J3Mgbm90IHBhc3N3b3JkLXByb3RlY3RlZC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAja2V5U3RvcmVQYXNzd29yZH0KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGtleVBhc3N3b3JkKGZpbmFsIFN0cmluZyBrZXlQYXNzd29yZCkgewotICAgICAgICAgICAgdGhpcy5rZXlQYXNzd29yZCA9IGtleVBhc3N3b3JkOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKICAgICAgICAgICogVGhlIGZpbGUgbG9jYXRpb24gb2YgdGhlIHByaXZhdGUga2V5IGluIEpLUyBvciBQS0NTIzEyIGZvcm1hdC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGtleVN0b3JlKGZpbmFsIFN0cmluZyBrZXlTdG9yZSkgewpAQCAtOTAxLDI5ICs4MjYsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIElmIHRoZSBjb25uZWN0aW9uIGlzIHVzaW5nIGEgInNlc3Npb24iIHRoaXMgc2V0dGluZyByZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdAotICAgICAgICAgKiBmb3IgdGhhdCBzZXNzaW9uIHRvIGNsb3NlIGJlZm9yZSB0aW1pbmcgb3V0IHdoZXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDMwMDAuIE5vdGUgdGhhdCB0aGUgc2VydmVyIHdpbGwKLSAgICAgICAgICogZXZlbnR1YWxseSBjbGVhbiB1cCBkZWFkIHNlc3Npb25zIGl0c2VsZiBvbiBleHBpcmF0aW9uIG9mIHRoZSBzZXNzaW9uIG9yIGR1cmluZyBzaHV0ZG93bi4KLSAgICAgICAgICoKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuMTEsIHJlcGxhY2VkIGluIGVzc2VuY2UgYnkge0BsaW5rICNtYXhXYWl0Rm9yQ2xvc2UoaW50KX0gdGhvdWdoIGJlaGF2aW9yCi0gICAgICAgICAqIGRlc2NyaWJlZCBoZXJlIGlzIHN0aWxsIG1haW50YWluZWQuCi0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciBtYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlKGZpbmFsIGludCBtYXhXYWl0KSB7Ci0gICAgICAgICAgICB0aGlzLm1heFdhaXRGb3JTZXNzaW9uQ2xvc2UgPSBtYXhXYWl0OwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKICAgICAgICAgICogVGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IHRoZSBjb25uZWN0aW9uIHRvIGNsb3NlIGJlZm9yZSB0aW1pbmcgb3V0IHdoZXJlIHRoZSBkZWZhdWx0CiAgICAgICAgICAqIHZhbHVlIGlzIDMwMDAuIFRoaXMgdGltZW91dCBhbGxvd3MgZm9yIGEgZGVsYXkgdG8gb2NjdXIgaW4gd2FpdGluZyBmb3IgcmVtYWluaW5nIG1lc3NhZ2VzIHRoYXQgbWF5IHN0aWxsCiAgICAgICAgICAqIGJlIHJldHVybmluZyBmcm9tIHRoZSBzZXJ2ZXIgd2hpbGUgYSB7QGxpbmsgQ2xpZW50I2Nsb3NlKCl9IGlzIGNhbGxlZC4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIHNldHRpbmcgaXMgcmVsYXRlZCB0byB7QGxpbmsgI21heFdhaXRGb3JTZXNzaW9uQ2xvc2V9IHRvIHNvbWUgZGVncmVlLiBUaGlzIHNldHRpbmcgcmVmZXJzIHRvIGEgd2FpdAotICAgICAgICAgKiBmb3Igc3RhbmRhcmQgcmVxdWVzdHMgKGkuZS4gcXVlcmllcykgYnV0IHRoZSB7QGxpbmsgI21heFdhaXRGb3JTZXNzaW9uQ2xvc2V9IHJlZmVycyB0byBhIHdhaXQgZm9yIHRoZQotICAgICAgICAgKiAic2Vzc2lvbiBjbG9zZSIgbWVzc2FnZSB0aGF0IG9jY3VycyBhZnRlciBhbGwgc3RhbmRhcmQgcmVxdWVzdHMgaGF2ZSByZXR1cm5lZCAob3IgdGltZWQgb3V0KS4gVGhlcmUgaXMKLSAgICAgICAgICogZ2VuZXJhbGx5IG5vIG5lZWQgdG8gc2V0IHtAbGluayAjbWF4V2FpdEZvclNlc3Npb25DbG9zZX0gaWYgdGhlIHNlcnZlciBpcyBvbiAzLjMuMTEgb3IgbGF0ZXIgYXMgdGhlIGNsb3NlCi0gICAgICAgICAqIG9mIHRoZSBjb25uZWN0aW9uIHdpbGwgdHJpZ2dlciB0aGUgY2xvc2Ugb2YgdGhlIHNlc3Npb24gYW5kIHRoZSByZWxlYXNlIG9mIHJlc291cmNlcy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyIG1heFdhaXRGb3JDbG9zZShmaW5hbCBpbnQgbWF4V2FpdCkgewogICAgICAgICAgICAgdGhpcy5tYXhXYWl0Rm9yQ2xvc2UgPSBtYXhXYWl0OwpAQCAtMTA1Myw3ICs5NTgsNyBAQAogCiAgICAgICAgIHB1YmxpYyBDbHVzdGVyIGNyZWF0ZSgpIHsKICAgICAgICAgICAgIGlmIChhZGRyZXNzZXMuc2l6ZSgpID09IDApIGFkZENvbnRhY3RQb2ludCgibG9jYWxob3N0Iik7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBzZXJpYWxpemVyKSBzZXJpYWxpemVyID0gU2VyaWFsaXplcnMuR1JZT19WM0QwLnNpbXBsZUluc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBzZXJpYWxpemVyKSBzZXJpYWxpemVyID0gU2VyaWFsaXplcnMuR1JBUEhCSU5BUllfVjFEMC5zaW1wbGVJbnN0YW5jZSgpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBDbHVzdGVyKHRoaXMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTExNSwxNiArMTAyMCwxMSBAQAogICAgICAgICAgICAgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5tYXhTaXplID0gYnVpbGRlci5tYXhDb25uZWN0aW9uUG9vbFNpemU7CiAgICAgICAgICAgICBjb25uZWN0aW9uUG9vbFNldHRpbmdzLm1pblNpemUgPSBidWlsZGVyLm1pbkNvbm5lY3Rpb25Qb29sU2l6ZTsKICAgICAgICAgICAgIGNvbm5lY3Rpb25Qb29sU2V0dGluZ3MubWF4V2FpdEZvckNvbm5lY3Rpb24gPSBidWlsZGVyLm1heFdhaXRGb3JDb25uZWN0aW9uOwotICAgICAgICAgICAgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5tYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlID0gYnVpbGRlci5tYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlOwogICAgICAgICAgICAgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5tYXhXYWl0Rm9yQ2xvc2UgPSBidWlsZGVyLm1heFdhaXRGb3JDbG9zZTsKICAgICAgICAgICAgIGNvbm5lY3Rpb25Qb29sU2V0dGluZ3MubWF4Q29udGVudExlbmd0aCA9IGJ1aWxkZXIubWF4Q29udGVudExlbmd0aDsKICAgICAgICAgICAgIGNvbm5lY3Rpb25Qb29sU2V0dGluZ3MucmVjb25uZWN0SW50ZXJ2YWwgPSBidWlsZGVyLnJlY29ubmVjdEludGVydmFsOwogICAgICAgICAgICAgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5yZXN1bHRJdGVyYXRpb25CYXRjaFNpemUgPSBidWlsZGVyLnJlc3VsdEl0ZXJhdGlvbkJhdGNoU2l6ZTsKICAgICAgICAgICAgIGNvbm5lY3Rpb25Qb29sU2V0dGluZ3MuZW5hYmxlU3NsID0gYnVpbGRlci5lbmFibGVTc2w7Ci0gICAgICAgICAgICBjb25uZWN0aW9uUG9vbFNldHRpbmdzLnRydXN0Q2VydENoYWluRmlsZSA9IGJ1aWxkZXIudHJ1c3RDZXJ0Q2hhaW5GaWxlOwotICAgICAgICAgICAgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5rZXlDZXJ0Q2hhaW5GaWxlID0gYnVpbGRlci5rZXlDZXJ0Q2hhaW5GaWxlOwotICAgICAgICAgICAgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5rZXlGaWxlID0gYnVpbGRlci5rZXlGaWxlOwotICAgICAgICAgICAgY29ubmVjdGlvblBvb2xTZXR0aW5ncy5rZXlQYXNzd29yZCA9IGJ1aWxkZXIua2V5UGFzc3dvcmQ7CiAgICAgICAgICAgICBjb25uZWN0aW9uUG9vbFNldHRpbmdzLmtleVN0b3JlID0gYnVpbGRlci5rZXlTdG9yZTsKICAgICAgICAgICAgIGNvbm5lY3Rpb25Qb29sU2V0dGluZ3Mua2V5U3RvcmVQYXNzd29yZCA9IGJ1aWxkZXIua2V5U3RvcmVQYXNzd29yZDsKICAgICAgICAgICAgIGNvbm5lY3Rpb25Qb29sU2V0dGluZ3MudHJ1c3RTdG9yZSA9IGJ1aWxkZXIudHJ1c3RTdG9yZTsKQEAgLTExODYsOSArMTA4Niw2IEBACiAgICAgICAgICAgICBpZiAoYnVpbGRlci5tYXhXYWl0Rm9yQ29ubmVjdGlvbiA8IDEpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWF4V2FpdEZvckNvbm5lY3Rpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOwogCi0gICAgICAgICAgICBpZiAoYnVpbGRlci5tYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlIDwgMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQogICAgICAgICAgICAgaWYgKGJ1aWxkZXIubWF4V2FpdEZvckNsb3NlIDwgMSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXhXYWl0Rm9yQ2xvc2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0Nvbm5lY3Rpb24uamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ29ubmVjdGlvbi5qYXZhCmluZGV4IGNjM2E1MWQuLmE4OGE4MmMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ29ubmVjdGlvbi5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ29ubmVjdGlvbi5qYXZhCkBAIC02Myw3ICs2Myw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lOX1BST0NFU1MgPSA0OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9JTl9QUk9DRVNTID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfV0FJVF9GT1JfQ09OTkVDVElPTiA9IDE2MDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9XQUlUX0ZPUl9TRVNTSU9OX0NMT1NFID0gMzAwMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfV0FJVF9GT1JfQ0xPU0UgPSAzMDAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DT05URU5UX0xFTkdUSCA9IDY1NTM2OwogCkBAIC0zMzIsNDAgKzMzMSw2IEBACiAgICAgICAgIC8vIG1lc3NhZ2VzIGF0IHRoZSBzZXJ2ZXIgYW5kIGxlYWRzIHRvIHVnbHkgbG9nIG1lc3NhZ2VzIG92ZXIgdGhlcmUuCiAgICAgICAgIGlmIChzaHV0ZG93bkluaXRpYXRlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbm5lY3Rpb25JbmZvID0gdGhpcy5nZXRDb25uZWN0aW9uSW5mbygpOwotICAgICAgICAgICAgLy8gdGhpcyBibG9jayBvZiBjb2RlIHRoYXQgImNsb3NlcyIgdGhlIHNlc3Npb24gaXMgZGVwcmVjYXRlZCBhcyBvZiAzLjMuMTEgLSB0aGlzIG1lc3NhZ2UgaXMgZ29pbmcgdG8gYmUKLSAgICAgICAgICAgIC8vIHJlbW92ZWQgYXQgMy41LjAuIHdlIHdpbGwgaW5zdGVhZCBiaW5kIHNlc3Npb24gY2xvc2luZyB0byB0aGUgY2xvc2Ugb2YgdGhlIGNoYW5uZWwgaXRzZWxmIGFuZCBub3QgaGF2ZQotICAgICAgICAgICAgLy8gdGhpcyBzZWNvbmRhcnkgb3BlcmF0aW9uIGhlcmUgd2hpY2ggcmVhbGx5IG9ubHkgYWN0cyBhcyBhIG1lYW5zIGZvciBjbGVhcmluZyByZXNvdXJjZXMgaW4gYSBmdW5jdGlvbmluZwotICAgICAgICAgICAgLy8gc2Vzc2lvbi4gImZ1bmN0aW9uaW5nIiBpbiB0aGlzIGNvbnRleHQgbWVhbnMgdGhhdCB0aGUgc2Vzc2lvbiBpcyBub3QgbG9ja2VkIHVwIHdpdGggYSBsb25nIHJ1bm5pbmcKLSAgICAgICAgICAgIC8vIG9wZXJhdGlvbiB3aGljaCB3aWxsIGRlbGF5IHRoaXMgY2xvc2UgZXhlY3V0aW9uIHdoaWNoIGlkZWFsbHkgc2hvdWxkIGJlIG1vcmUgaW1tZWRpYXRlLCBhcyBpbiB0aGUgdXNlcgotICAgICAgICAgICAgLy8gaXMgYW5ub3llZCB0aGF0IGEgbG9uZyBydW4gb3BlcmF0aW9uIGlzIGhhcHBlbmluZyBhbmQgdGhleSB3YW50IGFuIGltbWVkaWF0ZSBjYW5jZWxsYXRpb24uIHRoYXQncyB0aGUKLSAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IHVzZSBjYXNlLiB3ZSBhbHNvIGdldCB0aGUgbmljZSBiZW5lZml0IHRoYXQgdGhpcyBpZi90aGVuIGNvZGUganVzdCBnb2VzIGF3YXkgYXMgdGhlCi0gICAgICAgICAgICAvLyBDb25uZWN0aW9uIHJlYWxseSBzaG91bGRuJ3QgY2FyZSBhYm91dCB0aGUgc3BlY2lmaWMgQ2xpZW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgaWYgKGNsaWVudCBpbnN0YW5jZW9mIENsaWVudC5TZXNzaW9uZWRDbGllbnQgJiYgIWlzRGVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JjZUNsb3NlID0gY2xpZW50LmdldFNldHRpbmdzKCkuZ2V0U2Vzc2lvbigpLmdldCgpLmlzRm9yY2VDbG9zZWQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXF1ZXN0TWVzc2FnZSBjbG9zZU1lc3NhZ2UgPSBjbGllbnQuYnVpbGRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdE1lc3NhZ2UuYnVpbGQoVG9rZW5zLk9QU19DTE9TRSkuYWRkQXJnKFRva2Vucy5BUkdTX0ZPUkNFLCBmb3JjZUNsb3NlKSkuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxSZXN1bHRTZXQ+IGNsb3NlZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGUoY2xvc2VNZXNzYWdlLCBjbG9zZWQpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGdldCBhIHJlc3BvbnNlIGhlcmUgdG8gdmFsaWRhdGUgdGhhdCB0aGluZ3MgY2xvc2VkIGFzIGV4cGVjdGVkLiAgb24gZXJyb3IsIHdlJ2xsIGxldAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmVyIHRyeSB0byBjbGVhbiB1cCBvbiBpdHMgb3duLiAgdGhlIHByaW1hcnkgZXJyb3IgaGVyZSBzaG91bGQgcHJvYmFibHkgYmUgcmVsYXRlZCB0bwotICAgICAgICAgICAgICAgICAgICAvLyBwcm90b2NvbCBpc3N1ZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBzb21ldGhpbmcgYSB1c2VyIGhhcyB0byBmdXNzIHdpdGguCi0gICAgICAgICAgICAgICAgICAgIGNsb3NlZC5qb2luKCkuYWxsKCkuZ2V0KGNsdXN0ZXIuZ2V0TWF4V2FpdEZvclNlc3Npb25DbG9zZSgpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVvdXQgd2hpbGUgdHJ5aW5nIHRvIGNsb3NlIGNvbm5lY3Rpb24gb24gJXMgLSBmb3JjZSBjbG9zaW5nIC0gc2VydmVyIHdpbGwgY2xvc2Ugc2Vzc2lvbiBvbiBzaHV0ZG93biBvciBleHBpcmF0aW9uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDbGllbnQuU2Vzc2lvbmVkQ2xpZW50KSBjbGllbnQpLmdldFNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obXNnLCBleCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmNvdW50ZXJlZCBhbiBlcnJvciB0cnlpbmcgdG8gY2xvc2UgY29ubmVjdGlvbiBvbiAlcyAtIGZvcmNlIGNsb3NpbmcgLSBzZXJ2ZXIgd2lsbCBjbG9zZSBzZXNzaW9uIG9uIHNodXRkb3duIG9yIGV4cGlyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENsaWVudC5TZXNzaW9uZWRDbGllbnQpIGNsaWVudCkuZ2V0U2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2Fybihtc2csIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGNoYW5uZWxpemVyLmNsb3NlKGNoYW5uZWwpOwogCiAgICAgICAgICAgICBmaW5hbCBDaGFubmVsUHJvbWlzZSBwcm9taXNlID0gY2hhbm5lbC5uZXdQcm9taXNlKCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0hhbmRsZXIuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvSGFuZGxlci5qYXZhCmluZGV4IDc0Y2Y3NjEuLjQwMjMxZWMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvSGFuZGxlci5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvSGFuZGxlci5qYXZhCkBAIC0yMjMsMjkgKzIyMywxNSBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZGF0YSA9IHJlc3BvbnNlLmdldFJlc3VsdCgpLmdldERhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IG1ldGEgPSByZXNwb25zZS5nZXRSZXN1bHQoKS5nZXRNZXRhKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhLmNvbnRhaW5zS2V5KFRva2Vucy5BUkdTX1NJREVfRUZGRUNUX0tFWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSAicmVzdWx0IiBmcm9tIHRoZSBzZXJ2ZXIgd2hpY2ggaXMgZWl0aGVyIHRoZSByZXN1bHQgb2YgYSBzY3JpcHQgb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VyaWFsaXplZCB0cmF2ZXJzYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVucm9sbHMgdGhlIGNvbGxlY3Rpb24gaW50byBpbmRpdmlkdWFsIHJlc3VsdHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgcXVldWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGxpc3RUb1Vucm9sbCA9IChMaXN0PE9iamVjdD4pIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFRvVW5yb2xsLmZvckVhY2goaXRlbSAtPiBxdWV1ZS5hZGQobmV3IFJlc3VsdChpdGVtKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG5vdCBhIGxpc3QgaXQgY2FuIGp1c3QgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKG5ldyBSZXN1bHQocmVzcG9uc2UuZ2V0UmVzdWx0KCkuZ2V0RGF0YSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSAicmVzdWx0IiBmcm9tIHRoZSBzZXJ2ZXIgd2hpY2ggaXMgZWl0aGVyIHRoZSByZXN1bHQgb2YgYSBzY3JpcHQgb3IgYQorICAgICAgICAgICAgICAgICAgICAvLyBzZXJpYWxpemVkIHRyYXZlcnNhbAorICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVucm9sbHMgdGhlIGNvbGxlY3Rpb24gaW50byBpbmRpdmlkdWFsIHJlc3VsdHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgcXVldWUuCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdFRvVW5yb2xsID0gKExpc3Q8T2JqZWN0PikgZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RUb1Vucm9sbC5mb3JFYWNoKGl0ZW0gLT4gcXVldWUuYWRkKG5ldyBSZXN1bHQoaXRlbSkpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHNpZGUtZWZmZWN0IGZyb20gdGhlIHNlcnZlciB3aGljaCBpcyBnZW5lcmF0ZWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhdmVyc2FsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWdncmVnYXRlVG8gPSBtZXRhLmdldE9yRGVmYXVsdChUb2tlbnMuQVJHU19BR0dSRUdBVEVfVE8sIFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX05PTkUpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnJvbGxzIHRoZSBjb2xsZWN0aW9uIGludG8gaW5kaXZpZHVhbCByZXN1bHRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHF1ZXVlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBsaXN0T2ZTaWRlRWZmZWN0cyA9IChMaXN0PE9iamVjdD4pIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdE9mU2lkZUVmZmVjdHMuZm9yRWFjaChzaWRlRWZmZWN0IC0+IHF1ZXVlLmFkZFNpZGVFZmZlY3QoYWdncmVnYXRlVG8sIHNpZGVFZmZlY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBub3QgYSBsaXN0IGl0IGNhbiBqdXN0IGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS4gdGhpcyBsaWtlbHkgc2hvdWxkbid0IG9jY3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG93ZXZlciBhcyB0aGUgcHJvdG9jb2wgd2lsbCB0eXBpY2FsbHkgcHVzaCBldmVyeXRoaW5nIHRvIGxpc3QgZmlyc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkU2lkZUVmZmVjdChhZ2dyZWdhdGVUbywgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG5vdCBhIGxpc3QgaXQgY2FuIGp1c3QgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlCisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hZGQobmV3IFJlc3VsdChyZXNwb25zZS5nZXRSZXN1bHQoKS5nZXREYXRhKCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSAic3VjY2VzcyIgYnV0IHJlcHJlc2VudHMgbm8gcmVzdWx0cyBvdGhlcndpc2UgaXQgaXMgYW4gZXJyb3IKZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvUmVxdWVzdE9wdGlvbnMuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvUmVxdWVzdE9wdGlvbnMuamF2YQppbmRleCAwNmJjZTE4Li43MGMwNjE4IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1JlcXVlc3RPcHRpb25zLmphdmEKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9SZXF1ZXN0T3B0aW9ucy5qYXZhCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcGVyIGNsaWVudCByZXF1ZXN0IG92ZXJyaWRlIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHNlcnZlciBjb25maWd1cmVkIHtAY29kZSBzY3JpcHRFdmFsdWF0aW9uVGltZW91dH0uCisgICAgICAgICAqIFRoZSBwZXIgY2xpZW50IHJlcXVlc3Qgb3ZlcnJpZGUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgc2VydmVyIGNvbmZpZ3VyZWQge0Bjb2RlIGV2YWx1YXRpb25UaW1lb3V0fS4KICAgICAgICAgICogSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGVuIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VydmVyIGlzIHVzZWQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQnVpbGRlciB0aW1lb3V0KGZpbmFsIGxvbmcgdGltZW91dCkgewpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9SZXN1bHRRdWV1ZS5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9SZXN1bHRRdWV1ZS5qYXZhCmluZGV4IDI5YTY0NTMuLjhjZTRmYmEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvUmVzdWx0UXVldWUuamF2YQorKysgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1Jlc3VsdFF1ZXVlLmphdmEKQEAgLTE4LDIxICsxOCwxNSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXNwb25zZU1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuQnVsa1NldDsKIGltcG9ydCBvcmcuamF2YXR1cGxlcy5QYWlyOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUXVldWU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKQEAgLTc0LDY1ICs2OCw2IEBACiAgICAgICAgIHRyeURyYWluTmV4dFdhaXRpbmcoZmFsc2UpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBzaWRlLWVmZmVjdCB0byB0aGUgcXVldWUgd2hpY2ggbWF5IGxhdGVyIGJlIHJlYWQgYnkgdGhlIHtAbGluayBSZXN1bHRTZXR9LiBOb3RlIHRoYXQgdGhlIHNpZGUtZWZmZWN0Ci0gICAgICogaXMgb25seSByZXR1cm5lZCB3aGVuIGEge0BsaW5rIFRyYXZlcnNhbH0gaXMgc3VibWl0dGVkIGFuZCByZWZlcnMgdG8gdGhlIHNpZGUtZWZmZWN0cyBkZWZpbmVkIGluIHRoYXQgdHJhdmVyc2FsLgotICAgICAqIEEgInNjcmlwdCIgd2lsbCBub3QgcmV0dXJuIHNpZGUtZWZmZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZ2dyZWdhdGVUbyB0aGUgdmFsdWUgb2YgdGhlIHtAbGluayBSZXNwb25zZU1lc3NhZ2V9IG1ldGFkYXRhIGZvciB7QGxpbmsgVG9rZW5zI0FSR1NfQUdHUkVHQVRFX1RPfS4KLSAgICAgKiBAcGFyYW0gc2lkZUVmZmVjdFZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc2lkZS1lZmZlY3QgaXRzZWxmCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkIGluIHRoZSBwcm90b2NvbCBhcyBzaWRlLWVmZmVjdCByZXRyaWV2YWwgYWZ0ZXIKLSAgICAgKiB0cmF2ZXJzYWwgaXRlcmF0aW9uIGlzIG5vdCBiZWluZyBwcm9tb3RlZCBhbnltb3JlIGFzIGEgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyB2b2lkIGFkZFNpZGVFZmZlY3QoZmluYWwgU3RyaW5nIGFnZ3JlZ2F0ZVRvLCBmaW5hbCBPYmplY3Qgc2lkZUVmZmVjdFZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoYWdncmVnYXRlVG8pIHsKLSAgICAgICAgICAgIGNhc2UgVG9rZW5zLlZBTF9BR0dSRUdBVEVfVE9fQlVMS1NFVDoKLSAgICAgICAgICAgICAgICBpZiAoIShzaWRlRWZmZWN0VmFsdWUgaW5zdGFuY2VvZiBUcmF2ZXJzZXIuQWRtaW4pKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlNpZGUtZWZmZWN0IHZhbHVlICVzIGlzIGEgJXMgd2hpY2ggZG9lcyBub3QgYWdncmVnYXRlIHRvICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlRWZmZWN0VmFsdWUsIHNpZGVFZmZlY3RWYWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgYWdncmVnYXRlVG8pKTsKLQotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGFnZ3JlZ2F0ZWRSZXN1bHQpIGFnZ3JlZ2F0ZWRSZXN1bHQgPSBuZXcgQnVsa1NldCgpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgQnVsa1NldDxPYmplY3Q+IGJzID0gdmFsaWRhdGUoYWdncmVnYXRlVG8sIEJ1bGtTZXQuY2xhc3MpOwotICAgICAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNlci5BZG1pbiB0cmF2ZXJzZXIgPSAoVHJhdmVyc2VyLkFkbWluKSBzaWRlRWZmZWN0VmFsdWU7Ci0gICAgICAgICAgICAgICAgYnMuYWRkKHRyYXZlcnNlci5nZXQoKSwgdHJhdmVyc2VyLmJ1bGsoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX0xJU1Q6Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYWdncmVnYXRlZFJlc3VsdCkgYWdncmVnYXRlZFJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IHZhbGlkYXRlKGFnZ3JlZ2F0ZVRvLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChzaWRlRWZmZWN0VmFsdWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUb2tlbnMuVkFMX0FHR1JFR0FURV9UT19TRVQ6Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYWdncmVnYXRlZFJlc3VsdCkgYWdncmVnYXRlZFJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0PE9iamVjdD4gc2V0ID0gdmFsaWRhdGUoYWdncmVnYXRlVG8sIFNldC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChzaWRlRWZmZWN0VmFsdWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUb2tlbnMuVkFMX0FHR1JFR0FURV9UT19NQVA6Ci0gICAgICAgICAgICAgICAgaWYgKCEoc2lkZUVmZmVjdFZhbHVlIGluc3RhbmNlb2YgTWFwLkVudHJ5KSAmJiAhKHNpZGVFZmZlY3RWYWx1ZSBpbnN0YW5jZW9mIE1hcCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiU2lkZS1lZmZlY3QgdmFsdWUgJXMgaXMgYSAlcyB3aGljaCBkb2VzIG5vdCBhZ2dyZWdhdGUgdG8gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVFZmZlY3RWYWx1ZSwgc2lkZUVmZmVjdFZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBhZ2dyZWdhdGVUbykpOwotCi0gICAgICAgICAgICAgICAgLy8gc29tZSBzZXJpYWxpemF0aW9uIGZvcm1hdHMgKGUuZy4gZ3JhcGhzb24pIG1heSBkZXNlcmlhbGl6ZSBhIE1hcC5FbnRyeSB0byBhIE1hcCB3aXRoIGEgc2luZ2xlIGVudHJ5Ci0gICAgICAgICAgICAgICAgaWYgKHNpZGVFZmZlY3RWYWx1ZSBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCkgc2lkZUVmZmVjdFZhbHVlKS5zaXplKCkgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJTaWRlLWVmZmVjdCB2YWx1ZSAlcyBpcyBhICVzIHdoaWNoIGRvZXMgbm90IGFnZ3JlZ2F0ZSB0byAlcyBhcyBpdCBpcyBhIE1hcCB0aGF0IGRvZXMgbm90IGhhdmUgb25lIGVudHJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlRWZmZWN0VmFsdWUsIHNpZGVFZmZlY3RWYWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgYWdncmVnYXRlVG8pKTsKLQotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGFnZ3JlZ2F0ZWRSZXN1bHQpIGFnZ3JlZ2F0ZWRSZXN1bHQgPSAgbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxPYmplY3QsT2JqZWN0ID4gbSA9IHZhbGlkYXRlKGFnZ3JlZ2F0ZVRvLCBNYXAuY2xhc3MpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeSBlbnRyeSA9IHNpZGVFZmZlY3RWYWx1ZSBpbnN0YW5jZW9mIE1hcC5FbnRyeSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWFwLkVudHJ5KSBzaWRlRWZmZWN0VmFsdWUgOiAoTWFwLkVudHJ5KSAoKE1hcCkgc2lkZUVmZmVjdFZhbHVlKS5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgIG0ucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVG9rZW5zLlZBTF9BR0dSRUdBVEVfVE9fTk9ORToKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBhZ2dyZWdhdGVkUmVzdWx0KSBhZ2dyZWdhdGVkUmVzdWx0ID0gc2lkZUVmZmVjdFZhbHVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yICVzIiwgYWdncmVnYXRlVG8sIFRva2Vucy5BUkdTX0FHR1JFR0FURV9UTykpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSA8Vj4gViB2YWxpZGF0ZShmaW5hbCBTdHJpbmcgYWdncmVnYXRlVG8sIGZpbmFsIENsYXNzPD8+IGV4cGVjdGVkKSB7CiAgICAgICAgIGlmICghKGV4cGVjdGVkLmlzQXNzaWduYWJsZUZyb20oYWdncmVnYXRlZFJlc3VsdC5nZXRDbGFzcygpKSkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlNpZGUtZWZmZWN0IFwiJXNcIiBjb250YWlucyB0aGUgdHlwZSAlcyB0aGF0IGlzIG5vdCBhY2NlcHRhYmxlIGZvciAlcyIsCmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1NldHRpbmdzLmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1NldHRpbmdzLmphdmEKaW5kZXggNWE5Y2Q5MC4uNWYzNDI0ZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9TZXR0aW5ncy5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvU2V0dGluZ3MuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5pdGVyYXRvci5JdGVyYXRvclV0aWxzOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5UeXBlRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CkBAIC0xNTYsOSArMTU2LDcgQEAKICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gc2VyaWFsaXplckNvbmZpZ0NvbmYgPSBjb25mLnN1YnNldCgic2VyaWFsaXplci5jb25maWciKTsKICAgICAgICAgICAgIGlmIChJdGVyYXRvclV0aWxzLmNvdW50KHNlcmlhbGl6ZXJDb25maWdDb25mLmdldEtleXMoKSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplckNvbmZpZ0NvbmYuZ2V0S2V5cygpLmZvckVhY2hSZW1haW5pbmcobmFtZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIG0ucHV0KG5hbWUsIHNlcmlhbGl6ZXJDb25maWdDb25mLmdldFByb3BlcnR5KG5hbWUpKTsKLSAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyQ29uZmlnQ29uZi5nZXRLZXlzKCkuZm9yRWFjaFJlbWFpbmluZyhuYW1lIC0+IG0ucHV0KG5hbWUsIHNlcmlhbGl6ZXJDb25maWdDb25mLmdldFByb3BlcnR5KG5hbWUpKSk7CiAgICAgICAgICAgICAgICAgc2VyaWFsaXplclNldHRpbmdzLmNvbmZpZyA9IG07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXR0aW5ncy5zZXJpYWxpemVyID0gc2VyaWFsaXplclNldHRpbmdzOwpAQCAtMTc0LDE4ICsxNzIsNiBAQAogICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25Qb29sQ29uZi5jb250YWluc0tleSgiZW5hYmxlU3NsIikpCiAgICAgICAgICAgICAgICAgY3BTZXR0aW5ncy5lbmFibGVTc2wgPSBjb25uZWN0aW9uUG9vbENvbmYuZ2V0Qm9vbGVhbigiZW5hYmxlU3NsIik7CiAKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uUG9vbENvbmYuY29udGFpbnNLZXkoImtleUNlcnRDaGFpbkZpbGUiKSkKLSAgICAgICAgICAgICAgICBjcFNldHRpbmdzLmtleUNlcnRDaGFpbkZpbGUgPSBjb25uZWN0aW9uUG9vbENvbmYuZ2V0U3RyaW5nKCJrZXlDZXJ0Q2hhaW5GaWxlIik7Ci0KLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uUG9vbENvbmYuY29udGFpbnNLZXkoImtleUZpbGUiKSkKLSAgICAgICAgICAgICAgICBjcFNldHRpbmdzLmtleUZpbGUgPSBjb25uZWN0aW9uUG9vbENvbmYuZ2V0U3RyaW5nKCJrZXlGaWxlIik7Ci0KLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uUG9vbENvbmYuY29udGFpbnNLZXkoImtleVBhc3N3b3JkIikpCi0gICAgICAgICAgICAgICAgY3BTZXR0aW5ncy5rZXlQYXNzd29yZCA9IGNvbm5lY3Rpb25Qb29sQ29uZi5nZXRTdHJpbmcoImtleVBhc3N3b3JkIik7Ci0KLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uUG9vbENvbmYuY29udGFpbnNLZXkoInRydXN0Q2VydENoYWluRmlsZSIpKQotICAgICAgICAgICAgICAgIGNwU2V0dGluZ3MudHJ1c3RDZXJ0Q2hhaW5GaWxlID0gY29ubmVjdGlvblBvb2xDb25mLmdldFN0cmluZygidHJ1c3RDZXJ0Q2hhaW5GaWxlIik7Ci0KICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uUG9vbENvbmYuY29udGFpbnNLZXkoImtleVN0b3JlIikpCiAgICAgICAgICAgICAgICAgY3BTZXR0aW5ncy5rZXlTdG9yZSA9IGNvbm5lY3Rpb25Qb29sQ29uZi5nZXRTdHJpbmcoImtleVN0b3JlIik7CiAKQEAgLTIzNiw5ICsyMjIsNiBAQAogICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25Qb29sQ29uZi5jb250YWluc0tleSgibWF4V2FpdEZvckNvbm5lY3Rpb24iKSkKICAgICAgICAgICAgICAgICBjcFNldHRpbmdzLm1heFdhaXRGb3JDb25uZWN0aW9uID0gY29ubmVjdGlvblBvb2xDb25mLmdldEludCgibWF4V2FpdEZvckNvbm5lY3Rpb24iKTsKIAotICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25Qb29sQ29uZi5jb250YWluc0tleSgibWF4V2FpdEZvclNlc3Npb25DbG9zZSIpKQotICAgICAgICAgICAgICAgIGNwU2V0dGluZ3MubWF4V2FpdEZvclNlc3Npb25DbG9zZSA9IGNvbm5lY3Rpb25Qb29sQ29uZi5nZXRJbnQoIm1heFdhaXRGb3JTZXNzaW9uQ2xvc2UiKTsKLQogICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25Qb29sQ29uZi5jb250YWluc0tleSgibWF4V2FpdEZvckNsb3NlIikpCiAgICAgICAgICAgICAgICAgY3BTZXR0aW5ncy5tYXhXYWl0Rm9yQ2xvc2UgPSBjb25uZWN0aW9uUG9vbENvbmYuZ2V0SW50KCJtYXhXYWl0Rm9yQ2xvc2UiKTsKIApAQCAtMjcwLDM0ICsyNTMsNiBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVTc2wgPSBmYWxzZTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRydXN0ZWQgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAjdHJ1c3RTdG9yZX0KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdHJ1c3RDZXJ0Q2hhaW5GaWxlID0gbnVsbDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFguNTA5IGNlcnRpZmljYXRlIGNoYWluIGZpbGUgaW4gUEVNIGZvcm1hdC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAja2V5U3RvcmV9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgU3RyaW5nIGtleUNlcnRDaGFpbkZpbGUgPSBudWxsOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgUEtDUyM4IHByaXZhdGUga2V5IGZpbGUgaW4gUEVNIGZvcm1hdC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAja2V5U3RvcmV9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgU3RyaW5nIGtleUZpbGUgPSBudWxsOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcGFzc3dvcmQgb2YgdGhlIHtAbGluayAja2V5RmlsZX0sIG9yIHtAY29kZSBudWxsfSBpZiBpdCdzIG5vdCBwYXNzd29yZC1wcm90ZWN0ZWQuCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCByZXBsYWNlZCBieSB7QGxpbmsgI2tleVN0b3JlUGFzc3dvcmR9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgU3RyaW5nIGtleVBhc3N3b3JkID0gbnVsbDsKLQotICAgICAgICAvKioKICAgICAgICAgICogSlNTRSBrZXlzdG9yZSBmaWxlIHBhdGguIFNpbWlsYXIgdG8gc2V0dGluZyBKU1NFIHByb3BlcnR5CiAgICAgICAgICAqIHtAY29kZSBqYXZheC5uZXQuc3NsLmtleVN0b3JlfS4KICAgICAgICAgICovCkBAIC00MDEsMTYgKzM1Niw2IEBACiAgICAgICAgIHB1YmxpYyBpbnQgbWF4V2FpdEZvckNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLk1BWF9XQUlUX0ZPUl9DT05ORUNUSU9OOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyB1c2luZyBhICJzZXNzaW9uIiB0aGlzIHNldHRpbmcgcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQKLSAgICAgICAgICogZm9yIHRoYXQgc2Vzc2lvbiB0byBjbG9zZSBiZWZvcmUgdGltaW5nIG91dCB3aGVyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAzMDAwLiBOb3RlIHRoYXQgdGhlIHNlcnZlciB3aWxsCi0gICAgICAgICAqIGV2ZW50dWFsbHkgY2xlYW4gdXAgZGVhZCBzZXNzaW9ucyBpdHNlbGYgb24gZXhwaXJhdGlvbiBvZiB0aGUgc2Vzc2lvbiBvciBkdXJpbmcgc2h1dGRvd24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjExLCByZXBsYWNlZCBpbiBlc3NlbmNlIGJ5IHtAbGluayAjbWF4V2FpdEZvckNsb3NlfS4KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBpbnQgbWF4V2FpdEZvclNlc3Npb25DbG9zZSA9IENvbm5lY3Rpb24uTUFYX1dBSVRfRk9SX1NFU1NJT05fQ0xPU0U7Ci0KLSAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCB0aGUgY29ubmVjdGlvbiB0byBjbG9zZSBiZWZvcmUgdGltaW5nIG91dCB3aGVyZSB0aGUgZGVmYXVsdAogICAgICAgICAgKiB2YWx1ZSBpcyAzMDAwLiBUaGlzIHRpbWVvdXQgYWxsb3dzIGZvciBhIGRlbGF5IHRvIG9jY3VyIGluIHdhaXRpbmcgZm9yIHJlbWFpbmluZyBtZXNzYWdlcyB0aGF0IG1heSBzdGlsbAogICAgICAgICAgKiBiZSByZXR1cm5pbmcgZnJvbSB0aGUgc2VydmVyIHdoaWxlIGEge0BsaW5rIENsaWVudCNjbG9zZSgpfSBpcyBjYWxsZWQuCkBAIC00NTIsOCArMzk3LDkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUge0BsaW5rIE1lc3NhZ2VTZXJpYWxpemVyfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZQogICAgICAgICAgKiBzZXJ2ZXIuIE5vdGUgdGhhdCB0aGUgc2VyaWFsaXplciBjb25maWd1cmVkIG9uIHRoZSBjbGllbnQgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqIEJ5IGRlZmF1bHQgdGhlIHNldHRpbmcgaXMgY29uZmlndXJlZCB0byB7QGxpbmsgR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxfS4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lID0gR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCk7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lID0gR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgc2VyaWFsaXplciB3aXRoIHRoZSB7QGxpbmsgI2NsYXNzTmFtZX0uCkBAIC00NjEsNyArNDA3LDcgQEAKICAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29uZmlnID0gbnVsbDsKIAogICAgICAgICBwdWJsaWMgTWVzc2FnZVNlcmlhbGl6ZXIgY3JlYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwogICAgICAgICAgICAgZmluYWwgTWVzc2FnZVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IChNZXNzYWdlU2VyaWFsaXplcikgY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUoY29uZmlnKS5pZlByZXNlbnQoYyAtPiBzZXJpYWxpemVyLmNvbmZpZ3VyZShjLCBudWxsKSk7CiAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplcjsKZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvVG9rZW5zLmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1Rva2Vucy5qYXZhCmluZGV4IGQ3YTQyMTUuLjg2N2VkZjIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvVG9rZW5zLmphdmEKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9Ub2tlbnMuamF2YQpAQCAtMzIsOTcgKzMyLDIyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BTX0lOVkFMSUQgPSAiaW52YWxpZCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BTX0NMT1NFID0gImNsb3NlIjsKIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCBkaXJlY3RseSByZXBsYWNlZCBpbiB0aGUgcHJvdG9jb2wgYXMgc2lkZS1lZmZlY3QgcmV0cmlldmFsIGFmdGVyCi0gICAgICogdHJhdmVyc2FsIGl0ZXJhdGlvbiBpcyBub3QgYmVpbmcgcHJvbW90ZWQgYW55bW9yZSBhcyBhIGZlYXR1cmUuCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFNfR0FUSEVSID0gImdhdGhlciI7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgaW4gdGhlIHByb3RvY29sIGFzIHNpZGUtZWZmZWN0IHJldHJpZXZhbCBhZnRlcgotICAgICAqIHRyYXZlcnNhbCBpdGVyYXRpb24gaXMgbm90IGJlaW5nIHByb21vdGVkIGFueW1vcmUgYXMgYSBmZWF0dXJlLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BTX0tFWVMgPSAia2V5cyI7Ci0KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0lEID0gInJlcXVlc3RJZCI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX0JBVENIX1NJWkUgPSAiYmF0Y2hTaXplIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX0JJTkRJTkdTID0gImJpbmRpbmdzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX0FMSUFTRVMgPSAiYWxpYXNlcyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHU19GT1JDRSA9ICJmb3JjZSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHU19HUkVNTElOID0gImdyZW1saW4iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1NfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOSwgcmVwbGFjZWQgYnkge0BsaW5rICNBUkdTX0VWQUxfVElNRU9VVH0uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX1NDUklQVF9FVkFMX1RJTUVPVVQgPSAic2NyaXB0RXZhbHVhdGlvblRpbWVvdXQiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1NfRVZBTF9USU1FT1VUID0gImV2YWx1YXRpb25UaW1lb3V0IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX0hPU1QgPSAiaG9zdCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHU19TRVNTSU9OID0gInNlc3Npb24iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1NfTUFOQUdFX1RSQU5TQUNUSU9OID0gIm1hbmFnZVRyYW5zYWN0aW9uIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX1NBU0wgPSAic2FzbCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHU19TQVNMX01FQ0hBTklTTSA9ICJzYXNsTWVjaGFuaXNtIjsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCBkaXJlY3RseSByZXBsYWNlZCBpbiB0aGUgcHJvdG9jb2wgYXMgc2lkZS1lZmZlY3QgcmV0cmlldmFsIGFmdGVyCi0gICAgICogdHJhdmVyc2FsIGl0ZXJhdGlvbiBpcyBub3QgYmVpbmcgcHJvbW90ZWQgYW55bW9yZSBhcyBhIGZlYXR1cmUuCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX1NJREVfRUZGRUNUID0gInNpZGVFZmZlY3QiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkIGluIHRoZSBwcm90b2NvbCBhcyBzaWRlLWVmZmVjdCByZXRyaWV2YWwgYWZ0ZXIKLSAgICAgKiB0cmF2ZXJzYWwgaXRlcmF0aW9uIGlzIG5vdCBiZWluZyBwcm9tb3RlZCBhbnltb3JlIGFzIGEgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1NfQUdHUkVHQVRFX1RPID0gImFnZ3JlZ2F0ZVRvIjsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCBkaXJlY3RseSByZXBsYWNlZCBpbiB0aGUgcHJvdG9jb2wgYXMgc2lkZS1lZmZlY3QgcmV0cmlldmFsIGFmdGVyCi0gICAgICogdHJhdmVyc2FsIGl0ZXJhdGlvbiBpcyBub3QgYmVpbmcgcHJvbW90ZWQgYW55bW9yZSBhcyBhIGZlYXR1cmUuCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX1NJREVfRUZGRUNUX0tFWSA9ICJzaWRlRWZmZWN0S2V5IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdTX1VTRVJfQUdFTlQgPSAidXNlckFnZW50IjsKIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCBkaXJlY3RseSByZXBsYWNlZCBpbiB0aGUgcHJvdG9jb2wgYXMgc2lkZS1lZmZlY3QgcmV0cmlldmFsIGFmdGVyCi0gICAgICogdHJhdmVyc2FsIGl0ZXJhdGlvbiBpcyBub3QgYmVpbmcgcHJvbW90ZWQgYW55bW9yZSBhcyBhIGZlYXR1cmUuCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfQUdHUkVHQVRFX1RPX0JVTEtTRVQgPSAiYnVsa3NldCI7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgaW4gdGhlIHByb3RvY29sIGFzIHNpZGUtZWZmZWN0IHJldHJpZXZhbCBhZnRlcgotICAgICAqIHRyYXZlcnNhbCBpdGVyYXRpb24gaXMgbm90IGJlaW5nIHByb21vdGVkIGFueW1vcmUgYXMgYSBmZWF0dXJlLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX0FHR1JFR0FURV9UT19MSVNUID0gImxpc3QiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkIGluIHRoZSBwcm90b2NvbCBhcyBzaWRlLWVmZmVjdCByZXRyaWV2YWwgYWZ0ZXIKLSAgICAgKiB0cmF2ZXJzYWwgaXRlcmF0aW9uIGlzIG5vdCBiZWluZyBwcm9tb3RlZCBhbnltb3JlIGFzIGEgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9BR0dSRUdBVEVfVE9fTUFQID0gIm1hcCI7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgaW4gdGhlIHByb3RvY29sIGFzIHNpZGUtZWZmZWN0IHJldHJpZXZhbCBhZnRlcgotICAgICAqIHRyYXZlcnNhbCBpdGVyYXRpb24gaXMgbm90IGJlaW5nIHByb21vdGVkIGFueW1vcmUgYXMgYSBmZWF0dXJlLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX0FHR1JFR0FURV9UT19OT05FID0gIm5vbmUiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkIGluIHRoZSBwcm90b2NvbCBhcyBzaWRlLWVmZmVjdCByZXRyaWV2YWwgYWZ0ZXIKLSAgICAgKiB0cmF2ZXJzYWwgaXRlcmF0aW9uIGlzIG5vdCBiZWluZyBwcm9tb3RlZCBhbnltb3JlIGFzIGEgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9BR0dSRUdBVEVfVE9fU0VUID0gInNldCI7Ci0KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfVFJBVkVSU0FMX1NPVVJDRV9BTElBUyA9ICJnIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19BVFRSSUJVVEVfRVhDRVBUSU9OUyA9ICJleGNlcHRpb25zIjsKZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvaGFuZGxlci9OaW9HcmVtbGluUmVxdWVzdEVuY29kZXIuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvaGFuZGxlci9OaW9HcmVtbGluUmVxdWVzdEVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzMGE3ZS4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL2hhbmRsZXIvTmlvR3JlbWxpblJlcXVlc3RFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLk1lc3NhZ2VTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLmV4Y2VwdGlvbi5SZXNwb25zZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVzcG9uc2VTdGF0dXNDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5NZXNzYWdlVGV4dFNlcmlhbGl6ZXI7Ci1pbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7Ci1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlcjsKLWltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKLWltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLk1lc3NhZ2VUb0J5dGVFbmNvZGVyOwotaW1wb3J0IGlvLm5ldHR5LnV0aWwuQ2hhcnNldFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2ltcGxlLldlYlNvY2tldENsaWVudDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjEwLCBub3QgcmVwbGFjZWQsIHVzZSB7QGxpbmsgV2ViU29ja2V0Q2xpZW50fS4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBmaW5hbCBjbGFzcyBOaW9HcmVtbGluUmVxdWVzdEVuY29kZXIgZXh0ZW5kcyBNZXNzYWdlVG9CeXRlRW5jb2RlcjxPYmplY3Q+IHsKLSAgICBwcml2YXRlIGJvb2xlYW4gYmluYXJ5RW5jb2RpbmcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKLQotICAgIHB1YmxpYyBOaW9HcmVtbGluUmVxdWVzdEVuY29kZXIoZmluYWwgYm9vbGVhbiBiaW5hcnlFbmNvZGluZywgZmluYWwgTWVzc2FnZVNlcmlhbGl6ZXIgc2VyaWFsaXplcikgewotICAgICAgICB0aGlzLmJpbmFyeUVuY29kaW5nID0gYmluYXJ5RW5jb2Rpbmc7Ci0gICAgICAgIHRoaXMuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZW5jb2RlKGZpbmFsIENoYW5uZWxIYW5kbGVyQ29udGV4dCBjaGFubmVsSGFuZGxlckNvbnRleHQsIGZpbmFsIE9iamVjdCBtc2csIGZpbmFsIEJ5dGVCdWYgYnl0ZUJ1ZikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIHJlcXVlc3RNZXNzYWdlID0gKFJlcXVlc3RNZXNzYWdlKSBtc2c7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYmluYXJ5RW5jb2RpbmcpIHsKLSAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBzZXJpYWxpemVkIG1lc3NhZ2UvcGF5bG9hZCBpbnNpZGUgb2YgYSAiZnJhbWUiLiAgdGhpcyB3b3JrcyBhcm91bmQgdGhlIHByb2JsZW0gd2hlcmUKLSAgICAgICAgICAgICAgICAvLyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkIGlzIG5vdCBlbmNvZGVkIGludG8gdGhlIGdlbmVyYWwgcHJvdG9jb2wuICB0aGF0IGxlbmd0aCBpc24ndCBuZWVkZWQKLSAgICAgICAgICAgICAgICAvLyBmb3Igd2Vic29ja2V0cyBiZWNhdXNlIHVuZGVyIHRoYXQgcHJvdG9jb2wsIHRoZSBtZXNzYWdlIGlzIHdyYXBwZWQgaW4gYSAid2Vic29ja2V0IGZyYW1lIi4gdGhpcwotICAgICAgICAgICAgICAgIC8vIGlzIG5vdCB0aGUgb3B0aW1hbCB3YXkgdG8gZGVhbCB3aXRoIHRoaXMgcmVhbGx5LCBidXQgaXQgZG9lcyBwcmV2ZW50IGEgcHJvdG9jb2wgY2hhbmdlIGluIHRoaXMKLSAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgbW9tZW50IHRyeWluZyB0byBnZXQgdGhlIE5pb0NoYW5uZWxpemVyIHdvcmtpbmcuCi0gICAgICAgICAgICAgICAgZmluYWwgQnl0ZUJ1ZiBieXRlcyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplUmVxdWVzdEFzQmluYXJ5KHJlcXVlc3RNZXNzYWdlLCBjaGFubmVsSGFuZGxlckNvbnRleHQuYWxsb2MoKSk7Ci0gICAgICAgICAgICAgICAgYnl0ZUJ1Zi53cml0ZUludChieXRlcy5jYXBhY2l0eSgpKTsKLSAgICAgICAgICAgICAgICBieXRlQnVmLndyaXRlQnl0ZXMoYnl0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlVGV4dFNlcmlhbGl6ZXIgdGV4dFNlcmlhbGl6ZXIgPSAoTWVzc2FnZVRleHRTZXJpYWxpemVyKSBzZXJpYWxpemVyOwotICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGUgW10gYnl0ZXMgPSB0ZXh0U2VyaWFsaXplci5zZXJpYWxpemVSZXF1ZXN0QXNTdHJpbmcocmVxdWVzdE1lc3NhZ2UpLmdldEJ5dGVzKENoYXJzZXRVdGlsLlVURl84KTsKLSAgICAgICAgICAgICAgICBieXRlQnVmLndyaXRlSW50KGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnl0ZUJ1Zi53cml0ZUJ5dGVzKGJ5dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VFeGNlcHRpb24oUmVzcG9uc2VTdGF0dXNDb2RlLlJFUVVFU1RfRVJST1JfU0VSSUFMSVpBVElPTiwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBzZXJpYWxpemF0aW9uIG9mIHRoaXMgcmVxdWVzdCBbJXNdIC0gaXQgY291bGQgbm90IGJlIHNlbnQgdG8gdGhlIHNlcnZlciAtIFJlYXNvbjogJXMiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWVzc2FnZSwgZXgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvaGFuZGxlci9OaW9HcmVtbGluUmVzcG9uc2VEZWNvZGVyLmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL2hhbmRsZXIvTmlvR3JlbWxpblJlc3BvbnNlRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWUzYTFjLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvaGFuZGxlci9OaW9HcmVtbGluUmVzcG9uc2VEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuaGFuZGxlcjsKLQotaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuUmVwbGF5aW5nRGVjb2RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5NZXNzYWdlU2VyaWFsaXplcjsKLWltcG9ydCBpby5uZXR0eS5idWZmZXIuQnl0ZUJ1ZjsKLWltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zaW1wbGUuV2ViU29ja2V0Q2xpZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQotICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuMTAsIG5vdCByZXBsYWNlZCwgdXNlIHtAbGluayBXZWJTb2NrZXRDbGllbnR9LgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGZpbmFsIGNsYXNzIE5pb0dyZW1saW5SZXNwb25zZURlY29kZXIgZXh0ZW5kcyBSZXBsYXlpbmdEZWNvZGVyPE5pb0dyZW1saW5SZXNwb25zZURlY29kZXIuRGVjb2RlclN0YXRlPiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBzZXJpYWxpemVyOwotICAgIHByaXZhdGUgaW50IG1lc3NhZ2VMZW5ndGg7Ci0KLSAgICBwdWJsaWMgTmlvR3JlbWxpblJlc3BvbnNlRGVjb2RlcihmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBzZXJpYWxpemVyKSB7Ci0gICAgICAgIHN1cGVyKERlY29kZXJTdGF0ZS5NRVNTQUdFX0xFTkdUSCk7Ci0gICAgICAgIHRoaXMuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlKGZpbmFsIENoYW5uZWxIYW5kbGVyQ29udGV4dCBjaGFubmVsSGFuZGxlckNvbnRleHQsIGZpbmFsIEJ5dGVCdWYgYnl0ZUJ1ZiwgZmluYWwgTGlzdDxPYmplY3Q+IG9iamVjdHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzd2l0Y2ggKHN0YXRlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUxlbmd0aCA9IGJ5dGVCdWYucmVhZEludCgpOwotICAgICAgICAgICAgICAgIGNoZWNrcG9pbnQoRGVjb2RlclN0YXRlLk1FU1NBR0UpOwotICAgICAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWYgbWVzc2FnZUZyYW1lID0gYnl0ZUJ1Zi5yZWFkQnl0ZXMobWVzc2FnZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoc2VyaWFsaXplci5kZXNlcmlhbGl6ZVJlc3BvbnNlKG1lc3NhZ2VGcmFtZSkpOwotICAgICAgICAgICAgICAgIGNoZWNrcG9pbnQoRGVjb2RlclN0YXRlLk1FU1NBR0VfTEVOR1RIKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBHcmVtbGluIFNlcnZlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGVudW0gRGVjb2RlclN0YXRlIHsKLSAgICAgICAgTUVTU0FHRV9MRU5HVEgsCi0gICAgICAgIE1FU1NBR0UKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL21lc3NhZ2UvUmVzcG9uc2VTdGF0dXNDb2RlLmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL21lc3NhZ2UvUmVzcG9uc2VTdGF0dXNDb2RlLmphdmEKaW5kZXggYzgzNDkzYS4uOWRhZWU5NiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9tZXNzYWdlL1Jlc3BvbnNlU3RhdHVzQ29kZS5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvbWVzc2FnZS9SZXNwb25zZVN0YXR1c0NvZGUuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAqIFRoZSByZXF1ZXN0IHN1Ym1pdHRlZCBmb3IgcHJvY2Vzc2luZyBldmFsdWF0ZWQgYnkgdGhlIHNlcnZlciB3aXRoIGVycm9ycyBhbmQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4KICAgICAgKiBDaGVjayB0aGUgc2NyaXB0IG9yIHJlbW90ZSB0cmF2ZXJzYWwgc3VibWl0dGVkIGZvciBlcnJvcnMgb3Igb3RoZXIgcHJvYmxlbXMgYW5kIHRoZW4gcmVzdWJtaXQuCiAgICAgICovCi0gICAgU0VSVkVSX0VSUk9SX1NDUklQVF9FVkFMVUFUSU9OKDU5NyksCisgICAgU0VSVkVSX0VSUk9SX0VWQUxVQVRJT04oNTk3KSwKIAogICAgIC8qKgogICAgICAqIFRoZSBzZXJ2ZXIgZXhjZWVkZWQgb25lIG9mIHRoZSB0aW1lb3V0IHNldHRpbmdzIGZvciB0aGUgcmVxdWVzdCBhbmQgY291bGQgdGhlcmVmb3JlIG9ubHkgcGFydGlhbGx5IHJlc3BvbmRlZApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvRHJpdmVyUmVtb3RlQ29ubmVjdGlvbi5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvRHJpdmVyUmVtb3RlQ29ubmVjdGlvbi5qYXZhCmluZGV4IDExNGM1OTYuLjlhZmEzMzAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0RyaXZlclJlbW90ZUNvbm5lY3Rpb24uamF2YQorKysgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVDb25uZWN0aW9uLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5yZW1vdGU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNsaWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlJlcXVlc3RPcHRpb25zOwpAQCAtMzgsNyArMzgsNiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlRva2Vucy5BUkdTX0JBVENIX1NJWkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlRva2Vucy5BUkdTX1NDUklQVF9FVkFMX1RJTUVPVVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlRva2Vucy5BUkdTX0VWQUxfVElNRU9VVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuVG9rZW5zLkFSR1NfVVNFUl9BR0VOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuVG9rZW5zLlJFUVVFU1RfSUQ7CkBAIC0yMzYsOCArMjM1LDYgQEAKICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBvcHRpb25zID0gb3B0aW9uc1N0cmF0ZWd5LmdldE9wdGlvbnMoKTsKICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRhaW5zS2V5KEFSR1NfRVZBTF9USU1FT1VUKSkKICAgICAgICAgICAgICAgICBidWlsZGVyLnRpbWVvdXQoKGxvbmcpIG9wdGlvbnMuZ2V0KEFSR1NfRVZBTF9USU1FT1VUKSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250YWluc0tleShBUkdTX1NDUklQVF9FVkFMX1RJTUVPVVQpKQotICAgICAgICAgICAgICAgIGJ1aWxkZXIudGltZW91dCgobG9uZykgb3B0aW9ucy5nZXQoQVJHU19TQ1JJUFRfRVZBTF9USU1FT1VUKSk7CiAgICAgICAgICAgICBpZiAob3B0aW9ucy5jb250YWluc0tleShSRVFVRVNUX0lEKSkKICAgICAgICAgICAgICAgICBidWlsZGVyLm92ZXJyaWRlUmVxdWVzdElkKChVVUlEKSBvcHRpb25zLmdldChSRVFVRVNUX0lEKSk7CiAgICAgICAgICAgICBpZiAob3B0aW9ucy5jb250YWluc0tleShBUkdTX0JBVENIX1NJWkUpKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvRHJpdmVyUmVtb3RlVHJhdmVyc2FsLmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVUcmF2ZXJzYWwuamF2YQppbmRleCBlNDdiMDdiLi41NGU3Y2M4IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVUcmF2ZXJzYWwuamF2YQorKysgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVUcmF2ZXJzYWwuamF2YQpAQCAtMTgsMTcgKzE4LDE1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIucmVtb3RlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5DbGllbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuUmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5BYnN0cmFjdFJlbW90ZVRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5SZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0czsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5SZW1vdGVUcmF2ZXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS50cmF2ZXJzYWwuc3RlcC5tYXAuUmVtb3RlU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnRyYXZlcnNlci51dGlsLkVtcHR5VHJhdmVyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7CkBAIC01Myw3ICs1MSw2IEBACiAKICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFRyYXZlcnNlci5BZG1pbjxFPj4gdHJhdmVyc2VyczsKICAgICBwcml2YXRlIFRyYXZlcnNlci5BZG1pbjxFPiBsYXN0VHJhdmVyc2VyID0gRW1wdHlUcmF2ZXJzZXIuaW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzOwogCiAgICAgcHVibGljIERyaXZlclJlbW90ZVRyYXZlcnNhbChmaW5hbCBSZXN1bHRTZXQgcnMsIGZpbmFsIENsaWVudCBjbGllbnQsIGZpbmFsIGJvb2xlYW4gYXR0YWNoLCBmaW5hbCBPcHRpb25hbDxDb25maWd1cmF0aW9uPiBjb25mKSB7CiAgICAgICAgIC8vIGF0dGFjaGluZyBpcyByZWFsbHkganVzdCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gaXQgZG9lc24ndCBtYWtlIHNlbnNlIGluIGFueSByZWFsLXdvcmxkIHNjZW5hcmlvIGFzIGl0IHdvdWxkCkBAIC02NiwyMyArNjMsNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhpcy50cmF2ZXJzZXJzID0gbmV3IFRyYXZlcnNlckl0ZXJhdG9yPD4ocnMuaXRlcmF0b3IoKSk7CiAgICAgICAgIH0KLQotICAgICAgICB0aGlzLnNpZGVFZmZlY3RzID0gbmV3IERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKGNsaWVudCxycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHNpZGUtZWZmZWN0IGZyb20gdGhlIHNlcnZlci4gRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgcHJpb3IgdG8gY29tcGxldGluZyB0aGUgaXRlcmF0aW9uIG9mIHRoZQotICAgICAqIHtAbGluayBEcml2ZXJSZW1vdGVUcmF2ZXJzYWx9IHRoYXQgc3Bhd25lZCB0aGlzIGFzIHRoZSBzaWRlLWVmZmVjdCB3aWxsIG5vdCBiZSByZWFkeS4gR2VuZXJhbGx5Ci0gICAgICogc3BlYWtpbmcsIHRoZSBjb21tb24gdXNlciB3b3VsZCBub3QgZ2V0IHNpZGUtZWZmZWN0cyB0aGlzIHdheSAtIHRoZXkgd291bGQgdXNlIGEgY2FsbCB0byB7QGNvZGUgY2FwKCl9LgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgYXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkLCBzZWUge0BsaW5rIEFkbWluI2dldFNpZGVFZmZlY3RzKCl9IGZvciBtb3JlIGluZm9ybWF0aW9uLAotICAgICAqIGJ1dCBmdXJ0aGVyIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBub3QgYmVpbmcgcmVtb3ZlZCwgYnV0IHdpbGwgbm90IGJlIGZ1bmN0aW9uYWwgZm9yIHJlbW90ZSBleGVjdXRpb24uIFByZWZlcgotICAgICAqIHtAbGluayBHcmFwaFRyYXZlcnNhbCNjYXAoU3RyaW5nLCBTdHJpbmcuLi4pfSB0byBnZXQgc2lkZS1lZmZlY3RzIGFzIHBhcnQgb2YgdHJhdmVyc2FsIGl0ZXJhdGlvbi4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyBnZXRTaWRlRWZmZWN0cygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2lkZUVmZmVjdHM7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMTcsMTcgKzk3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJlbGVhc2VzIHNlcnZlci1zaWRlIHJlc291cmNlcyByZWxhdGVkIHRvIHRoaXMgdHJhdmVyc2FsIChpLmUuIGNsZWFyaW5nIHRoZSBzaWRlLWVmZmVjdCBjYWNoZSBvZiBkYXRhIHJlbGF0ZWQgdG8KLSAgICAgKiB0aGlzIHRyYXZlcnNhbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzaWRlRWZmZWN0cy5jbG9zZSgpOwotCi0gICAgICAgIC8vIGxlYXZlIHRoZSBjbGllbnQgb3BlbiBhcyBpdCBpcyBvd25lZCBieSB0aGUgRHJpdmVyUmVtb3RlQ29ubmVjdGlvbiBub3QgdGhlIHRyYXZlcnNhbCBvciBzaWRlLWVmZmVjdHMKLSAgICB9Ci0KICAgICBzdGF0aWMgY2xhc3MgVHJhdmVyc2VySXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxUcmF2ZXJzZXIuQWRtaW48RT4+IHsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFJlc3VsdD4gaW5uZXI7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvRHJpdmVyUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmNTRmMy4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuZXhjZXB0aW9uLkV4Y2VwdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5Ib3N0OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5SZXN1bHRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuVG9rZW5zOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS50cmF2ZXJzYWwuQWJzdHJhY3RSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0czsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNpZGVFZmZlY3RzOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKLQotLyoqCi0gKiBKYXZhIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVHJhdmVyc2FsU2lkZUVmZmVjdHN9LiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQgc2FmZS4KLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCi0gKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQsIHByZWZlciB1c2Ugb2Yge0BsaW5rIEdyYXBoVHJhdmVyc2FsI2NhcChTdHJpbmcsIFN0cmluZy4uLil9Ci0gKiB0byByZXR1cm4gdGhlIHJlc3VsdCBhcyBwYXJ0IG9mIHRoZSB0cmF2ZXJzYWwgaXRlcmF0aW9uLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudCBjbGllbnQ7Ci0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBrZXlzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICBwcml2YXRlIGZpbmFsIFVVSUQgc2VydmVyU2lkZUVmZmVjdDsKLSAgICBwcml2YXRlIGZpbmFsIEhvc3QgaG9zdDsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBzaWRlRWZmZWN0cyA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmV0cmlldmVkQWxsS2V5cyA9IGZhbHNlOwotICAgIHByaXZhdGUgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gcmVhZHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxNYXA8U3RyaW5nLE9iamVjdD4+IHN0YXR1c0F0dHJpYnV0ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuNC4wLCByZXBsYWNlZCBieSB7QGxpbmsgI0RyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKENsaWVudCwgUmVzdWx0U2V0KX0KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhmaW5hbCBDbGllbnQgY2xpZW50LCBmaW5hbCBVVUlEIHNlcnZlclNpZGVFZmZlY3QsIGZpbmFsIEhvc3QgaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gcmVhZHkpIHsKLSAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7Ci0gICAgICAgIHRoaXMuc2VydmVyU2lkZUVmZmVjdCA9IHNlcnZlclNpZGVFZmZlY3Q7Ci0gICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7Ci0gICAgICAgIHRoaXMucmVhZHkgPSByZWFkeTsKLSAgICAgICAgdGhpcy5zdGF0dXNBdHRyaWJ1dGVzID0gQ29tcGxldGFibGVGdXR1cmUuY29tcGxldGVkRnV0dXJlKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhmaW5hbCBDbGllbnQgY2xpZW50LCBmaW5hbCBSZXN1bHRTZXQgcnMpIHsKLSAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7Ci0gICAgICAgIHRoaXMuc2VydmVyU2lkZUVmZmVjdCA9IHJzLmdldE9yaWdpbmFsUmVxdWVzdE1lc3NhZ2UoKS5nZXRSZXF1ZXN0SWQoKTsKLSAgICAgICAgdGhpcy5ob3N0ID0gcnMuZ2V0SG9zdCgpOwotICAgICAgICB0aGlzLnJlYWR5ID0gcnMuYWxsSXRlbXNBdmFpbGFibGVBc3luYygpOwotICAgICAgICB0aGlzLnN0YXR1c0F0dHJpYnV0ZXMgPSBycy5zdGF0dXNBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3RhdHVzIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIGFsbCByZXN1bHRzIGhhdmUKLSAgICAgKiBiZWVuIHJldHJpZXZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZyxPYmplY3Q+IHN0YXR1c0F0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIC8vIHdhaXQgZm9yIHRoZSByZWFkIHRvIGNvbXBsZXRlIChpLmUuIGl0ZXJhdGlvbiBvbiB0aGUgc2VydmVyKSBiZWZvcmUgYWxsb3dpbmcgdGhlIGNhbGxlciB0byBnZXQgdGhlCi0gICAgICAgIC8vIGF0dHJpYnV0ZS4gc2ltcGx5IGZvbGxvd2luZyB0aGUgcGF0dGVybiBmcm9tIG90aGVyIG1ldGhvZHMgaGVyZSBmb3Igbm93LgotICAgICAgICByZXR1cm4gc3RhdHVzQXR0cmlidXRlcy5qb2luKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBWIGdldChmaW5hbCBTdHJpbmcga2V5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHJlYWQgdG8gY29tcGxldGUgKGkuZS4gaXRlcmF0aW9uIG9uIHRoZSBzZXJ2ZXIpIGJlZm9yZSBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIGdldCB0aGUKLSAgICAgICAgLy8gc2lkZS1lZmZlY3QuIGNhbGxpbmcgcHJpb3IgdG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgc2lkZS1lZmZlY3Qgbm90IGJlaW5nIGZvdW5kLiBvZiBjb3Vyc2UsIHRoZQotICAgICAgICAvLyBiYWQgcGFydCBoZXJlIGlzIHRoYXQgdGhlIG1ldGhvZCBibG9ja3MgaW5kZWZpbml0ZWx5IHdhaXRpbmcgZm9yIHRoZSByZXN1bHQsIGJ1dCBpdCBwcmV2ZW50cyB0aGUKLSAgICAgICAgLy8gdGVzdCBmYWlsdXJlIHByb2JsZW1zIHRoYXQgaGFwcGVuIG9uIHNsb3dlciBzeXN0ZW1zLiBpbiBwcmFjdGljZSwgaXQncyB1bmxpa2VseSB0aGF0IGEgdXNlciB3b3VsZAotICAgICAgICAvLyB0cnkgdG8gZ2V0IGEgc2lkZS1lZmZlY3QgcHJpb3IgdG8gaXRlcmF0aW9uLCBidXQgc2luY2UgdGhlIEFQSSBhbGxvd3MgaXQsIHRoaXMgYXQgbGVhc3QgcHJldmVudHMKLSAgICAgICAgLy8gdGhlIGVycm9yLgotICAgICAgICByZWFkeS5qb2luKCk7Ci0KLSAgICAgICAgaWYgKCFrZXlzKCkuY29udGFpbnMoa2V5KSkgdGhyb3cgVHJhdmVyc2FsU2lkZUVmZmVjdHMuRXhjZXB0aW9ucy5zaWRlRWZmZWN0S2V5RG9lc05vdEV4aXN0KGtleSk7Ci0KLSAgICAgICAgaWYgKCFzaWRlRWZmZWN0cy5jb250YWluc0tleShrZXkpKSB7Ci0KLSAgICAgICAgICAgIGlmIChjbG9zZWQpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRyYXZlcnNhbCBoYXMgYmVlbiBjbG9zZWQgLSBubyBuZXcgc2lkZS1lZmZlY3RzIGNhbiBiZSByZXRyaWV2ZWQiKTsKLQotICAgICAgICAgICAgLy8gc3BlY2lmeSB0aGUgQVJHU19IT1NUIHNvIHRoYXQgdGhlIExvYWRCYWxhbmNpbmdTdHJhdGVneSBpcyBzdWJ2ZXJ0ZWQgYW5kIHRoZSBjb25uZWN0aW9uIGlzIGZvcmNlZAotICAgICAgICAgICAgLy8gZnJvbSB0aGUgc3BlY2lmaWVkIGhvc3QgKGkuZS4gdGhlIGhvc3QgZnJvbSB0aGUgcHJldmlvdXMgcmVxdWVzdCBhcyB0aGF0IGhvc3Qgd2lsbCBob2xkIHRoZSBzaWRlLWVmZmVjdHMpCi0gICAgICAgICAgICBmaW5hbCBSZXF1ZXN0TWVzc2FnZSBtc2cgPSBSZXF1ZXN0TWVzc2FnZS5idWlsZChUb2tlbnMuT1BTX0dBVEhFUikKLSAgICAgICAgICAgICAgICAgICAgLmFkZEFyZyhUb2tlbnMuQVJHU19TSURFX0VGRkVDVCwgc2VydmVyU2lkZUVmZmVjdCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEFyZyhUb2tlbnMuQVJHU19TSURFX0VGRkVDVF9LRVksIGtleSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEFyZyhUb2tlbnMuQVJHU19IT1NULCBob3N0KQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc29yKCJ0cmF2ZXJzYWwiKS5jcmVhdGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzdWx0IHJlc3VsdCA9IGNsaWVudC5zdWJtaXRBc3luYyhtc2cpLmdldCgpLmFsbCgpLmdldCgpLmdldCgwKTsKLSAgICAgICAgICAgICAgICBzaWRlRWZmZWN0cy5wdXQoa2V5LCBudWxsID09IHJlc3VsdCA/IG51bGwgOiByZXN1bHQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgdXNlIHRvIHRyeSB0byBjYXRjaCAibm8gZm91bmQiIHNpdHVhdGlvbnMgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIGhlcmUgYW5kIHRoZW4gbnVsbCB0aGUKLSAgICAgICAgICAgICAgICAvLyBzaWRlLWVmZmVjdCBmb3IgdGhlIHJlcXVlc3RlZCBrZXkuIGRvZXNuJ3Qgc2VlbSBsaWtlIHRoZXJlIGlzIGEgbmVlZCBmb3IgdGhhdCBub3cgYmVjYXVzZSBjYWxscwotICAgICAgICAgICAgICAgIC8vIHRvIGdldCgpIG5vdyBpbml0aWFsbHkgdHJpZ2dlciBhIGNhbGwgdGhlIGtleXMoKSBzbyB5b3Ugd291bGQga25vdyBhbGwgb2YgdGhlIGtleXMgYXZhaWxhYmxlIG9uCi0gICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZlciBhbmQgd291bGQgdmFsaWRhdGUgdGhlbSB1cCBmcm9udCB0aHJvd2luZyBzaWRlRWZmZWN0S2V5RG9lc05vdEV4aXN0KGtleSkgd2hpY2ggdGh1cwotICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VzIGJlaGF2aW9yIHNpbWlsYXIgdG8gdGhlIG5vbi1yZW1vdGUgc2lkZS1lZmZlY3QgaW1wbGVtZW50YXRpb25zLiBpZiB3ZSBnZXQgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLy8gaGVyZSBhdCB0aGlzIHBvaW50IHRoZW4gd2UgbGlrZWx5IGhhdmUgYSBsZWdpdCBlcnJvciBpbiBjb21tdW5pY2F0aW5nIHRvIHRoZSByZW1vdGUgc2VydmVyLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IHNpZGUtZWZmZWN0IGZvciAiICsgc2VydmVyU2lkZUVmZmVjdCArICIgd2l0aCBrZXkgb2YgIiArIGtleSwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChWKSBzaWRlRWZmZWN0cy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5cygpIHsKLSAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHJlYWQgdG8gY29tcGxldGUgKGkuZS4gaXRlcmF0aW9uIG9uIHRoZSBzZXJ2ZXIpIGJlZm9yZSBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIGdldCB0aGUKLSAgICAgICAgLy8gc2lkZS1lZmZlY3QuIGNhbGxpbmcgcHJpb3IgdG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgc2lkZS1lZmZlY3Qgbm90IGJlaW5nIGZvdW5kLiBvZiBjb3Vyc2UsIHRoZQotICAgICAgICAvLyBiYWQgcGFydCBoZXJlIGlzIHRoYXQgdGhlIG1ldGhvZCBibG9ja3MgaW5kZWZpbml0ZWx5IHdhaXRpbmcgZm9yIHRoZSByZXN1bHQsIGJ1dCBpdCBwcmV2ZW50cyB0aGUKLSAgICAgICAgLy8gdGVzdCBmYWlsdXJlIHByb2JsZW1zIHRoYXQgaGFwcGVuIG9uIHNsb3dlciBzeXN0ZW1zLiBpbiBwcmFjdGljZSwgaXQncyB1bmxpa2VseSB0aGF0IGEgdXNlciB3b3VsZAotICAgICAgICAvLyB0cnkgdG8gZ2V0IGEgc2lkZS1lZmZlY3QgcHJpb3IgdG8gaXRlcmF0aW9uLCBidXQgc2luY2UgdGhlIEFQSSBhbGxvd3MgaXQsIHRoaXMgYXQgbGVhc3QgcHJldmVudHMKLSAgICAgICAgLy8gdGhlIGVycm9yLgotICAgICAgICByZWFkeS5qb2luKCk7Ci0KLSAgICAgICAgaWYgKGNsb3NlZCAmJiAhcmV0cmlldmVkQWxsS2V5cykgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJhdmVyc2FsIGhhcyBiZWVuIGNsb3NlZCAtIHNpZGUtZWZmZWN0IGtleXMgY2Fubm90IGJlIHJldHJpZXZlZCIpOwotCi0gICAgICAgIGlmICghcmV0cmlldmVkQWxsS2V5cykgewotICAgICAgICAgICAgLy8gc3BlY2lmeSB0aGUgQVJHU19IT1NUIHNvIHRoYXQgdGhlIExvYWRCYWxhbmNpbmdTdHJhdGVneSBpcyBzdWJ2ZXJ0ZWQgYW5kIHRoZSBjb25uZWN0aW9uIGlzIGZvcmNlZAotICAgICAgICAgICAgLy8gZnJvbSB0aGUgc3BlY2lmaWVkIGhvc3QgKGkuZS4gdGhlIGhvc3QgZnJvbSB0aGUgcHJldmlvdXMgcmVxdWVzdCBhcyB0aGF0IGhvc3Qgd2lsbCBob2xkIHRoZSBzaWRlLWVmZmVjdHMpCi0gICAgICAgICAgICBmaW5hbCBSZXF1ZXN0TWVzc2FnZSBtc2cgPSBSZXF1ZXN0TWVzc2FnZS5idWlsZChUb2tlbnMuT1BTX0tFWVMpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRBcmcoVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1QsIHNlcnZlclNpZGVFZmZlY3QpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRBcmcoVG9rZW5zLkFSR1NfSE9TVCwgaG9zdCkKLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NvcigidHJhdmVyc2FsIikuY3JlYXRlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChrZXlzLmVxdWFscyhDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSkKLSAgICAgICAgICAgICAgICAgICAga2V5cyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICAgICAgICAgIGNsaWVudC5zdWJtaXRBc3luYyhtc2cpLmdldCgpLmFsbCgpLmdldCgpLmZvckVhY2gociAtPiBrZXlzLmFkZChyLmdldFN0cmluZygpKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gcmV0cmlldmUgYWxsIGtleXMgb25jZQotICAgICAgICAgICAgICAgIHJldHJpZXZlZEFsbEtleXMgPSB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoZXgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGtleXMiLCBudWxsID09IHJvb3QgPyBleCA6IHJvb3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGtleXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjbG9zZWQpIHsKLSAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIG1zZyA9IFJlcXVlc3RNZXNzYWdlLmJ1aWxkKFRva2Vucy5PUFNfQ0xPU0UpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRBcmcoVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1QsIHNlcnZlclNpZGVFZmZlY3QpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRBcmcoVG9rZW5zLkFSR1NfSE9TVCwgaG9zdCkKLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NvcigidHJhdmVyc2FsIikuY3JlYXRlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zdWJtaXRBc3luYyhtc2cpLmdldCgpOwotICAgICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgcm9vdCA9IEV4Y2VwdGlvblV0aWxzLmdldFJvb3RDYXVzZShleCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIG9uIGNsb3Npbmcgc2lkZSBlZmZlY3RzIiwgbnVsbCA9PSByb290ID8gZXggOiByb290KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8vIGhhdmUgdG8gb3ZlcnJpZGUgdGhlIGltcGxlbWVudGF0aW9uIGZyb20gVHJhdmVyc2FsU2lkZUVmZmVjdHMgYmVjYXVzZSBpdCByZWxpZXMgb24gY2FsbHMgdG8ga2V5cygpIGFzCi0gICAgICAgIC8vIGNhbGxpbmcgdGhhdCB0b28gZWFybHkgY2FuIGNhdXNlIHVuaW50ZW5kZWQgZmFpbHVyZXMgKGkuZS4gaW4gdGhlIGRlYnVnZ2VyLCB0b1N0cmluZygpIGdldHMgY2FsbGVkIHdoZW4KLSAgICAgICAgLy8gaW50cm9zcGVjdGluZyB0aGUgb2JqZWN0IGZyb20gdGhlIG1vbWVudCBvZiBjb25zdHJ1Y3Rpb24pLgotICAgICAgICByZXR1cm4gInNpZGVFZmZlY3RzW3NpemU6IiArIGtleXMuc2l6ZSgpICsgIl0iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL0dyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMS5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLmphdmEKaW5kZXggYmY0ZTc2Zi4uNDQxMjVlMSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLmphdmEKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLmphdmEKQEAgLTg0LDEzICs4NCwxMiBAQAogCiAgICAgICAgIGlmIChidWlsZGVyQ2xhc3NOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKGJ1aWxkZXJDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPD8+IGN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcigpOworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShidWlsZGVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjdG9yID0gY2xhenouZ2V0Q29uc3RydWN0b3IoKTsKICAgICAgICAgICAgICAgICBidWlsZGVyID0gKFR5cGVTZXJpYWxpemVyUmVnaXN0cnkuQnVpbGRlcikgY3Rvci5uZXdJbnN0YW5jZSgpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleCk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1aWxkZXIgPSBUeXBlU2VyaWFsaXplclJlZ2lzdHJ5LmJ1aWxkKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL1NlcmlhbGl6ZXJzLmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3Nlci9TZXJpYWxpemVycy5qYXZhCmluZGV4IDQ3YWY2NDcuLmMxY2YzMDUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL1NlcmlhbGl6ZXJzLmphdmEKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvU2VyaWFsaXplcnMuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQogICovCiBwdWJsaWMgZW51bSBTZXJpYWxpemVycyB7CisKICAgICAvKioKICAgICAgKiBHcmFwaFNPTiAzLjAuCiAgICAgICovCkBAIC01NiwyNCArNTcsNiBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IHNlcmlhbGl6ZXIgZm9yIHJlc3VsdHMgcmV0dXJuZWQgZnJvbSBHcmVtbGluIFNlcnZlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIG9mIHR5cGUKLSAgICAgKiB7QGxpbmsgTWVzc2FnZVRleHRTZXJpYWxpemVyfSBzbyB0aGF0IGl0IGNhbiBiZSBjb21wYXRpYmxlIHdpdGggdGV4dC1iYXNlZCB3ZWJzb2NrZXQgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy41LCBub3QgcmVwbGFjZWQsIHNpbXBseSBzcGVjaWZ5IHRoZSBleGFjdCB2ZXJzaW9uIG9mIHRoZSBzZXJpYWxpemVyIHRvIHVzZS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZVNlcmlhbGl6ZXIgREVGQVVMVF9SRVNVTFRfU0VSSUFMSVpFUiA9IG5ldyBHcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjFkMCgpOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBzZXJpYWxpemVyIGZvciByZXF1ZXN0cyByZWNlaXZlZCBieSBHcmVtbGluIFNlcnZlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIG9mIHR5cGUKLSAgICAgKiB7QGxpbmsgTWVzc2FnZVRleHRTZXJpYWxpemVyfSBzbyB0aGF0IGl0IGNhbiBiZSBjb21wYXRpYmxlIHdpdGggdGV4dC1iYXNlZCB3ZWJzb2NrZXQgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy41LCBub3QgcmVwbGFjZWQsIHNpbXBseSBzcGVjaWZ5IHRoZSBleGFjdCB2ZXJzaW9uIG9mIHRoZSBzZXJpYWxpemVyIHRvIHVzZS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZVNlcmlhbGl6ZXIgREVGQVVMVF9SRVFVRVNUX1NFUklBTElaRVIgPSBuZXcgR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYxZDAoKTsKLQogICAgIFNlcmlhbGl6ZXJzKGZpbmFsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICB0aGlzLnZhbHVlID0gbWltZVR5cGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zaW1wbGUvTmlvQ2xpZW50LmphdmEgYi9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3NpbXBsZS9OaW9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwNGIyMC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3NpbXBsZS9OaW9DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zaW1wbGU7Ci0KLWltcG9ydCBpby5uZXR0eS5idWZmZXIuUG9vbGVkQnl0ZUJ1ZkFsbG9jYXRvcjsKLWltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuTWVzc2FnZVNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuaGFuZGxlci5OaW9HcmVtbGluUmVxdWVzdEVuY29kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuaGFuZGxlci5OaW9HcmVtbGluUmVzcG9uc2VEZWNvZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgaW8ubmV0dHkuYm9vdHN0cmFwLkJvb3RzdHJhcDsKLWltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWw7Ci1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsUGlwZWxpbmU7Ci1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5zb2NrZXQuU29ja2V0Q2hhbm5lbDsKLWltcG9ydCBpby5uZXR0eS5jaGFubmVsLnNvY2tldC5uaW8uTmlvU29ja2V0Q2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi0vKioKLSAqIEEgc2ltcGxlLCBub24tdGhyZWFkIHNhZmUgR3JlbWxpbiBTZXJ2ZXIgY2xpZW50IHVzaW5nIE5JTy4gIFR5cGljYWwgdXNlIGlzIGZvciB0ZXN0aW5nIGFuZCBkZW1vbnN0cmF0aW9uLgotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjEwLCBub3QgcmVwbGFjZWQsIHVzZSB7QGxpbmsgV2ViU29ja2V0Q2xpZW50fS4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBOaW9DbGllbnQgZXh0ZW5kcyBBYnN0cmFjdENsaWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDaGFubmVsIGNoYW5uZWw7Ci0KLSAgICBwdWJsaWMgTmlvQ2xpZW50KCkgewotICAgICAgICB0aGlzKFVSSS5jcmVhdGUoImdzOi8vbG9jYWxob3N0OjgxODIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5pb0NsaWVudChmaW5hbCBVUkkgdXJpKSB7Ci0gICAgICAgIHN1cGVyKCJuaW8tY2xpZW50LSVkIik7Ci0gICAgICAgIGZpbmFsIEJvb3RzdHJhcCBiID0gbmV3IEJvb3RzdHJhcCgpLmdyb3VwKGdyb3VwKTsKLSAgICAgICAgYi5vcHRpb24oQ2hhbm5lbE9wdGlvbi5BTExPQ0FUT1IsIFBvb2xlZEJ5dGVCdWZBbGxvY2F0b3IuREVGQVVMVCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCgpOwotICAgICAgICAgICAgYi5jaGFubmVsKE5pb1NvY2tldENoYW5uZWwuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIC5oYW5kbGVyKG5ldyBDaGFubmVsSW5pdGlhbGl6ZXI8U29ja2V0Q2hhbm5lbD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRDaGFubmVsKGZpbmFsIFNvY2tldENoYW5uZWwgY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDaGFubmVsUGlwZWxpbmUgcCA9IGNoLnBpcGVsaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5hZGRMYXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5pb0dyZW1saW5SZXNwb25zZURlY29kZXIoc2VyaWFsaXplciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmlvR3JlbWxpblJlcXVlc3RFbmNvZGVyKHRydWUsIHNlcmlhbGl6ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tSZXNwb25zZUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgY2hhbm5lbCA9IGIuY29ubmVjdCh1cmkuZ2V0SG9zdCgpLCB1cmkuZ2V0UG9ydCgpKS5zeW5jKCkuY2hhbm5lbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQW5kRmx1c2goZmluYWwgUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdE1lc3NhZ2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjaGFubmVsLndyaXRlQW5kRmx1c2gocmVxdWVzdE1lc3NhZ2UpLmdldCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5uZWwuY2xvc2UoKS5nZXQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZ3JvdXAuc2h1dGRvd25HcmFjZWZ1bGx5KCkuYXdhaXRVbmludGVycnVwdGlibHkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2ltcGxlL1dlYlNvY2tldENsaWVudC5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zaW1wbGUvV2ViU29ja2V0Q2xpZW50LmphdmEKaW5kZXggMzk1MDMzOS4uYjFhNDdhNiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zaW1wbGUvV2ViU29ja2V0Q2xpZW50LmphdmEKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zaW1wbGUvV2ViU29ja2V0Q2xpZW50LmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBpby5uZXR0eS5idWZmZXIuUG9vbGVkQnl0ZUJ1ZkFsbG9jYXRvcjsKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxPcHRpb247CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkVtcHR5SHR0cEhlYWRlcnM7Ci1pbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBIZWFkZXJzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLk1lc3NhZ2VTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLmhhbmRsZXIuV2ViU29ja2V0Q2xpZW50SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5oYW5kbGVyLldlYlNvY2tldEdyZW1saW5SZXF1ZXN0RW5jb2RlcjsKQEAgLTM3LDcgKzM2LDcgQEAKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cE9iamVjdEFnZ3JlZ2F0b3I7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLndlYnNvY2tldHguV2ViU29ja2V0Q2xpZW50SGFuZHNoYWtlckZhY3Rvcnk7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLndlYnNvY2tldHguV2ViU29ja2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CkBAIC02OSw3ICs2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBXZWJTb2NrZXRDbGllbnRIYW5kbGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNvY2tldENsaWVudEhhbmRzaGFrZXJGYWN0b3J5Lm5ld0hhbmRzaGFrZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmksIFdlYlNvY2tldFZlcnNpb24uVjEzLCBudWxsLCBmYWxzZSwgRW1wdHlIdHRwSGVhZGVycy5JTlNUQU5DRSwgNjU1MzYpKTsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCgpOworICAgICAgICAgICAgZmluYWwgTWVzc2FnZVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBHcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEoKTsKICAgICAgICAgICAgIGIuY2hhbm5lbChOaW9Tb2NrZXRDaGFubmVsLmNsYXNzKQogICAgICAgICAgICAgICAgICAgICAuaGFuZGxlcihuZXcgQ2hhbm5lbEluaXRpYWxpemVyPFNvY2tldENoYW5uZWw+KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3V0aWwvUHJvZmlsaW5nQXBwbGljYXRpb24uamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvdXRpbC9Qcm9maWxpbmdBcHBsaWNhdGlvbi5qYXZhCmluZGV4IGIzZDIwZDcuLjM3NjY0NjAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvdXRpbC9Qcm9maWxpbmdBcHBsaWNhdGlvbi5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvdXRpbC9Qcm9maWxpbmdBcHBsaWNhdGlvbi5qYXZhCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgZmluYWwgaW50IHdvcmtlclBvb2xTaXplID0gSW50ZWdlci5wYXJzZUludChvcHRpb25zLmdldE9yRGVmYXVsdCgid29ya2VyUG9vbFNpemUiLCAiMiIpLnRvU3RyaW5nKCkpOwogICAgICAgICBmaW5hbCBpbnQgdG9vU2xvd1RocmVzaG9sZCA9IEludGVnZXIucGFyc2VJbnQob3B0aW9ucy5nZXRPckRlZmF1bHQoInRvb1Nsb3dUaHJlc2hvbGQiLCAiMTI1IikudG9TdHJpbmcoKSk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBjaGFubmVsaXplciA9IG9wdGlvbnMuZ2V0T3JEZWZhdWx0KCJjaGFubmVsaXplciIsIENoYW5uZWxpemVyLldlYlNvY2tldENoYW5uZWxpemVyLmNsYXNzLmdldE5hbWUoKSkudG9TdHJpbmcoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNlcmlhbGl6ZXIgPSBvcHRpb25zLmdldE9yRGVmYXVsdCgic2VyaWFsaXplciIsIFNlcmlhbGl6ZXJzLkdSWU9fVjFEMC5uYW1lKCkpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzZXJpYWxpemVyID0gb3B0aW9ucy5nZXRPckRlZmF1bHQoInNlcmlhbGl6ZXIiLCBTZXJpYWxpemVycy5HUkFQSEJJTkFSWV9WMUQwLm5hbWUoKSkudG9TdHJpbmcoKTsKIAogICAgICAgICBmaW5hbCBib29sZWFuIGV4ZXJjaXNlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4ob3B0aW9ucy5nZXRPckRlZmF1bHQoImV4ZXJjaXNlIiwgImZhbHNlIikudG9TdHJpbmcoKSk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHQgPSBvcHRpb25zLmdldE9yRGVmYXVsdCgic2NyaXB0IiwgIjErMSIpLnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NsdXN0ZXJCdWlsZGVyVGVzdC5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9DbHVzdGVyQnVpbGRlclRlc3QuamF2YQppbmRleCAwYmYzMTdkLi5lNDk0Mzk3IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NsdXN0ZXJCdWlsZGVyVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ2x1c3RlckJ1aWxkZXJUZXN0LmphdmEKQEAgLTUyLDggKzUyLDggQEAKICAgICAgICAgICAgICAgICB7Im1pbkNvbm5lY3Rpb25Qb29sU2l6ZUx0ZU1heCIsIENsdXN0ZXIuYnVpbGQoKS5taW5Db25uZWN0aW9uUG9vbFNpemUoMTAwKS5tYXhDb25uZWN0aW9uUG9vbFNpemUoOTkpLCAibWF4Q29ubmVjdGlvblBvb2xTaXplIGNhbm5vdCBiZSBsZXNzIHRoYW4gbWluQ29ubmVjdGlvblBvb2xTaXplIn0sCiAgICAgICAgICAgICAgICAgeyJtaW5Db25uZWN0aW9uUG9vbFNpemVMdGVNYXgiLCBDbHVzdGVyLmJ1aWxkKCkubWluQ29ubmVjdGlvblBvb2xTaXplKDEwMCkubWF4Q29ubmVjdGlvblBvb2xTaXplKDk5KSwgIm1heENvbm5lY3Rpb25Qb29sU2l6ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIG1pbkNvbm5lY3Rpb25Qb29sU2l6ZSJ9LAogICAgICAgICAgICAgICAgIHsibWF4Q29ubmVjdGlvblBvb2xTaXplMCIsIENsdXN0ZXIuYnVpbGQoKS5tYXhXYWl0Rm9yQ29ubmVjdGlvbigwKSwgIm1heFdhaXRGb3JDb25uZWN0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8ifSwKLSAgICAgICAgICAgICAgICB7Im1heFdhaXRGb3JTZXNzaW9uQ2xvc2UwIiwgQ2x1c3Rlci5idWlsZCgpLm1heFdhaXRGb3JTZXNzaW9uQ2xvc2UoMCksICJtYXhXYWl0Rm9yU2Vzc2lvbkNsb3NlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8ifSwKLSAgICAgICAgICAgICAgICB7Im1heFdhaXRGb3JTZXNzaW9uQ2xvc2VOZWcxIiwgQ2x1c3Rlci5idWlsZCgpLm1heFdhaXRGb3JTZXNzaW9uQ2xvc2UoLTEpLCAibWF4V2FpdEZvclNlc3Npb25DbG9zZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIn0sCisgICAgICAgICAgICAgICAgeyJtYXhXYWl0Rm9yQ2xvc2UwIiwgQ2x1c3Rlci5idWlsZCgpLm1heFdhaXRGb3JDbG9zZSgwKSwgIm1heFdhaXRGb3JDbG9zZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIn0sCisgICAgICAgICAgICAgICAgeyJtYXhXYWl0Rm9yQ2xvc2VOZWcxIiwgQ2x1c3Rlci5idWlsZCgpLm1heFdhaXRGb3JDbG9zZSgtMSksICJtYXhXYWl0Rm9yQ2xvc2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyJ9LAogICAgICAgICAgICAgICAgIHsibWF4Q29udGVudExlbmd0aDAiLCBDbHVzdGVyLmJ1aWxkKCkubWF4Q29udGVudExlbmd0aCgwKSwgIm1heENvbnRlbnRMZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyJ9LAogICAgICAgICAgICAgICAgIHsibWF4Q29udGVudExlbmd0aE5lZzEiLCBDbHVzdGVyLmJ1aWxkKCkubWF4Q29udGVudExlbmd0aCgtMSksICJtYXhDb250ZW50TGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8ifSwKICAgICAgICAgICAgICAgICB7InJlY29ubmVjdEludGVydmFsMCIsIENsdXN0ZXIuYnVpbGQoKS5yZWNvbm5lY3RJbnRlcnZhbCgwKSwgInJlY29ubmVjdEludGVydmFsIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8ifSwKZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvTW9ja2l0b0hhbWNyZXN0TWF0Y2hlckFkYXB0ZXIuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvTW9ja2l0b0hhbWNyZXN0TWF0Y2hlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTJkOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9Nb2NraXRvSGFtY3Jlc3RNYXRjaGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlcjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5CYXNlTWF0Y2hlcjsKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVyOworaW1wb3J0IG9yZy5tb2NraXRvLmludGVybmFsLm1hdGNoZXJzLmFwYWNoZWNvbW1vbnMuUmVmbGVjdGlvbkVxdWFsczsKKworLyoqCisgKiBBZGFwdHMgYSBNb2NraXRvIHtAY29kZSBBcmd1bWVudE1hdGNoZXJ9IHRvIGEgSGFtY3Jlc3Qge0Bjb2RlIE1hdGNoZXJ9IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgSGFtY3Jlc3QKKyAqIHtAY29kZSBhc3NlcnRUaGF0fS4KKyAqLworcHVibGljIGNsYXNzIE1vY2tpdG9IYW1jcmVzdE1hdGNoZXJBZGFwdGVyIGV4dGVuZHMgQmFzZU1hdGNoZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBBcmd1bWVudE1hdGNoZXI8T2JqZWN0PiBtb2NraXRvTWF0Y2hlcjsKKworICAgIHB1YmxpYyBNb2NraXRvSGFtY3Jlc3RNYXRjaGVyQWRhcHRlcihmaW5hbCBBcmd1bWVudE1hdGNoZXI8T2JqZWN0PiBtb2NraXRvTWF0Y2hlcikgeworICAgICAgICB0aGlzLm1vY2tpdG9NYXRjaGVyID0gbW9ja2l0b01hdGNoZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNb2NraXRvSGFtY3Jlc3RNYXRjaGVyQWRhcHRlciByZWZsZWN0aW9uRXF1YWxzKGZpbmFsIE9iamVjdCB3YW50ZWQsIGZpbmFsIFN0cmluZy4uLiBleGNsdWRlRmllbGRzKSB7CisgICAgICAgIHJldHVybiBuZXcgTW9ja2l0b0hhbWNyZXN0TWF0Y2hlckFkYXB0ZXIobmV3IFJlZmxlY3Rpb25FcXVhbHMod2FudGVkLCBleGNsdWRlRmllbGRzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICByZXR1cm4gbW9ja2l0b01hdGNoZXIubWF0Y2hlcyhvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXNjcmliZVRvKGZpbmFsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZFZhbHVlKG1vY2tpdG9NYXRjaGVyLnRvU3RyaW5nKCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1Jlc3VsdFF1ZXVlVGVzdC5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9SZXN1bHRRdWV1ZVRlc3QuamF2YQppbmRleCA3NWFmYjc0Li40Y2E0NjY0IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1Jlc3VsdFF1ZXVlVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvUmVzdWx0UXVldWVUZXN0LmphdmEKQEAgLTE5LDE2ICsxOSwxMiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5leGNlcHRpb24uRXhjZXB0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS50cmF2ZXJzYWwuRGVmYXVsdFJlbW90ZVRyYXZlcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5CdWxrU2V0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC0xNTMsNyArMTQ5LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZEF3YWl0RmFpbFRoZUZ1dHVyZU9uTWFya0Vycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgc2hvdWxkQXdhaXRGYWlsVGhlRnV0dXJlT25NYXJrRXJyb3IoKSB7CiAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPExpc3Q8UmVzdWx0Pj4gZnV0dXJlID0gcmVzdWx0UXVldWUuYXdhaXQoNCk7CiAgICAgICAgIHJlc3VsdFF1ZXVlLmFkZChuZXcgUmVzdWx0KCJ0ZXN0MSIpKTsKICAgICAgICAgcmVzdWx0UXVldWUuYWRkKG5ldyBSZXN1bHQoInRlc3QyIikpOwpAQCAtMjk4LDEyOCArMjk0LDQgQEAKICAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhbmRsZUJ1bGtTZXRTaWRlRWZmZWN0cygpIHRocm93cyBFeGNlcHRpb24gIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8TGlzdDxSZXN1bHQ+PiBvID0gcmVzdWx0UXVldWUuYXdhaXQoMSk7Ci0gICAgICAgIGFzc2VydFRoYXQoby5pc0RvbmUoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICByZXN1bHRRdWV1ZS5hZGRTaWRlRWZmZWN0KFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX0JVTEtTRVQsIG5ldyBEZWZhdWx0UmVtb3RlVHJhdmVyc2VyPD4oImJyaWFuIiwgMikpOwotICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgcmVzdWx0UXVldWUuYWRkU2lkZUVmZmVjdChUb2tlbnMuVkFMX0FHR1JFR0FURV9UT19CVUxLU0VULCBuZXcgRGVmYXVsdFJlbW90ZVRyYXZlcnNlcjw+KCJicmlhbiIsIDIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChvLmlzRG9uZSgpLCBpcyhmYWxzZSkpOwotCi0gICAgICAgIHJlc3VsdFF1ZXVlLmFkZFNpZGVFZmZlY3QoVG9rZW5zLlZBTF9BR0dSRUdBVEVfVE9fQlVMS1NFVCwgbmV3IERlZmF1bHRSZW1vdGVUcmF2ZXJzZXI8PigiYmVsaW5kYSIsIDYpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChvLmlzRG9uZSgpLCBpcyhmYWxzZSkpOwotCi0gICAgICAgIHJlc3VsdFF1ZXVlLm1hcmtDb21wbGV0ZShBVFRSSUJVVEVTKTsKLQotICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKHRydWUpKTsKLSAgICAgICAgZmluYWwgQnVsa1NldDxTdHJpbmc+IGJ1bGtTZXQgPSBvLmdldCgpLmdldCgwKS5nZXQoQnVsa1NldC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBidWxrU2V0LmdldCgiYnJpYW4iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2LCBidWxrU2V0LmdldCgiYmVsaW5kYSIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoInRoYXQiLCByZXN1bHRRdWV1ZS5nZXRTdGF0dXNBdHRyaWJ1dGVzKCkuZ2V0KCJ0aGlzIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlTGlzdFNpZGVFZmZlY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPExpc3Q8UmVzdWx0Pj4gbyA9IHJlc3VsdFF1ZXVlLmF3YWl0KDEpOwotICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgcmVzdWx0UXVldWUuYWRkU2lkZUVmZmVjdChUb2tlbnMuVkFMX0FHR1JFR0FURV9UT19MSVNULCAic3RlcGhlbiIpOwotICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgcmVzdWx0UXVldWUuYWRkU2lkZUVmZmVjdChUb2tlbnMuVkFMX0FHR1JFR0FURV9UT19MSVNULCAiZGFuaWVsIik7Ci0gICAgICAgIGFzc2VydFRoYXQoby5pc0RvbmUoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICByZXN1bHRRdWV1ZS5hZGRTaWRlRWZmZWN0KFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX0xJU1QsICJkYXZlIik7Ci0gICAgICAgIGFzc2VydFRoYXQoby5pc0RvbmUoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICByZXN1bHRRdWV1ZS5tYXJrQ29tcGxldGUoQVRUUklCVVRFUyk7Ci0KLSAgICAgICAgYXNzZXJ0VGhhdChvLmlzRG9uZSgpLCBpcyh0cnVlKSk7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gby5nZXQoKS5nZXQoMCkuZ2V0KEFycmF5TGlzdC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIGxpc3QuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkYW5pZWwiLCBsaXN0LmdldCgxKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGF2ZSIsIGxpc3QuZ2V0KDIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoInRoYXQiLCByZXN1bHRRdWV1ZS5nZXRTdGF0dXNBdHRyaWJ1dGVzKCkuZ2V0KCJ0aGlzIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlU2V0U2lkZUVmZmVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8TGlzdDxSZXN1bHQ+PiBvID0gcmVzdWx0UXVldWUuYXdhaXQoMSk7Ci0gICAgICAgIGFzc2VydFRoYXQoby5pc0RvbmUoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICByZXN1bHRRdWV1ZS5hZGRTaWRlRWZmZWN0KFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX1NFVCwgInN0ZXBoZW4iKTsKLSAgICAgICAgYXNzZXJ0VGhhdChvLmlzRG9uZSgpLCBpcyhmYWxzZSkpOwotCi0gICAgICAgIHJlc3VsdFF1ZXVlLmFkZFNpZGVFZmZlY3QoVG9rZW5zLlZBTF9BR0dSRUdBVEVfVE9fU0VULCAiZGFuaWVsIik7Ci0gICAgICAgIGFzc2VydFRoYXQoby5pc0RvbmUoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICByZXN1bHRRdWV1ZS5hZGRTaWRlRWZmZWN0KFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX1NFVCwgImRhdmUiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChvLmlzRG9uZSgpLCBpcyhmYWxzZSkpOwotCi0gICAgICAgIHJlc3VsdFF1ZXVlLm1hcmtDb21wbGV0ZShBVFRSSUJVVEVTKTsKLQotICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKHRydWUpKTsKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2V0ID0gby5nZXQoKS5nZXQoMCkuZ2V0KEhhc2hTZXQuY2xhc3MpOwotICAgICAgICBhc3NlcnRUaGF0KHNldC5jb250YWlucygic3RlcGhlbiIpLCBpcyh0cnVlKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoc2V0LmNvbnRhaW5zKCJkYW5pZWwiKSwgaXModHJ1ZSkpOwotICAgICAgICBhc3NlcnRUaGF0KHNldC5jb250YWlucygiZGF2ZSIpLCBpcyh0cnVlKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGF0IiwgcmVzdWx0UXVldWUuZ2V0U3RhdHVzQXR0cmlidXRlcygpLmdldCgidGhpcyIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhbmRsZU1hcFNpZGVFZmZlY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPExpc3Q8UmVzdWx0Pj4gbyA9IHJlc3VsdFF1ZXVlLmF3YWl0KDEpOwotICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IG0gPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIG0ucHV0KCJzIiwgInN0ZXBoZW4iKTsKLSAgICAgICAgbS5wdXQoIm0iLCAibWFya28iKTsKLSAgICAgICAgbS5wdXQoImQiLCAiZGFuaWVsIik7Ci0KLSAgICAgICAgbS5lbnRyeVNldCgpLmZvckVhY2goZSAtPiB7Ci0gICAgICAgICAgICByZXN1bHRRdWV1ZS5hZGRTaWRlRWZmZWN0KFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX01BUCwgZSk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKGZhbHNlKSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJlc3VsdFF1ZXVlLm1hcmtDb21wbGV0ZShBVFRSSUJVVEVTKTsKLQotICAgICAgICBhc3NlcnRUaGF0KG8uaXNEb25lKCksIGlzKHRydWUpKTsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBsaXN0ID0gby5nZXQoKS5nZXQoMCkuZ2V0KEhhc2hNYXAuY2xhc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInN0ZXBoZW4iLCBsaXN0LmdldCgicyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkYW5pZWwiLCBsaXN0LmdldCgiZCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXJrbyIsIGxpc3QuZ2V0KCJtIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygidGhhdCIsIHJlc3VsdFF1ZXVlLmdldFN0YXR1c0F0dHJpYnV0ZXMoKS5nZXQoInRoaXMiKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhbmRsZU5vdEFnZ3JlZ2F0ZVNpZGVFZmZlY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxMaXN0PFJlc3VsdD4+IG8gPSByZXN1bHRRdWV1ZS5hd2FpdCgxKTsKLSAgICAgICAgYXNzZXJ0VGhhdChvLmlzRG9uZSgpLCBpcyhmYWxzZSkpOwotCi0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBtID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBtLnB1dCgicyIsICJzdGVwaGVuIik7Ci0gICAgICAgIG0ucHV0KCJtIiwgIm1hcmtvIik7Ci0gICAgICAgIG0ucHV0KCJkIiwgImRhbmllbCIpOwotCi0gICAgICAgIHJlc3VsdFF1ZXVlLmFkZFNpZGVFZmZlY3QoVG9rZW5zLlZBTF9BR0dSRUdBVEVfVE9fTk9ORSwgbSk7Ci0KLSAgICAgICAgcmVzdWx0UXVldWUubWFya0NvbXBsZXRlKEFUVFJJQlVURVMpOwotCi0gICAgICAgIGFzc2VydFRoYXQoby5pc0RvbmUoKSwgaXModHJ1ZSkpOwotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGxpc3QgPSBvLmdldCgpLmdldCgwKS5nZXQoSGFzaE1hcC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIGxpc3QuZ2V0KCJzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRhbmllbCIsIGxpc3QuZ2V0KCJkIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtvIiwgbGlzdC5nZXQoIm0iKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGF0IiwgcmVzdWx0UXVldWUuZ2V0U3RhdHVzQXR0cmlidXRlcygpLmdldCgidGhpcyIpKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1NldHRpbmdzVGVzdC5qYXZhIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9TZXR0aW5nc1Rlc3QuamF2YQppbmRleCBhZGYyZDFiLi5kZGZiZTE2IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL1NldHRpbmdzVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvU2V0dGluZ3NUZXN0LmphdmEKQEAgLTIyLDggKzIyLDggQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTQ3LDEwICs0Nyw2IEBACiAgICAgICAgIGNvbmYuc2V0UHJvcGVydHkoInNlcmlhbGl6ZXIuY2xhc3NOYW1lIiwgIm15LnNlcmlhbGl6ZXJzLk15U2VyaWFsaXplciIpOwogICAgICAgICBjb25mLnNldFByb3BlcnR5KCJzZXJpYWxpemVyLmNvbmZpZy5hbnkiLCAidGhpbmciKTsKICAgICAgICAgY29uZi5zZXRQcm9wZXJ0eSgiY29ubmVjdGlvblBvb2wuZW5hYmxlU3NsIiwgdHJ1ZSk7Ci0gICAgICAgIGNvbmYuc2V0UHJvcGVydHkoImNvbm5lY3Rpb25Qb29sLmtleUNlcnRDaGFpbkZpbGUiLCAiWC41MDkiKTsKLSAgICAgICAgY29uZi5zZXRQcm9wZXJ0eSgiY29ubmVjdGlvblBvb2wua2V5RmlsZSIsICJQS0NTIzgiKTsKLSAgICAgICAgY29uZi5zZXRQcm9wZXJ0eSgiY29ubmVjdGlvblBvb2wua2V5UGFzc3dvcmQiLCAicGFzc3dvcmQxIik7Ci0gICAgICAgIGNvbmYuc2V0UHJvcGVydHkoImNvbm5lY3Rpb25Qb29sLnRydXN0Q2VydENoYWluRmlsZSIsICJwZW0iKTsKICAgICAgICAgY29uZi5zZXRQcm9wZXJ0eSgiY29ubmVjdGlvblBvb2wua2V5U3RvcmUiLCAic2VydmVyLmprcyIpOwogICAgICAgICBjb25mLnNldFByb3BlcnR5KCJjb25uZWN0aW9uUG9vbC5rZXlTdG9yZVBhc3N3b3JkIiwgInBhc3N3b3JkMiIpOwogICAgICAgICBjb25mLnNldFByb3BlcnR5KCJjb25uZWN0aW9uUG9vbC5rZXlTdG9yZVR5cGUiLCAicGtjczEyIik7CkBAIC04NiwxMCArODIsNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIm15LnNlcmlhbGl6ZXJzLk15U2VyaWFsaXplciIsIHNldHRpbmdzLnNlcmlhbGl6ZXIuY2xhc3NOYW1lKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGluZyIsIHNldHRpbmdzLnNlcmlhbGl6ZXIuY29uZmlnLmdldCgiYW55IikpOwogICAgICAgICBhc3NlcnRUaGF0KHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLmVuYWJsZVNzbCwgaXModHJ1ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlguNTA5Iiwgc2V0dGluZ3MuY29ubmVjdGlvblBvb2wua2V5Q2VydENoYWluRmlsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUEtDUyM4Iiwgc2V0dGluZ3MuY29ubmVjdGlvblBvb2wua2V5RmlsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFzc3dvcmQxIiwgc2V0dGluZ3MuY29ubmVjdGlvblBvb2wua2V5UGFzc3dvcmQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBlbSIsIHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLnRydXN0Q2VydENoYWluRmlsZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygic2VydmVyLmprcyIsIHNldHRpbmdzLmNvbm5lY3Rpb25Qb29sLmtleVN0b3JlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXNzd29yZDIiLCBzZXR0aW5ncy5jb25uZWN0aW9uUG9vbC5rZXlTdG9yZVBhc3N3b3JkKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwa2NzMTIiLCBzZXR0aW5ncy5jb25uZWN0aW9uUG9vbC5rZXlTdG9yZVR5cGUpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvRHJpdmVyUmVtb3RlQ29ubmVjdGlvblRlc3QuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0RyaXZlclJlbW90ZUNvbm5lY3Rpb25UZXN0LmphdmEKaW5kZXggODIwYTBkMy4uYTE2MWRkZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvRHJpdmVyUmVtb3RlQ29ubmVjdGlvblRlc3QuamF2YQorKysgYi9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoKCJ5IiwgMTAwKS4KICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGgoVG9rZW5zLkFSR1NfQkFUQ0hfU0laRSwgMTAwMCkuCiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoKFRva2Vucy5SRVFVRVNUX0lELCByZXF1ZXN0SWQpLgotICAgICAgICAgICAgICAgICAgICAgICAgd2l0aChUb2tlbnMuQVJHU19TQ1JJUFRfRVZBTF9USU1FT1VULCAxMDAwMDBMKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGgoVG9rZW5zLkFSR1NfRVZBTF9USU1FT1VULCAxMDAwMDBMKS4KICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGgoVG9rZW5zLkFSR1NfVVNFUl9BR0VOVCwgInRlc3QiKS4KICAgICAgICAgICAgICAgICAgICAgICAgIFYoKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhyZXF1ZXN0SWQsIG9wdGlvbnMuZ2V0T3ZlcnJpZGVSZXF1ZXN0SWQoKS5nZXQoKSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9Ecml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0c1Rlc3QuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0RyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTZkZjkzLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0RyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5BYnN0cmFjdFJlc3VsdFF1ZXVlVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuUmVzdWx0U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTaWRlRWZmZWN0czsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jc0luc3RhbmNlT2YuaW5zdGFuY2VPZjsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwotCi0vKioKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzdWx0UXVldWVUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkTm90Q29udGFjdFJlbW90ZUZvcktleXNBZnRlckNsb3NlSXNDYWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IG1vY2soQ2xpZW50LmNsYXNzKTsKLSAgICAgICAgbW9ja0NsaWVudEZvckNhbGwoY2xpZW50KTsKLSAgICAgICAgbW9ja0NsaWVudEZvckNhbGwoY2xpZW50KTsKLQotICAgICAgICBmaW5hbCBVVUlEIHNpZGVFZmZlY3RLZXkgPSBVVUlELmZyb21TdHJpbmcoIjMxZGVjMmM2LWIyMTQtNGE2Zi1hNjhiLTk5NjYwOGRjZTBkOSIpOwotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiByZWFkeSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7Ci0gICAgICAgIHJlYWR5LmNvbXBsZXRlKG51bGwpOwotICAgICAgICBmaW5hbCBUcmF2ZXJzYWxTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cyA9IG5ldyBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhjbGllbnQsIHNpZGVFZmZlY3RLZXksIG51bGwsIHJlYWR5KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2lkZUVmZmVjdHMua2V5cygpLnNpemUoKSk7Ci0gICAgICAgIHNpZGVFZmZlY3RzLmNsb3NlKCk7Ci0KLSAgICAgICAgLy8gY2FsbCB0aGlzIGFnYWluIGFuZCBhZ2FpbiBhbmQgaXQgd2lsbCBvbmx5IGhpdCB0aGUgY2FjaGVkIGtleXMgLSBubyBtb3JlIHNlcnZlciBjYWxscwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2lkZUVmZmVjdHMua2V5cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzaWRlRWZmZWN0cy5rZXlzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNpZGVFZmZlY3RzLmtleXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2lkZUVmZmVjdHMua2V5cygpLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gb25jZSBmb3IgdGhlIGtleXMgYW5kIG9uY2UgZm9yIHRoZSBjbG9zZSBtZXNzYWdlCi0gICAgICAgIHZlcmlmeShjbGllbnQsIHRpbWVzKDIpKS5zdWJtaXRBc3luYyhhbnkoUmVxdWVzdE1lc3NhZ2UuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VkbE5vdENvbnRhY3RSZW1vdGVGb3JHZXRBZnRlckNsb3NlSXNDYWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IG1vY2soQ2xpZW50LmNsYXNzKTsKLSAgICAgICAgbW9ja0NsaWVudEZvckNhbGwoY2xpZW50KTsKLSAgICAgICAgbW9ja0NsaWVudEZvckNhbGwoY2xpZW50KTsKLSAgICAgICAgZmluYWwgVVVJRCBzaWRlRWZmZWN0S2V5ID0gVVVJRC5mcm9tU3RyaW5nKCIzMWRlYzJjNi1iMjE0LTRhNmYtYTY4Yi05OTY2MDhkY2UwZDkiKTsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gcmVhZHkgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOwotICAgICAgICByZWFkeS5jb21wbGV0ZShudWxsKTsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPSBuZXcgRHJpdmVyUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHMoY2xpZW50LCBzaWRlRWZmZWN0S2V5LCBudWxsLCByZWFkeSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzaWRlRWZmZWN0cy5nZXQoInRlc3QtMCIpKTsKLSAgICAgICAgc2lkZUVmZmVjdHMuY2xvc2UoKTsKLQotICAgICAgICAvLyBTaWRlIGVmZmVjdCAnYScgc2hvdWxkIGJlIGNhY2hlZCBsb2NhbGx5Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2lkZUVmZmVjdHMuZ2V0KCJ0ZXN0LTAiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2lkZUVmZmVjdHMuZ2V0KCJ0ZXN0LTAiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2lkZUVmZmVjdHMuZ2V0KCJ0ZXN0LTAiKSk7Ci0KLSAgICAgICAgLy8gT25jZSBmb3Iga2V5cywgb25jZSBmb3IgZ2V0IGFuZCBvbmNlIGZvciBjbG9zZQotICAgICAgICB2ZXJpZnkoY2xpZW50LCB0aW1lcygzKSkuc3VibWl0QXN5bmMoYW55KFJlcXVlc3RNZXNzYWdlLmNsYXNzKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RDb250YWN0UmVtb3RlTW9yZVRoYW5PbmNlRm9yQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IG1vY2soQ2xpZW50LmNsYXNzKTsKLSAgICAgICAgbW9ja0NsaWVudEZvckNhbGwoY2xpZW50KTsKLQotICAgICAgICBmaW5hbCBVVUlEIHNpZGVFZmZlY3RLZXkgPSBVVUlELmZyb21TdHJpbmcoIjMxZGVjMmM2LWIyMTQtNGE2Zi1hNjhiLTk5NjYwOGRjZTBkOSIpOwotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiByZWFkeSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7Ci0gICAgICAgIHJlYWR5LmNvbXBsZXRlKG51bGwpOwotICAgICAgICBmaW5hbCBUcmF2ZXJzYWxTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cyA9IG5ldyBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhjbGllbnQsIHNpZGVFZmZlY3RLZXksIG51bGwsIHJlYWR5KTsKLQotICAgICAgICBzaWRlRWZmZWN0cy5jbG9zZSgpOwotICAgICAgICBzaWRlRWZmZWN0cy5jbG9zZSgpOwotICAgICAgICBzaWRlRWZmZWN0cy5jbG9zZSgpOwotICAgICAgICBzaWRlRWZmZWN0cy5jbG9zZSgpOwotICAgICAgICBzaWRlRWZmZWN0cy5jbG9zZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzaWRlRWZmZWN0cy5rZXlzKCk7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgdHJhdmVyc2FsIGlzIGNsb3NlZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXgsIGluc3RhbmNlT2YoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRyYXZlcnNhbCBoYXMgYmVlbiBjbG9zZWQgLSBzaWRlLWVmZmVjdCBrZXlzIGNhbm5vdCBiZSByZXRyaWV2ZWQiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNpZGVFZmZlY3RzLmdldCgiYSIpOwotICAgICAgICAgICAgZmFpbCgiVGhlIHRyYXZlcnNhbCBpcyBjbG9zZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KGV4LCBpbnN0YW5jZU9mKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUcmF2ZXJzYWwgaGFzIGJlZW4gY2xvc2VkIC0gc2lkZS1lZmZlY3Qga2V5cyBjYW5ub3QgYmUgcmV0cmlldmVkIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG9uY2UgZm9yIHRoZSBjbG9zZSBtZXNzYWdlCi0gICAgICAgIHZlcmlmeShjbGllbnQsIHRpbWVzKDEpKS5zdWJtaXRBc3luYyhhbnkoUmVxdWVzdE1lc3NhZ2UuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbW9ja0NsaWVudEZvckNhbGwoZmluYWwgQ2xpZW50IGNsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRoZSByZXR1cm4gaXMganVzdCBnZW5lcmljIGdhcmJhZ2UgZnJvbSBhZGRUb1F1ZXVlIGZvciBhbnkgY2FsbCB0byBzdWJtaXRBc3luYygpLgotICAgICAgICB3aGVuKGNsaWVudC5zdWJtaXRBc3luYyhhbnkoUmVxdWVzdE1lc3NhZ2UuY2xhc3MpKSkudGhlbkFuc3dlcigoQW5zd2VyPE9iamVjdD4pIGludm9jYXRpb25Pbk1vY2sgLT4gewotICAgICAgICAgICAgZmluYWwgUmVzdWx0U2V0IHJldHVybmVkUmVzdWx0U2V0ID0gbmV3IFJlc3VsdFNldChyZXN1bHRRdWV1ZSwgcG9vbCwgcmVhZENvbXBsZXRlZCwgUmVxdWVzdE1lc3NhZ2UuYnVpbGQoInRyYXZlcnNhbCIpLmNyZWF0ZSgpLCBudWxsKTsKLSAgICAgICAgICAgIGFkZFRvUXVldWUoMSwgMCwgdHJ1ZSwgdHJ1ZSwgMSk7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxSZXN1bHRTZXQ+IHJldHVybmVkRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKLSAgICAgICAgICAgIHJldHVybmVkRnV0dXJlLmNvbXBsZXRlKHJldHVybmVkUmVzdWx0U2V0KTsKLSAgICAgICAgICAgIHJldHVybiByZXR1cm5lZEZ1dHVyZTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvYmluYXJ5L0dyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMVRlc3QuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL2JpbmFyeS9HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjFUZXN0LmphdmEKaW5kZXggZDAwNDJmZi4uMjc3MmNiMSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvYmluYXJ5L0dyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMVRlc3QuamF2YQorKysgYi9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3Nlci9iaW5hcnkvR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxVGVzdC5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLlNlcmlhbGl6YXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uYmluYXJ5LlR5cGVTZXJpYWxpemVyUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uaW50ZXJuYWwubWF0Y2hlcnMuYXBhY2hlY29tbW9ucy5SZWZsZWN0aW9uRXF1YWxzOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMzUsNiArMzQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLk1vY2tpdG9IYW1jcmVzdE1hdGNoZXJBZGFwdGVyLnJlZmxlY3Rpb25FcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgICAgZmluYWwgaW50IG1pbWVMZW4gPSBidWZmZXIucmVhZEJ5dGUoKTsKICAgICAgICAgYnVmZmVyLnJlYWRCeXRlcyhuZXcgYnl0ZVttaW1lTGVuXSk7CiAgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIGRlc2VyaWFsaXplZCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemVSZXF1ZXN0KGJ1ZmZlcik7Ci0gICAgICAgIGFzc2VydFRoYXQocmVxdWVzdCwgbmV3IFJlZmxlY3Rpb25FcXVhbHMoZGVzZXJpYWxpemVkKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdCwgcmVmbGVjdGlvbkVxdWFscyhkZXNlcmlhbGl6ZWQpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICBmaW5hbCBpbnQgbWltZUxlbiA9IGJ1ZmZlci5yZWFkQnl0ZSgpOwogICAgICAgICBidWZmZXIucmVhZEJ5dGVzKG5ldyBieXRlW21pbWVMZW5dKTsKICAgICAgICAgZmluYWwgUmVxdWVzdE1lc3NhZ2UgZGVzZXJpYWxpemVkID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZVJlcXVlc3QoYnVmZmVyKTsKLSAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LCBuZXcgUmVmbGVjdGlvbkVxdWFscyhkZXNlcmlhbGl6ZWQpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LCByZWZsZWN0aW9uRXF1YWxzKGRlc2VyaWFsaXplZCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIGZpbmFsIGludCBtaW1lTGVuID0gYnVmZmVyLnJlYWRCeXRlKCk7CiAgICAgICAgIGJ1ZmZlci5yZWFkQnl0ZXMobmV3IGJ5dGVbbWltZUxlbl0pOwogICAgICAgICBmaW5hbCBSZXF1ZXN0TWVzc2FnZSBkZXNlcmlhbGl6ZWQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplUmVxdWVzdChidWZmZXIpOwotICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QsIG5ldyBSZWZsZWN0aW9uRXF1YWxzKGRlc2VyaWFsaXplZCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QsIHJlZmxlY3Rpb25FcXVhbHMoZGVzZXJpYWxpemVkKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL2JpbmFyeS9HcmFwaEJpbmFyeVJlYWRlcldyaXRlclJvdW5kVHJpcFRlc3QuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL2JpbmFyeS9HcmFwaEJpbmFyeVJlYWRlcldyaXRlclJvdW5kVHJpcFRlc3QuamF2YQppbmRleCBlYTcyNTRkLi5mMjQ4YmM5IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3Nlci9iaW5hcnkvR3JhcGhCaW5hcnlSZWFkZXJXcml0ZXJSb3VuZFRyaXBUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvYmluYXJ5L0dyYXBoQmluYXJ5UmVhZGVyV3JpdGVyUm91bmRUcmlwVGVzdC5qYXZhCkBAIC02MSw3ICs2MSw2IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uaW50ZXJuYWwubWF0Y2hlcnMuYXBhY2hlY29tbW9ucy5SZWZsZWN0aW9uRXF1YWxzOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CkBAIC04Niw2ICs4NSw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLk1vY2tpdG9IYW1jcmVzdE1hdGNoZXJBZGFwdGVyLnJlZmxlY3Rpb25FcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fLmhhc0xhYmVsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwpAQCAtMjY1LDE5ICsyNjUsMTkgQEAKICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyJCdWxrU2V0IiwgYnVsa1NldCwgbnVsbH0sCiAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsiVHJlZSIsIHRyZWUsIG51bGx9LAogICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IkVtcHR5TWV0cmljcyIsIG5ldyBNdXRhYmxlTWV0cmljcygiaWRFbXB0eSIsICJuYW1lRW1wdHkiKSwgKENvbnN1bWVyPE1ldHJpY3M+KSBtIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChtLCBuZXcgUmVmbGVjdGlvbkVxdWFscyhuZXcgTXV0YWJsZU1ldHJpY3MoImlkRW1wdHkiLCAibmFtZUVtcHR5IikpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChtLCByZWZsZWN0aW9uRXF1YWxzKG5ldyBNdXRhYmxlTWV0cmljcygiaWRFbXB0eSIsICJuYW1lRW1wdHkiKSkpOwogICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ik1ldHJpY3MiLCBtZXRyaWNzLCAoQ29uc3VtZXI8TWV0cmljcz4pIG0gLT4gewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KG0sIG5ldyBSZWZsZWN0aW9uRXF1YWxzKG1ldHJpY3MsICJuZXN0ZWQiLCAiY291bnRzIikpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KG0sIHJlZmxlY3Rpb25FcXVhbHMobWV0cmljcywgIm5lc3RlZCIsICJjb3VudHMiKSk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQXJyYXlMaXN0KG1ldHJpY3MuZ2V0Q291bnRzKCkudmFsdWVzKCkpLCBuZXcgQXJyYXlMaXN0KG0uZ2V0Q291bnRzKCkudmFsdWVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChtLmdldE5lc3RlZCgpLCBuZXcgUmVmbGVjdGlvbkVxdWFscyhtZXRyaWNzLmdldE5lc3RlZCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQobS5nZXROZXN0ZWQoKSwgcmVmbGVjdGlvbkVxdWFscyhtZXRyaWNzLmdldE5lc3RlZCgpKSk7CiAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsiRW1wdHlUcmF2ZXJzYWxNZXRyaWNzIiwgZW1wdHlUcmF2ZXJzYWxNZXRyaWNzLCAoQ29uc3VtZXI8VHJhdmVyc2FsTWV0cmljcz4pIG0gLT4gewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KG0sIG5ldyBSZWZsZWN0aW9uRXF1YWxzKGVtcHR5VHJhdmVyc2FsTWV0cmljcykpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KG0sIHJlZmxlY3Rpb25FcXVhbHMoZW1wdHlUcmF2ZXJzYWxNZXRyaWNzKSk7CiAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsiVHJhdmVyc2FsTWV0cmljcyIsIHRyYXZlcnNhbE1ldHJpY3MsIChDb25zdW1lcjxUcmF2ZXJzYWxNZXRyaWNzPikgbSAtPiB7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhtLnRvU3RyaW5nKCksIHRyYXZlcnNhbE1ldHJpY3MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQobSwgbmV3IFJlZmxlY3Rpb25FcXVhbHModHJhdmVyc2FsTWV0cmljcywgInN0ZXBJbmRleGVkTWV0cmljcyIsICJwb3NpdGlvbkluZGV4ZWRNZXRyaWNzIikpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KG0sIHJlZmxlY3Rpb25FcXVhbHModHJhdmVyc2FsTWV0cmljcywgInN0ZXBJbmRleGVkTWV0cmljcyIsICJwb3NpdGlvbkluZGV4ZWRNZXRyaWNzIikpOwogICAgICAgICAgICAgICAgIH19LAogCiAgICAgICAgICAgICAgICAgLy8gY29sbGVjdGlvbnMKZGlmZiAtLWdpdCBhL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL2JpbmFyeS90eXBlcy9zYW1wbGUvU2FtcGxlUGVyc29uU2VyaWFsaXplclRlc3QuamF2YSBiL2dyZW1saW4tZHJpdmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvc2VyL2JpbmFyeS90eXBlcy9zYW1wbGUvU2FtcGxlUGVyc29uU2VyaWFsaXplclRlc3QuamF2YQppbmRleCAzZDZiZWYzLi41Y2EzYzQ2IDEwMDY0NAotLS0gYS9ncmVtbGluLWRyaXZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3Nlci9iaW5hcnkvdHlwZXMvc2FtcGxlL1NhbXBsZVBlcnNvblNlcmlhbGl6ZXJUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1kcml2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9zZXIvYmluYXJ5L3R5cGVzL3NhbXBsZS9TYW1wbGVQZXJzb25TZXJpYWxpemVyVGVzdC5qYXZhCkBAIC0zMCw3ICszMCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uYmluYXJ5LkdyYXBoQmluYXJ5V3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmJpbmFyeS5UeXBlU2VyaWFsaXplclJlZ2lzdHJ5OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5tb2NraXRvLmludGVybmFsLm1hdGNoZXJzLmFwYWNoZWNvbW1vbnMuUmVmbGVjdGlvbkVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CkBAIC00MSw2ICs0MCw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5Nb2NraXRvSGFtY3Jlc3RNYXRjaGVyQWRhcHRlci5yZWZsZWN0aW9uRXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuQWJzdHJhY3RNZXNzYWdlU2VyaWFsaXplci5UT0tFTl9JT19SRUdJU1RSSUVTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLlRPS0VOX0NVU1RPTTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICAgICAgd3JpdGVyLndyaXRlVmFsdWUocGVyc29uLCBidWZmZXIsIG51bGxhYmxlKTsKICAgICAgICAgICAgIGZpbmFsIFNhbXBsZVBlcnNvbiBhY3R1YWwgPSByZWFkZXIucmVhZFZhbHVlKGJ1ZmZlciwgU2FtcGxlUGVyc29uLmNsYXNzLCBudWxsYWJsZSk7CiAKLSAgICAgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsLCBuZXcgUmVmbGVjdGlvbkVxdWFscyhwZXJzb24pKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsLCByZWZsZWN0aW9uRXF1YWxzKHBlcnNvbikpOwogICAgICAgICAgICAgYnVmZmVyLnJlbGVhc2UoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICBmaW5hbCBSZXNwb25zZU1lc3NhZ2UgZGVzZXJpYWxpemVkID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZVJlc3BvbnNlKHNlcmlhbGl6ZWQpOwogCiAgICAgICAgIGZpbmFsIFNhbXBsZVBlcnNvbiBhY3R1YWwgPSAoU2FtcGxlUGVyc29uKSBkZXNlcmlhbGl6ZWQuZ2V0UmVzdWx0KCkuZ2V0RGF0YSgpOwotICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbCwgbmV3IFJlZmxlY3Rpb25FcXVhbHMocGVyc29uKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsLCByZWZsZWN0aW9uRXF1YWxzKHBlcnNvbikpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tSW9SZWdpc3RyeSBleHRlbmRzIEFic3RyYWN0SW9SZWdpc3RyeSB7CmRpZmYgLS1naXQgYS9ncmVtbGluLWdyb292eS9wb20ueG1sIGIvZ3JlbWxpbi1ncm9vdnkvcG9tLnhtbAppbmRleCA5Zjk4ZWNmLi45Mzg0YjI0IDEwMDY0NAotLS0gYS9ncmVtbGluLWdyb292eS9wb20ueG1sCisrKyBiL2dyZW1saW4tZ3Jvb3Z5L3BvbS54bWwKQEAgLTIxLDcgKzIxLDcgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VycG9wPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1ncm9vdnk8L2FydGlmYWN0SWQ+CiAgICAgPG5hbWU+QXBhY2hlIFRpbmtlclBvcCA6OiBHcmVtbGluIEdyb292eTwvbmFtZT4KQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLml2eTwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPml2eTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHZlcnNpb24+Mi40LjA8L3ZlcnNpb24+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5PC9ncm91cElkPgpAQCAtNTcsNiArNTcsMjAgQEAKICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5ncm9vdnk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncm9vdnktY2xpLXBpY29jbGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2dyb292eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmluZHk8L2NsYXNzaWZpZXI+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLQorICAgICAgICBub3Qgc3VyZSB3aHkgamxpbmUgd29uJ3QgY29tZSBpbiB3aXRoIGdyb292eS1ncm9vdnlzaCBidXQgaXQgbWVzc2VzIHVwIGJ1aWxkIG9mIGdyZW1saW4tY29uc29sZQorICAgICAgICAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qbGluZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpsaW5lPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4xNC42PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdyb292eTwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyb292eS1qc29uPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHZlcnNpb24+JHtncm9vdnkudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgICAgICA8Y2xhc3NpZmllcj5pbmR5PC9jbGFzc2lmaWVyPgpAQCAtMTU5LDQgKzE3MywyOSBAQAogICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgIDwvcGx1Z2lucz4KICAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5qZGsxMTwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8amRrPjExPC9qZGs+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIG92ZXJyaWRlIHNvdXJjZSBwYXRoIGFzIHdlIGRvbid0IHNlZW0gdG8gZ2V0IHRoZSBncm9vdnktc3R1YnMgYXV0b21hdGljYWxseS4gdGhpcyB3b3JrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBqYXZhIDggYnV0IGVycm9ycyB1bmRlciBqYXZhIDExIGR1ZSB0byBtaXNzaW5nIGZpbGVzIG9uIHRoZSBwYXRoLiBpIGd1ZXNzIGphdmEgOCB3YXMgbW9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmdpdmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlcGF0aD4ke3BvbS5iYXNlZGlyfS9zcmMvbWFpbi9qYXZhOiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL2Fubm90YXRpb25zOiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL2dyb292eS1zdHVicy9tYWluPC9zb3VyY2VwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvYXN0L0ludGVycHJldGVyTW9kZUFTVFRyYW5zZm9ybWF0aW9uLmdyb292eSBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvYXN0L0ludGVycHJldGVyTW9kZUFTVFRyYW5zZm9ybWF0aW9uLmdyb292eQppbmRleCBlN2EzYzYyLi5mNmUxYjg4IDEwMDY0NAotLS0gYS9ncmVtbGluLWdyb292eS9zcmMvbWFpbi9ncm9vdnkvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL2FzdC9JbnRlcnByZXRlck1vZGVBU1RUcmFuc2Zvcm1hdGlvbi5ncm9vdnkKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9hc3QvSW50ZXJwcmV0ZXJNb2RlQVNUVHJhbnNmb3JtYXRpb24uZ3Jvb3Z5CkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgIENsYXNzTm9kZSBzY3JpcHROb2RlID0gKENsYXNzTm9kZSkgYXN0Tm9kZXNbMV0KIAogICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIHRoYXQgb2JqZWN0IGlzIGEgU2NyaXB0IHRvIGNhbGwgcnVuKCkuIHRoaXMgc2NyaXB0Tm9kZSBtYXkgYmUgYSB1c2VyIGRlZmluZWQgY2xhc3MgdmlhCi0gICAgICAgIC8vICJkZWYgY2xhc3MiIGluIHdoaWNoIGNhc2UgaXQgY2FuIGJlIGlnbm9yZWQgYXMgdGhlcmUgYXJlIG5vIHZhcmlhYmxlcyB0byBwcm9tb3RlIHRvIGdsb2JhbCBzdGF0dXMgdGhlcmUKKyAgICAgICAgLy8gImNsYXNzIiBpbiB3aGljaCBjYXNlIGl0IGNhbiBiZSBpZ25vcmVkIGFzIHRoZXJlIGFyZSBubyB2YXJpYWJsZXMgdG8gcHJvbW90ZSB0byBnbG9iYWwgc3RhdHVzIHRoZXJlCiAgICAgICAgIGlmIChzY3JpcHROb2RlLmlzRGVyaXZlZEZyb20oQ2xhc3NIZWxwZXIubWFrZShTY3JpcHQpKSkgewogICAgICAgICAgICAgZGVmIHJ1bk1ldGhvZE9mU2NyaXB0ID0gc2NyaXB0Tm9kZS5kZWNsYXJlZE1ldGhvZHNNYXBbImphdmEubGFuZy5PYmplY3QgcnVuKCkiXQogICAgICAgICAgICAgcnVuTWV0aG9kT2ZTY3JpcHQuY29kZSA9IHdyYXAocnVuTWV0aG9kT2ZTY3JpcHQpCmRpZmYgLS1naXQgYS9ncmVtbGluLWdyb292eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2VuZ2luZS9HcmVtbGluRXhlY3V0b3IuamF2YSBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvZW5naW5lL0dyZW1saW5FeGVjdXRvci5qYXZhCmluZGV4IGQ4YzcxZTYuLjNlZGFiZWUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvZW5naW5lL0dyZW1saW5FeGVjdXRvci5qYXZhCisrKyBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvZW5naW5lL0dyZW1saW5FeGVjdXRvci5qYXZhCkBAIC01MDUsMjEgKzUwNSw2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQW1vdW50IG9mIHRpbWUgYSBzY3JpcHQgaGFzIGJlZm9yZSBpdCB0aW1lcyBvdXQuIE5vdGUgdGhhdCB0aGUgdGltZSByZXF1aXJlZCBjb3ZlcnMgYm90aCBzY3JpcHQgZXZhbHVhdGlvbgotICAgICAgICAgKiBhcyB3ZWxsIGFzIGFueSB0aW1lIG5lZWRlZCBmb3IgYSBwb3N0IHJlc3VsdCB0cmFuc2Zvcm1hdGlvbiAoaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGlzIHN1cHBsaWVkCi0gICAgICAgICAqIHRvIHRoZSB7QGxpbmsgR3JlbWxpbkV4ZWN1dG9yI2V2YWx9KS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNjcmlwdEV2YWx1YXRpb25UaW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgYW4gZXZhbHVhdGlvbiBpcyBhbGxvd2VkIHRvIHJ1biBhbmQgaXRzCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzIHBvdGVudGlhbGx5IHRyYW5zZm9ybWVkLiBTZXQgdG8gemVybyB0byBoYXZlIG5vIHRpbWVvdXQgc2V0LgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy45LCByZXBsYWNlZCBieSB7QGxpbmsgI2V2YWx1YXRpb25UaW1lb3V0fS4KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNjcmlwdEV2YWx1YXRpb25UaW1lb3V0KGZpbmFsIGxvbmcgc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQpIHsKLSAgICAgICAgICAgIHRoaXMuZXZhbHVhdGlvblRpbWVvdXQgPSBzY3JpcHRFdmFsdWF0aW9uVGltZW91dDsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCiAgICAgICAgICAqIEFtb3VudCBvZiB0aW1lIGFuIGV2YWx1YXRpb24gaGFzIGJlZm9yZSBpdCB0aW1lcyBvdXQuIE5vdGUgdGhhdCB0aGUgdGltZSByZXF1aXJlZCBjb3ZlcnMgYm90aCBldmFsdWF0aW9uCiAgICAgICAgICAqIGFzIHdlbGwgYXMgYW55IHRpbWUgbmVlZGVkIGZvciBhIHBvc3QgcmVzdWx0IHRyYW5zZm9ybWF0aW9uIChpZiB0aGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaXMgc3VwcGxpZWQKICAgICAgICAgICogdG8gdGhlIHtAbGluayBHcmVtbGluRXhlY3V0b3IjZXZhbH0pLgpAQCAtNjM2LDE0ICs2MjEsNiBAQAogICAgICAgICAgICAgZXZhbHVhdGlvblRpbWVvdXRPdmVycmlkZSA9IE9wdGlvbmFsLm9mTnVsbGFibGUoYnVpbGRlci5ldmFsdWF0aW9uVGltZW91dE92ZXJyaWRlKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy45LCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEV2YWx1YXRpb25UaW1lb3V0T3ZlcnJpZGUoKX0uCi0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgT3B0aW9uYWw8TG9uZz4gZ2V0U2NyaXB0RXZhbHVhdGlvblRpbWVvdXRPdmVycmlkZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBldmFsdWF0aW9uVGltZW91dE92ZXJyaWRlOwotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIE9wdGlvbmFsPExvbmc+IGdldEV2YWx1YXRpb25UaW1lb3V0T3ZlcnJpZGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gZXZhbHVhdGlvblRpbWVvdXRPdmVycmlkZTsKICAgICAgICAgfQpAQCAtNzQzLDE4ICs3MjAsNiBAQAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBBbiBvdmVycmlkZSB0byB0aGUgZ2xvYmFsIHtAY29kZSBldmFsdWF0aW9uVGltZW91dH0gc2V0dGluZyBvbiB0aGUgc2NyaXB0IGVuZ2luZS4gSWYgdGhpcyB2YWx1ZQogICAgICAgICAgICAgICogaXMgc2V0IHRvIHtAY29kZSBudWxsfSAodGhlIGRlZmF1bHQpIGl0IHdpbGwgdXNlIHRoZSBnbG9iYWwgc2V0dGluZy4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy45LCByZXBsYWNlZCBieSB7QGxpbmsgI2V2YWx1YXRpb25UaW1lb3V0T3ZlcnJpZGV9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBzY3JpcHRFdmFsdWF0aW9uVGltZW91dE92ZXJyaWRlKGZpbmFsIExvbmcgc2NyaXB0RXZhbHVhdGlvblRpbWVvdXRPdmVycmlkZSkgewotICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGlvblRpbWVvdXRPdmVycmlkZSA9IHNjcmlwdEV2YWx1YXRpb25UaW1lb3V0T3ZlcnJpZGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQW4gb3ZlcnJpZGUgdG8gdGhlIGdsb2JhbCB7QGNvZGUgZXZhbHVhdGlvblRpbWVvdXR9IHNldHRpbmcgb24gdGhlIHNjcmlwdCBlbmdpbmUuIElmIHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAqIGlzIHNldCB0byB7QGNvZGUgbnVsbH0gKHRoZSBkZWZhdWx0KSBpdCB3aWxsIHVzZSB0aGUgZ2xvYmFsIHNldHRpbmcuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGV2YWx1YXRpb25UaW1lb3V0T3ZlcnJpZGUoZmluYWwgTG9uZyBldmFsdWF0aW9uVGltZW91dE92ZXJyaWRlKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0aW9uVGltZW91dE92ZXJyaWRlID0gZXZhbHVhdGlvblRpbWVvdXRPdmVycmlkZTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUuamF2YSBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUuamF2YQppbmRleCA2ZTY4NTdmLi40MzhiNWM2IDEwMDY0NAotLS0gYS9ncmVtbGluLWdyb292eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9HcmVtbGluR3Jvb3Z5U2NyaXB0RW5naW5lLmphdmEKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3JlbWxpbkdyb292eVNjcmlwdEVuZ2luZS5qYXZhCkBAIC0yMTUsMTEgKzIxNSwxMiBAQAogICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBnbG9iYWwgc2NvcGUgaW4gY2FzZSB0aGlzIHNjcmlwdGVuZ2luZSB3YXMgaW5zdGFudGlhdGVkIG91dHNpZGUgb2YgdGhlIFNjcmlwdEVuZ2luZU1hbmFnZXIKICAgICAgICAgc2V0QmluZGluZ3MobmV3IENvbmN1cnJlbnRCaW5kaW5ncygpLCBTY3JpcHRDb250ZXh0LkdMT0JBTF9TQ09QRSk7CiAKLSAgICAgICAgZmluYWwgTGlzdDxDdXN0b21pemVyPiBsaXN0T2ZDdXN0b21pemVycyA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KGN1c3RvbWl6ZXJzKSk7CisgICAgICAgIGZpbmFsIExpc3Q8Q3VzdG9taXplcj4gbGlzdE9mQ3VzdG9taXplcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvLyBhbHdheXMgbmVlZCB0aGlzIHBsdWdpbiBmb3IgYSBzY3JpcHRlbmdpbmUgdG8gYmUgIkdyZW1saW4tZW5hYmxlZCIKICAgICAgICAgQ29yZUdyZW1saW5QbHVnaW4uaW5zdGFuY2UoKS5nZXRDdXN0b21pemVycygiZ3JlbWxpbi1ncm9vdnkiKS5pZlByZXNlbnQoYyAtPiBsaXN0T2ZDdXN0b21pemVycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjKSkpOwotCisgICAgICAgIGxpc3RPZkN1c3RvbWl6ZXJzLmFkZEFsbChBcnJheXMuYXNMaXN0KGN1c3RvbWl6ZXJzKSk7CisgICAgICAgIAogICAgICAgICBHcmVtbGluTG9hZGVyLmxvYWQoKTsKIAogICAgICAgICBmaW5hbCBMaXN0PEltcG9ydEN1c3RvbWl6ZXI+IGltcG9ydEN1c3RvbWl6ZXJzID0gbGlzdE9mQ3VzdG9taXplcnMuc3RyZWFtKCkKQEAgLTI1OCw3ICsyNTksNyBAQAogICAgICAgICAgICAgICAgIGZpbHRlcihwIC0+IHAgaW5zdGFuY2VvZiBUcmFuc2xhdG9yQ3VzdG9taXplcikuCiAgICAgICAgICAgICAgICAgbWFwKHAgLT4gKFRyYW5zbGF0b3JDdXN0b21pemVyKSBwKS5maW5kRmlyc3QoKTsKICAgICAgICAgdHlwZVRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yQ3VzdG9taXplci5tYXAoVHJhbnNsYXRvckN1c3RvbWl6ZXI6OmNyZWF0ZVR5cGVUcmFuc2xhdG9yKS4KLSAgICAgICAgICAgICAgICBvckVsc2VHZXQoR3Jvb3Z5VHJhbnNsYXRvci5EZWZhdWx0VHlwZVRyYW5zbGF0b3I6Om5ldyk7CisgICAgICAgICAgICAgICAgb3JFbHNlR2V0KCgpIC0+IG5ldyBHcm9vdnlUcmFuc2xhdG9yLkRlZmF1bHRUeXBlVHJhbnNsYXRvcihmYWxzZSkpOwogCiAgICAgICAgIGNyZWF0ZUNsYXNzTG9hZGVyKCk7CiAgICAgfQpAQCAtMjkyLDggKzI5Myw5IEBACiAgICAgICAgIGlubmVyLnB1dEFsbChiaW5kaW5ncyk7CiAgICAgICAgIGlubmVyLnB1dEFsbChieXRlY29kZS5nZXRCaW5kaW5ncygpKTsKICAgICAgICAgaW5uZXIucHV0KEhJRERFTl9HLCBiKTsKLQotICAgICAgICByZXR1cm4gKFRyYXZlcnNhbC5BZG1pbikgdGhpcy5ldmFsKEdyb292eVRyYW5zbGF0b3Iub2YoSElEREVOX0csIHR5cGVUcmFuc2xhdG9yKS50cmFuc2xhdGUoYnl0ZWNvZGUpLCBpbm5lcik7CisgICAgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuU2NyaXB0IHNjcmlwdCA9IEdyb292eVRyYW5zbGF0b3Iub2YoSElEREVOX0csIHR5cGVUcmFuc2xhdG9yKS50cmFuc2xhdGUoYnl0ZWNvZGUpOworICAgICAgICBzY3JpcHQuZ2V0UGFyYW1ldGVycygpLmlmUHJlc2VudChpbm5lcjo6cHV0QWxsKTsKKyAgICAgICAgcmV0dXJuIChUcmF2ZXJzYWwuQWRtaW4pIHRoaXMuZXZhbChzY3JpcHQuZ2V0U2NyaXB0KCksIGlubmVyKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyb292eVRyYW5zbGF0b3IuamF2YSBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyb292eVRyYW5zbGF0b3IuamF2YQppbmRleCA1MDVmODhhLi4zOTcxNTc3IDEwMDY0NAotLS0gYS9ncmVtbGluLWdyb292eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9Hcm9vdnlUcmFuc2xhdG9yLmphdmEKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3Jvb3Z5VHJhbnNsYXRvci5qYXZhCkBAIC0yMCwxMCArMjAsMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzOwogCiBpbXBvcnQgZ3Jvb3Z5Lmpzb24uU3RyaW5nRXNjYXBlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkJ5dGVjb2RlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlNhY2tGdW5jdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5TY3JpcHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UZXh0UDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYW5zbGF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CkBAIC00MSwxNCArNDIsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uTGFtYmRhOwogCiBpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaW5hcnlPcGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlVuYXJ5T3BlcmF0b3I7CkBAIC01OCw2ICs1OCw3IEBACiAgKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCiAgKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCisgKiBAYXV0aG9yIFN0YXJrIEFyeWEgKHNhbmRzemhvdS56akBhbGliYWJhLWluYy5jb20pCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBHcm9vdnlUcmFuc2xhdG9yIGltcGxlbWVudHMgVHJhbnNsYXRvci5TY3JpcHRUcmFuc2xhdG9yIHsKIApAQCAtNjksMjAgKzcwLDMyIEBACiAgICAgICAgIHRoaXMudHlwZVRyYW5zbGF0b3IgPSB0eXBlVHJhbnNsYXRvcjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSB0cmFuc2xhdG9yIHdpdGggYSB7QGNvZGUgZmFsc2V9IGFyZ3VtZW50IHRvIHtAY29kZSB3aXRoUGFyYW1ldGVyc30gdXNpbmcKKyAgICAgKiB7QGxpbmsgI29mKFN0cmluZywgYm9vbGVhbil9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3Jvb3Z5VHJhbnNsYXRvciBvZihmaW5hbCBTdHJpbmcgdHJhdmVyc2FsU291cmNlKSB7Ci0gICAgICAgIHJldHVybiBvZih0cmF2ZXJzYWxTb3VyY2UsIG51bGwpOworICAgICAgICByZXR1cm4gb2YodHJhdmVyc2FsU291cmNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgdHJhbnNsYXRvciB3aXRoIHRoZSB7QGxpbmsgRGVmYXVsdFR5cGVUcmFuc2xhdG9yfSBwYXNzaW5nIHRoZSB7QGNvZGUgd2l0aFBhcmFtZXRlcnN9IG9wdGlvbiB0byBpdAorICAgICAqIHdoaWNoIHdpbGwgaGFuZGxlIHR5cGUgdHJhbnNsYXRpb24gaW4gYSBmYXNoaW9uIHRoYXQgc2hvdWxkIHR5cGljYWxseSBpbmNyZWFzZSBjYWNoZSBoaXRzIGFuZCByZWR1Y2UKKyAgICAgKiBjb21waWxhdGlvbiB0aW1lcyBpZiBlbmFibGVkIGF0IHRoZSBzYWNyaWZpY2UgdG8gcmV3cml0aW5nIG9mIHRoZSBzY3JpcHQgdGhhdCBjb3VsZCByZWR1Y2UgcmVhZGFiaWxpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcm9vdnlUcmFuc2xhdG9yIG9mKGZpbmFsIFN0cmluZyB0cmF2ZXJzYWxTb3VyY2UsIGZpbmFsIGJvb2xlYW4gd2l0aFBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIG9mKHRyYXZlcnNhbFNvdXJjZSwgbmV3IERlZmF1bHRUeXBlVHJhbnNsYXRvcih3aXRoUGFyYW1ldGVycykpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3Jvb3Z5VHJhbnNsYXRvciBvZihmaW5hbCBTdHJpbmcgdHJhdmVyc2FsU291cmNlLCBmaW5hbCBUeXBlVHJhbnNsYXRvciB0eXBlVHJhbnNsYXRvcikgewotICAgICAgICByZXR1cm4gbmV3IEdyb292eVRyYW5zbGF0b3IodHJhdmVyc2FsU291cmNlLAotICAgICAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUodHlwZVRyYW5zbGF0b3IpLm9yRWxzZUdldChEZWZhdWx0VHlwZVRyYW5zbGF0b3I6Om5ldykpOworICAgICAgICByZXR1cm4gbmV3IEdyb292eVRyYW5zbGF0b3IodHJhdmVyc2FsU291cmNlLCB0eXBlVHJhbnNsYXRvcik7CiAgICAgfQogCiAgICAgLy8vLy8vLwogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0cmFuc2xhdGUoZmluYWwgQnl0ZWNvZGUgYnl0ZWNvZGUpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVUcmFuc2xhdG9yLmFwcGx5KHRyYXZlcnNhbFNvdXJjZSwgYnl0ZWNvZGUpLnRvU3RyaW5nKCk7CisgICAgcHVibGljIFNjcmlwdCB0cmFuc2xhdGUoZmluYWwgQnl0ZWNvZGUgYnl0ZWNvZGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVUcmFuc2xhdG9yLmFwcGx5KHRyYXZlcnNhbFNvdXJjZSwgYnl0ZWNvZGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA0LDEyNyArMTE3LDE5NyBAQAogICAgICAqIFBlcmZvcm1zIHN0YW5kYXJkIHR5cGUgdHJhbnNsYXRpb24gZm9yIHRoZSBUaW5rZXJQb3AgdHlwZXMgdG8gR3Jvb3Z5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdFR5cGVUcmFuc2xhdG9yIGltcGxlbWVudHMgVHlwZVRyYW5zbGF0b3IgeworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB3aXRoUGFyYW1ldGVyczsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFNjcmlwdCBzY3JpcHQ7CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoZmluYWwgU3RyaW5nIHRyYXZlcnNhbFNvdXJjZSwgZmluYWwgT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQnl0ZWNvZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGludGVybmFsVHJhbnNsYXRlKHRyYXZlcnNhbFNvdXJjZSwgKEJ5dGVjb2RlKSBvKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFRvU3RyaW5nKG8pOworICAgICAgICBwdWJsaWMgRGVmYXVsdFR5cGVUcmFuc2xhdG9yKGZpbmFsIGJvb2xlYW4gd2l0aFBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgdGhpcy53aXRoUGFyYW1ldGVycyA9IHdpdGhQYXJhbWV0ZXJzOworICAgICAgICAgICB0aGlzLnNjcmlwdCA9IG5ldyBTY3JpcHQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCeXRlY29kZS5CaW5kaW5nKQotICAgICAgICAgICAgICAgIHJldHVybiAoKEJ5dGVjb2RlLkJpbmRpbmcpIG9iamVjdCkudmFyaWFibGUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJ5dGVjb2RlKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNjcmlwdCBhcHBseShmaW5hbCBTdHJpbmcgdHJhdmVyc2FsU291cmNlLCBmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgdGhpcy5zY3JpcHQuaW5pdCgpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCeXRlY29kZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFRyYW5zbGF0ZSh0cmF2ZXJzYWxTb3VyY2UsIChCeXRlY29kZSkgbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TY3JpcHQobyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogIEZvciBlYWNoIG9wZXJhdG9yIGFyZ3VtZW50LCBpZiB3aXRoUGFyYW1ldGVycyBzZXQgdHJ1ZSwgdHJ5IHBhcmFtZXRyaXphdGlvbiBhcyBmb2xsb3dzOgorICAgICAgICAgKgorICAgICAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICogIGlmIHVucGFjaywgd2h5ID8gICAgIE9iamVjdFR5cGUKKyAgICAgICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAqIO+8iFllc++8iSAgICAgICAgICAgICAgICBCeXRlY29kZS5CaW5kaW5nCisgICAgICAgICAqIO+8iFJlY3Vyc2lvbiwgTm/vvIkgICAgICBCeXRlY29kZQorICAgICAgICAgKiAgKFJlY3Vyc2lvbiwgTm/vvIkgICAgICBUcmF2ZXJzYWwKKyAgICAgICAgICog77yIWWVz77yJICAgICAgICAgICAgICAgIFN0cmluZworICAgICAgICAgKiDvvIhSZWN1cnNpb24sIE5v77yJICAgICAgU2V0CisgICAgICAgICAqIO+8iFJlY3Vyc2lvbiwgTm/vvIkgICAgICBMaXN0CisgICAgICAgICAqIO+8iFJlY3Vyc2lvbiwgTm/vvIkgICAgICBNYXAKKyAgICAgICAgICog77yIWWVz77yJICAgICAgICAgICAgICAgIExvbmcKKyAgICAgICAgICog77yIWWVz77yJICAgICAgICAgICAgICAgIERvdWJsZQorICAgICAgICAgKiDvvIhZZXPvvIkgICAgICAgICAgICAgICAgRmxvYXQKKyAgICAgICAgICog77yIWWVz77yJICAgICAgICAgICAgICAgIEludGVnZXIKKyAgICAgICAgICog77yIWWVz77yJICAgICAgICAgICAgICAgIFRpbWVzdGFtcAorICAgICAgICAgKiDvvIhZZXPvvIkgICAgICAgICAgICAgICAgRGF0ZQorICAgICAgICAgKiDvvIhZZXPvvIkgICAgICAgICAgICAgICAgVXVpZAorICAgICAgICAgKiDvvIhSZWN1cnNpb24sIE5v77yJICAgICAgUAorICAgICAgICAgKiDvvIhFbnVtZXJhdGlvbiwgTm/vvIkgICAgU2Fja0Z1bmN0aW9ucy5CYXJyaWVyCisgICAgICAgICAqIO+8iEVudW1lcmF0aW9uLCBOb++8iSAgICBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eQorICAgICAgICAgKiDvvIhFbnVtZXJhdGlvbiwgTm/vvIkgICAgVHJhdmVyc2FsT3B0aW9uUGFyZW50LlBpY2sKKyAgICAgICAgICog77yIRW51bWVyYXRpb24sIE5v77yJICAgIEVudW0KKyAgICAgICAgICog77yIUmVjdXJzaW9uLCBOb++8iSAgICAgIFZlcnRleAorICAgICAgICAgKiDvvIhSZWN1cnNpb24sIE5v77yJICAgICAgRWRnZQorICAgICAgICAgKiDvvIhSZWN1cnNpb24sIE5v77yJICAgICAgVmVydGV4UHJvcGVydHkKKyAgICAgICAgICog77yIWWVz77yJICAgICAgICAgICAgICAgIExhbWJkYQorICAgICAgICAgKiDvvIhSZWN1cnNpb24sIE5v77yJICAgICAgVHJhdmVyc2FsU3RyYXRlZ3lQcm94eQorICAgICAgICAgKiDvvIhFbnVtZXJhdGlvbiwgTm/vvIkgICAgVHJhdmVyc2FsU3RyYXRlZ3kKKyAgICAgICAgICogIChZZXMpICAgICAgICAgICAgICAgICBPdGhlcgorICAgICAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIFJlcHJlcworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIFNjcmlwdCBjb252ZXJ0VG9TY3JpcHQoZmluYWwgT2JqZWN0IG9iamVjdCkgeworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJ5dGVjb2RlLkJpbmRpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmdldEJvdW5kS2V5T3JBc3NpZ24od2l0aFBhcmFtZXRlcnMsICgoQnl0ZWNvZGUuQmluZGluZykgb2JqZWN0KS52YXJpYWJsZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnl0ZWNvZGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxUcmFuc2xhdGUoIl9fIiwgKEJ5dGVjb2RlKSBvYmplY3QpOwotICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVHJhdmVyc2FsKQotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdHJpbmcoKChUcmF2ZXJzYWwpIG9iamVjdCkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoKFN0cmluZykgb2JqZWN0KS5jb250YWlucygiXCIiKSA/ICJcIlwiXCIiICsgU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSmF2YSgoU3RyaW5nKSBvYmplY3QpICsgIlwiXCJcIiIgOiAiXCIiICsgU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSmF2YSgoU3RyaW5nKSBvYmplY3QpICsgIlwiIikKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVHJhdmVyc2FsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1NjcmlwdCgoKFRyYXZlcnNhbCkgb2JqZWN0KS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3cmFwcGVyID0gKCgoU3RyaW5nKSBvYmplY3QpLmNvbnRhaW5zKCJcIiIpID8gIlwiXCJcIiIgKyBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVKYXZhKChTdHJpbmcpIG9iamVjdCkgKyAiXCJcIlwiIiA6ICJcIiIgKyBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVKYXZhKChTdHJpbmcpIG9iamVjdCkgKyAiXCIiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIiQiLCAiXFwkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5nZXRCb3VuZEtleU9yQXNzaWduKHdpdGhQYXJhbWV0ZXJzLCB3aXRoUGFyYW1ldGVycyA/IG9iamVjdCA6IHdyYXBwZXIpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXQpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDw+KCgoU2V0KSBvYmplY3QpLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgaXRlbSA6IChTZXQpIG9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGNvbnZlcnRUb1N0cmluZyhpdGVtKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzZXQudG9TdHJpbmcoKSArICIgYXMgU2V0IjsKKyAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoKChTZXQpb2JqZWN0KS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmFwcGVuZCgiIGFzIFNldCIpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKChMaXN0KSBvYmplY3QpLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgaXRlbSA6IChMaXN0KSBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoY29udmVydFRvU3RyaW5nKGl0ZW0pKTsKKyAgICAgICAgICAgICAgICBJdGVyYXRvcjw/PiBpdGVyYXRvciA9ICgoTGlzdClvYmplY3QpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaWYgKCEgaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuYXBwZW5kKCJbXSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIlsiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7OykgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlID0gIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdChlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuYXBwZW5kKCJdIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIiwiKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbGlzdC50b1N0cmluZygpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1hcCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbIik7CisgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiWyIpOwogICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PD8sID8+IGVudHJ5IDogKChNYXA8PywgPz4pIG9iamVjdCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBtYXAuYXBwZW5kKCIoIikuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKGNvbnZlcnRUb1N0cmluZyhlbnRyeS5nZXRLZXkoKSkpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiKTooIikuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKGNvbnZlcnRUb1N0cmluZyhlbnRyeS5nZXRWYWx1ZSgpKSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCIpLCIpOworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIoIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIik6KCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIiksIik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gb25seSBuZWVkIHRvIHJlbW92ZSB0aGlzIGxhc3QgYml0IGlmIGVudHJpZXMgd2VyZSBhZGRlZAotICAgICAgICAgICAgICAgIGlmICghKChNYXA8PywgPz4pIG9iamVjdCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlQ2hhckF0KG1hcC5sZW5ndGgoKSAtIDEpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5hcHBlbmQoIl0iKS50b1N0cmluZygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgKyAiTCI7Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCArICJkIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZsb2F0KQotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgKyAiZiI7Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICAgICAgICAgIHJldHVybiAiKGludCkgIiArIG9iamVjdDsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzKQotICAgICAgICAgICAgICAgIHJldHVybiAoKENsYXNzKSBvYmplY3QpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRpbWVzdGFtcCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyBqYXZhLnNxbC5UaW1lc3RhbXAoIiArICgoVGltZXN0YW1wKSBvYmplY3QpLmdldFRpbWUoKSArICIpIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJuZXcgamF2YS51dGlsLkRhdGUoIiArICgoRGF0ZSkgb2JqZWN0KS5nZXRUaW1lKCkgKyAiKSI7Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBVVUlEKQotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS51dGlsLlVVSUQuZnJvbVN0cmluZygnIiArIG9iamVjdC50b1N0cmluZygpICsgIicpIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRQVG9TdHJpbmcoKFApIG9iamVjdCwgbmV3IFN0cmluZ0J1aWxkZXIoKSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNhY2tGdW5jdGlvbnMuQmFycmllcikKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNhY2tGdW5jdGlvbnMuQmFycmllci4iICsgb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eSkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LiIgKyBvYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRyYXZlcnNhbE9wdGlvblBhcmVudC5QaWNrKQotICAgICAgICAgICAgICAgIHJldHVybiAiVHJhdmVyc2FsT3B0aW9uUGFyZW50LlBpY2suIiArIG9iamVjdC50b1N0cmluZygpOwotICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRW51bSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKChFbnVtKSBvYmplY3QpLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIi4iICsgb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKCEoKE1hcDw/LCA/Pikgb2JqZWN0KS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5zZXRDaGFyQXRFbmQoJ10nKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmFwcGVuZCgiXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuZ2V0Qm91bmRLZXlPckFzc2lnbih3aXRoUGFyYW1ldGVycywgd2l0aFBhcmFtZXRlcnMgPyBvYmplY3QgOiBvYmplY3QgKyAiTCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmdldEJvdW5kS2V5T3JBc3NpZ24od2l0aFBhcmFtZXRlcnMsIHdpdGhQYXJhbWV0ZXJzID8gb2JqZWN0IDogb2JqZWN0ICsgImQiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRmxvYXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmdldEJvdW5kS2V5T3JBc3NpZ24od2l0aFBhcmFtZXRlcnMsIHdpdGhQYXJhbWV0ZXJzID8gb2JqZWN0IDogb2JqZWN0ICsgImYiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuZ2V0Qm91bmRLZXlPckFzc2lnbih3aXRoUGFyYW1ldGVycywgd2l0aFBhcmFtZXRlcnMgPyBvYmplY3QgOiAiKGludCkgIiArIG9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5hcHBlbmQoKChDbGFzcykgb2JqZWN0KS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUaW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmdldEJvdW5kS2V5T3JBc3NpZ24od2l0aFBhcmFtZXRlcnMsIHdpdGhQYXJhbWV0ZXJzID8gb2JqZWN0IDogIm5ldyBqYXZhLnNxbC5UaW1lc3RhbXAoIiArICgoVGltZXN0YW1wKSBvYmplY3QpLmdldFRpbWUoKSArICIpIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmdldEJvdW5kS2V5T3JBc3NpZ24od2l0aFBhcmFtZXRlcnMsIHdpdGhQYXJhbWV0ZXJzID8gb2JqZWN0IDogIm5ldyBqYXZhLnV0aWwuRGF0ZSgiICsgKChEYXRlKSBvYmplY3QpLmdldFRpbWUoKSArICIpIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVVSUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmdldEJvdW5kS2V5T3JBc3NpZ24od2l0aFBhcmFtZXRlcnMsIHdpdGhQYXJhbWV0ZXJzID8gb2JqZWN0IDogImphdmEudXRpbC5VVUlELmZyb21TdHJpbmcoJyIgKyBvYmplY3QudG9TdHJpbmcoKSArICInKSIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRQVG9TY3JpcHQoKFApIG9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNhY2tGdW5jdGlvbnMuQmFycmllcikgeworICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuYXBwZW5kKCJTYWNrRnVuY3Rpb25zLkJhcnJpZXIuIiArIG9iamVjdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmFwcGVuZCgiVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkuIiArIG9iamVjdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVHJhdmVyc2FsT3B0aW9uUGFyZW50LlBpY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmFwcGVuZCgiVHJhdmVyc2FsT3B0aW9uUGFyZW50LlBpY2suIiArIG9iamVjdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRW51bSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuYXBwZW5kKCgoRW51bSkgb2JqZWN0KS5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIuIiArIG9iamVjdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkgewogICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBWZXJ0ZXgpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleCA9IChWZXJ0ZXgpIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuZXcgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5kZXRhY2hlZC5EZXRhY2hlZFZlcnRleCgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcodmVydGV4LmlkKCkpICsgIiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcodmVydGV4LmxhYmVsKCkpICsgIiwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkiOworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCJuZXcgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5kZXRhY2hlZC5EZXRhY2hlZFZlcnRleCgiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU2NyaXB0KHZlcnRleC5pZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQodmVydGV4LmxhYmVsKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmFwcGVuZCgiLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRnZSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBFZGdlIGVkZ2UgPSAoRWRnZSkgb2JqZWN0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkRWRnZSgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcoZWRnZS5pZCgpKSArICIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKGVkZ2UubGFiZWwoKSkgKyAiLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1N0cmluZyhlZGdlLm91dFZlcnRleCgpLmlkKCkpICsgIiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcoZWRnZS5vdXRWZXJ0ZXgoKS5sYWJlbCgpKSArICIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKGVkZ2UuaW5WZXJ0ZXgoKS5pZCgpKSArICIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKGVkZ2UuaW5WZXJ0ZXgoKS5sYWJlbCgpKSArICIpIjsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgibmV3IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZGV0YWNoZWQuRGV0YWNoZWRFZGdlKCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoZWRnZS5pZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoZWRnZS5sYWJlbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCJDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoZWRnZS5vdXRWZXJ0ZXgoKS5pZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoZWRnZS5vdXRWZXJ0ZXgoKS5sYWJlbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoZWRnZS5pblZlcnRleCgpLmlkKCkpOworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdChlZGdlLmluVmVydGV4KCkubGFiZWwoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuYXBwZW5kKCIpIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsvLyBWZXJ0ZXhQcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICBmaW5hbCBWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSA9IChWZXJ0ZXhQcm9wZXJ0eSkgb2JqZWN0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkVmVydGV4UHJvcGVydHkoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKHZlcnRleFByb3BlcnR5LmlkKCkpICsgIiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcodmVydGV4UHJvcGVydHkubGFiZWwoKSkgKyAiLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1N0cmluZyh2ZXJ0ZXhQcm9wZXJ0eS52YWx1ZSgpKSArICIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbGxlY3Rpb25zLmVtcHR5TWFwKCksIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKHZlcnRleFByb3BlcnR5LmVsZW1lbnQoKSkgKyAiKSI7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIm5ldyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkVmVydGV4UHJvcGVydHkoIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdCh2ZXJ0ZXhQcm9wZXJ0eS5pZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQodmVydGV4UHJvcGVydHkubGFiZWwoKSk7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU2NyaXB0KHZlcnRleFByb3BlcnR5LnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIkNvbGxlY3Rpb25zLmVtcHR5TWFwKCksIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdCh2ZXJ0ZXhQcm9wZXJ0eS5lbGVtZW50KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmFwcGVuZCgiKSIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTGFtYmRhKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhbWJkYVN0cmluZyA9ICgoTGFtYmRhKSBvYmplY3QpLmdldExhbWJkYVNjcmlwdCgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFtYmRhU3RyaW5nLnN0YXJ0c1dpdGgoInsiKSA/IGxhbWJkYVN0cmluZyA6ICJ7IiArIGxhbWJkYVN0cmluZyArICJ9IjsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd3JhcHBlciA9IGxhbWJkYVN0cmluZy5zdGFydHNXaXRoKCJ7IikgPyBsYW1iZGFTdHJpbmcgOiAieyIgKyBsYW1iZGFTdHJpbmcgKyAifSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5nZXRCb3VuZEtleU9yQXNzaWduKHdpdGhQYXJhbWV0ZXJzLCB3aXRoUGFyYW1ldGVycyA/IG9iamVjdCA6IHdyYXBwZXIpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUcmF2ZXJzYWxTdHJhdGVneVByb3h5KSB7CiAgICAgICAgICAgICAgICAgZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3lQcm94eSBwcm94eSA9IChUcmF2ZXJzYWxTdHJhdGVneVByb3h5KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3h5LmdldENvbmZpZ3VyYXRpb24oKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRTdHJhdGVneUNsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIi5pbnN0YW5jZSgpIjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRTdHJhdGVneUNsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIi5jcmVhdGUobmV3IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb24oIiArIGNvbnZlcnRUb1N0cmluZyhDb25maWd1cmF0aW9uQ29udmVydGVyLmdldE1hcChwcm94eS5nZXRDb25maWd1cmF0aW9uKCkpKSArICIpKSI7CisgICAgICAgICAgICAgICAgaWYgKHByb3h5LmdldENvbmZpZ3VyYXRpb24oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5hcHBlbmQocHJveHkuZ2V0U3RyYXRlZ3lDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIuaW5zdGFuY2UoKSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQocHJveHkuZ2V0U3RyYXRlZ3lDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIuY3JlYXRlKG5ldyBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbigiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU2NyaXB0KENvbmZpZ3VyYXRpb25Db252ZXJ0ZXIuZ2V0TWFwKHByb3h5LmdldENvbmZpZ3VyYXRpb24oKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0LmFwcGVuZCgiKSkiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRyYXZlcnNhbFN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0cmluZyhuZXcgVHJhdmVyc2FsU3RyYXRlZ3lQcm94eSgoKFRyYXZlcnNhbFN0cmF0ZWd5KSBvYmplY3QpKSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBvYmplY3QgPyAibnVsbCIgOiBvYmplY3QudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFRvU2NyaXB0KG5ldyBUcmF2ZXJzYWxTdHJhdGVneVByb3h5KCgoVHJhdmVyc2FsU3RyYXRlZ3kpIG9iamVjdCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gb2JqZWN0ID8gc2NyaXB0LmFwcGVuZCgibnVsbCIpIDogc2NyaXB0LmdldEJvdW5kS2V5T3JBc3NpZ24od2l0aFBhcmFtZXRlcnMsIG9iamVjdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGludGVybmFsVHJhbnNsYXRlKGZpbmFsIFN0cmluZyBzdGFydCwgZmluYWwgQnl0ZWNvZGUgYnl0ZWNvZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdHJhdmVyc2FsU2NyaXB0ID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RhcnQpOworICAgICAgICBwcm90ZWN0ZWQgU2NyaXB0IGludGVybmFsVHJhbnNsYXRlKGZpbmFsIFN0cmluZyBzdGFydCwgZmluYWwgQnl0ZWNvZGUgYnl0ZWNvZGUpIHsKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoc3RhcnQpOwogICAgICAgICAgICAgZm9yIChmaW5hbCBCeXRlY29kZS5JbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA6IGJ5dGVjb2RlLmdldEluc3RydWN0aW9ucygpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUgPSBpbnN0cnVjdGlvbi5nZXRPcGVyYXRvcigpOwotICAgICAgICAgICAgICAgIGlmICgwID09IGluc3RydWN0aW9uLmdldEFyZ3VtZW50cygpLmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsU2NyaXB0LmFwcGVuZCgiLiIpLmFwcGVuZChtZXRob2ROYW1lKS5hcHBlbmQoIigpIik7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbFNjcmlwdC5hcHBlbmQoIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBtZXRob2ROYW1lICsgIigiOworICAgICAgICAgICAgICAgIGlmICgwID09IGluc3RydWN0aW9uLmdldEFyZ3VtZW50cygpLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIuIikuYXBwZW5kKG1ldGhvZE5hbWUpLmFwcGVuZCgiKCkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIuIikuYXBwZW5kKG1ldGhvZE5hbWUpLmFwcGVuZCgiKCIpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gc3BlY2lhbCBjYXNlIHdpdGhTYWNrKCkgZm9yIEdyb292eSBiZWNhdXNlIFVuYXJ5T3BlcmF0b3IgYW5kIEJpbmFyeU9wZXJhdG9yIHNpZ25hdHVyZXMKICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBpdCBpbXBvc3NpYmxlIGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gZmlndXJlIG91dCB3aGljaCBmdW5jdGlvbiB0byBjYWxsLiBzcGVjaWZpY2FsbHkgd2UgbmVlZApAQCAtMjQyLDM5ICszMjUsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjYXN0U2Vjb25kQXJnVG8gPSBzZWNvbmRBcmcuZ2V0TGFtYmRhQXJndW1lbnRzKCkgPT0gMSA/IFVuYXJ5T3BlcmF0b3IuY2xhc3MuZ2V0TmFtZSgpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IuY2xhc3MuZ2V0TmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXN0Rmlyc3RBcmdUby5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyBTdHJpbmcuZm9ybWF0KCIoJXMpICIsIGNhc3RGaXJzdEFyZ1RvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wICsgU3RyaW5nLmZvcm1hdCgiJXMsICglcykgJXMsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKGluc3RydWN0aW9uLmdldEFyZ3VtZW50cygpWzBdKSwgY2FzdFNlY29uZEFyZ1RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcoaW5zdHJ1Y3Rpb24uZ2V0QXJndW1lbnRzKClbMV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiglcykgIiwgY2FzdEZpcnN0QXJnVG8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdChpbnN0cnVjdGlvbi5nZXRBcmd1bWVudHMoKVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIsICgiKS5hcHBlbmQoY2FzdFNlY29uZEFyZ1RvKS5hcHBlbmQoIikgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQoaW5zdHJ1Y3Rpb24uZ2V0QXJndW1lbnRzKClbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLCIpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3Qgb2JqZWN0IDogaW5zdHJ1Y3Rpb24uZ2V0QXJndW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCArIGNvbnZlcnRUb1N0cmluZyhvYmplY3QpICsgIiwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdChvYmplY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzYWxTY3JpcHQuYXBwZW5kKHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoKCkgLSAxKSkuYXBwZW5kKCIpIik7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRDaGFyQXRFbmQoJyknKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJhdmVyc2FsU2NyaXB0LnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gc2NyaXB0OwogICAgICAgICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZ0J1aWxkZXIgY29udmVydFBUb1N0cmluZyhmaW5hbCBQIHAsIGZpbmFsIFN0cmluZ0J1aWxkZXIgY3VycmVudCkgewotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBUZXh0UCkgcmV0dXJuIGNvbnZlcnRUZXh0UFRvU3RyaW5nKChUZXh0UCkgcCwgY3VycmVudCk7CisgICAgICAgIHByb3RlY3RlZCBTY3JpcHQgY29udmVydFBUb1NjcmlwdChmaW5hbCBQIHApIHsKKyAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgVGV4dFApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFRleHRQVG9TY3JpcHQoKFRleHRQKSBwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgQ29ubmVjdGl2ZVApIHsKICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFA8Pz4+IGxpc3QgPSAoKENvbm5lY3RpdmVQKSBwKS5nZXRQcmVkaWNhdGVzKCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQVG9TdHJpbmcobGlzdC5nZXQoaSksIGN1cnJlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxpc3Quc2l6ZSgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYXBwZW5kKHAgaW5zdGFuY2VvZiBPclAgPyAiLm9yKCIgOiAiLmFuZCgiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFBUb1NjcmlwdChsaXN0LmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGlzdC5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKHAgaW5zdGFuY2VvZiBPclAgPyAiLm9yKCIgOiAiLmFuZCgiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50LmFwcGVuZCgiKSIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY3VycmVudC5hcHBlbmQoIlAuIikuYXBwZW5kKHAuZ2V0QmlQcmVkaWNhdGUoKS50b1N0cmluZygpKS5hcHBlbmQoIigiKS5hcHBlbmQoY29udmVydFRvU3RyaW5nKHAuZ2V0VmFsdWUoKSkpLmFwcGVuZCgiKSIpOwotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiKSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCJQLiIpLmFwcGVuZChwLmdldEJpUHJlZGljYXRlKCkudG9TdHJpbmcoKSkuYXBwZW5kKCIoIik7CisgICAgICAgICAgICAgICAgY29udmVydFRvU2NyaXB0KHAuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNjcmlwdDsKICAgICAgICAgfQogCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmdCdWlsZGVyIGNvbnZlcnRUZXh0UFRvU3RyaW5nKGZpbmFsIFRleHRQIHAsIGZpbmFsIFN0cmluZ0J1aWxkZXIgY3VycmVudCkgewotICAgICAgICAgICAgY3VycmVudC5hcHBlbmQoIlRleHRQLiIpLmFwcGVuZChwLmdldEJpUHJlZGljYXRlKCkudG9TdHJpbmcoKSkuYXBwZW5kKCIoIikuYXBwZW5kKGNvbnZlcnRUb1N0cmluZyhwLmdldFZhbHVlKCkpKS5hcHBlbmQoIikiKTsKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50OworICAgICAgICBwcm90ZWN0ZWQgU2NyaXB0IGNvbnZlcnRUZXh0UFRvU2NyaXB0KGZpbmFsIFRleHRQIHApIHsKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIlRleHRQLiIpLmFwcGVuZChwLmdldEJpUHJlZGljYXRlKCkudG9TdHJpbmcoKSkuYXBwZW5kKCIoIik7CisgICAgICAgICAgICBjb252ZXJ0VG9TY3JpcHQocC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIHJldHVybiBzY3JpcHQ7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2VuZ2luZS9HcmVtbGluRXhlY3V0b3JUZXN0LmphdmEgYi9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2VuZ2luZS9HcmVtbGluRXhlY3V0b3JUZXN0LmphdmEKaW5kZXggMjI2YTNmNy4uNTBlMWFlYyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9lbmdpbmUvR3JlbWxpbkV4ZWN1dG9yVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvZW5naW5lL0dyZW1saW5FeGVjdXRvclRlc3QuamF2YQpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHRpbWVPdXRDb3VudCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKIAogICAgICAgICBmaW5hbCBHcmVtbGluRXhlY3V0b3IgZ3JlbWxpbkV4ZWN1dG9yID0gR3JlbWxpbkV4ZWN1dG9yLmJ1aWxkKCkKLSAgICAgICAgICAgICAgICAuc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQoMjUwKQorICAgICAgICAgICAgICAgIC5ldmFsdWF0aW9uVGltZW91dCgyNTApCiAgICAgICAgICAgICAgICAgLmFmdGVyRmFpbHVyZSgoYiwgZSkgLT4gZmFpbHVyZUNhbGxlZC5zZXQodHJ1ZSkpCiAgICAgICAgICAgICAgICAgLmFmdGVyU3VjY2VzcygoYikgLT4gc3VjY2Vzc0NhbGxlZC5zZXQodHJ1ZSkpCiAgICAgICAgICAgICAgICAgLmFmdGVyVGltZW91dCgoYikgLT4gdGltZU91dENvdW50LmNvdW50RG93bigpKS5jcmVhdGUoKTsKQEAgLTMyMSwxMyArMzIxLDEzIEBACiAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHRpbWVPdXRDb3VudCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKIAogICAgICAgICBmaW5hbCBHcmVtbGluRXhlY3V0b3IgZ3JlbWxpbkV4ZWN1dG9yID0gR3JlbWxpbkV4ZWN1dG9yLmJ1aWxkKCkKLSAgICAgICAgICAgICAgICAuc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQoMTAwMDApCisgICAgICAgICAgICAgICAgLmV2YWx1YXRpb25UaW1lb3V0KDEwMDAwKQogICAgICAgICAgICAgICAgIC5hZnRlckZhaWx1cmUoKGIsIGUpIC0+IGZhaWx1cmVDYWxsZWQuc2V0KHRydWUpKQogICAgICAgICAgICAgICAgIC5hZnRlclN1Y2Nlc3MoKGIpIC0+IHN1Y2Nlc3NDYWxsZWQuc2V0KHRydWUpKQogICAgICAgICAgICAgICAgIC5hZnRlclRpbWVvdXQoKGIpIC0+IHRpbWVPdXRDb3VudC5jb3VudERvd24oKSkuY3JlYXRlKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBHcmVtbGluRXhlY3V0b3IuTGlmZUN5Y2xlIGxpZmVDeWNsZSA9IEdyZW1saW5FeGVjdXRvci5MaWZlQ3ljbGUuYnVpbGQoKQotICAgICAgICAgICAgICAgICAgICAuc2NyaXB0RXZhbHVhdGlvblRpbWVvdXRPdmVycmlkZSgyNTBMKS5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgLmV2YWx1YXRpb25UaW1lb3V0T3ZlcnJpZGUoMjUwTCkuY3JlYXRlKCk7CiAgICAgICAgICAgICBncmVtbGluRXhlY3V0b3IuZXZhbCgiVGhyZWFkLnNsZWVwKDEwMDApOzEwIiwgImdyZW1saW4tZ3Jvb3Z5IiwgbmV3IFNpbXBsZUJpbmRpbmdzKCksIGxpZmVDeWNsZSkuZ2V0KCk7CiAgICAgICAgICAgICBmYWlsKCJUaGlzIHNjcmlwdCBzaG91bGQgaGF2ZSB0aW1lZCBvdXQgd2l0aCBhbiBleGNlcHRpb24iKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CkBAIC00NjAsMTUgKzQ2MCwxNSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRDYW5jZWxUaW1lb3V0T25TdWNjZXNzZnVsU2NyaXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGxvbmcgc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQgPSA1XzAwMDsKKyAgICAgICAgZmluYWwgbG9uZyBldmFsdWF0aW9uVGltZW91dCA9IDVfMDAwOwogICAgICAgICBmaW5hbCBHcmVtbGluRXhlY3V0b3IgZ3JlbWxpbkV4ZWN1dG9yID0gR3JlbWxpbkV4ZWN1dG9yLmJ1aWxkKCkKLSAgICAgICAgICAgICAgICAuc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQoc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQpCisgICAgICAgICAgICAgICAgLmV2YWx1YXRpb25UaW1lb3V0KGV2YWx1YXRpb25UaW1lb3V0KQogICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKIAogICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZ3JlbWxpbkV4ZWN1dG9yLmV2YWwoIjErMSIpLmdldCgpKTsKICAgICAgICAgZ3JlbWxpbkV4ZWN1dG9yLmNsb3NlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBub3cgPCBzY3JpcHRFdmFsdWF0aW9uVGltZW91dCk7CisgICAgICAgIGFzc2VydFRydWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBub3cgPCBldmFsdWF0aW9uVGltZW91dCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmVUZXN0LmphdmEgYi9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9HcmVtbGluR3Jvb3Z5U2NyaXB0RW5naW5lVGVzdC5qYXZhCmluZGV4IGQ0MGRjMTkuLmEyYjgxMjcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmVUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3JlbWxpbkdyb292eVNjcmlwdEVuZ2luZVRlc3QuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuZXhjZXB0aW9uLkV4Y2VwdGlvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5jb25jdXJyZW50LkJhc2ljVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5EZWZhdWx0SW1wb3J0Q3VzdG9taXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uTGFtYmRhOwogaW1wb3J0IG9yZy5qYXZhdHVwbGVzLlBhaXI7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0xMDMsNyArMTA0LDcgQEAKICAgICBwdWJsaWMgdm9pZCBzaG91bGRQcm9tb3RlRGVmaW5lZFZhcnNJbkludGVycHJldGVyTW9kZVdpdGhOb0JpbmRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIEdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUgZW5naW5lID0gbmV3IEdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUobmV3IEludGVycHJldGVyTW9kZUdyb292eUN1c3RvbWl6ZXIoKSk7CiAgICAgICAgIGVuZ2luZS5ldmFsKCJkZWYgYWRkSXRVcCA9IHsgeCwgeSAtPiB4ICsgeSB9Iik7Ci0gICAgICAgIGVuZ2luZS5ldmFsKCJkZWYgY2xhc3MgQSB7IGRlZiBzdWIoaW50IHgsIGludCB5KSB7eCAtIHl9fSIpOworICAgICAgICBlbmdpbmUuZXZhbCgiY2xhc3MgQSB7IGRlZiBzdWIoaW50IHgsIGludCB5KSB7eCAtIHl9fSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMywgZW5naW5lLmV2YWwoImludCB4eHggPSAxICsgMiIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGVuZ2luZS5ldmFsKCJ5eXkgPSB4eHggKyAxIikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoNywgZW5naW5lLmV2YWwoImRlZiB6enogPSB5eXkgKyB4eHgiKSk7CkBAIC00MTMsNCArNDE0LDE2IEBACiAgICAgICAgIGZpbmFsIExhbWJkYSBsID0gKExhbWJkYSkgZW5naW5lLmV2YWwoIiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uTGFtYmRhLmZ1bmN0aW9uKFwieyBpdC5nZXQoKSB9XCIpIik7CiAgICAgICAgIGFzc2VydEVxdWFscygieyBpdC5nZXQoKSB9IiwgbC5nZXRMYW1iZGFTY3JpcHQoKSk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgVElOS0VSUE9QLTIzOTQgVW5hYmxlIHRvIHVzZSBfXyBjbGFzcyBvZiBhIGN1c3RvbSBEU0wgd2hlbiBwYXNzaW5nIGEgc2NyaXB0IGV2ZW4gaWYgdGhpcyBjbGFzcyBpcyBpbXBvcnRlZAorICAgICAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY3VzdG9taXplclNob3VsZE92ZXJyaWRlQ29yZUltcG9ydHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGVmYXVsdEltcG9ydEN1c3RvbWl6ZXIgY3VzdG9taXplciA9IERlZmF1bHRJbXBvcnRDdXN0b21pemVyLmJ1aWxkKCkKKwkJCQkuYWRkQ2xhc3NJbXBvcnRzKG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZ3Jvb3Z5LmpzcjIyMy5kc2wuY3JlZGVudGlhbC5fXy5jbGFzcykKKwkJCQkuY3JlYXRlKCk7CisJCWZpbmFsIEdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUgZW5naW5lID0gbmV3IEdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUoY3VzdG9taXplcik7CisJCWVuZ2luZS5ldmFsKCJfXy51c2VycygpO1tdIik7CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyb292eVRyYW5zbGF0b3JQcm92aWRlci5qYXZhIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3Jvb3Z5VHJhbnNsYXRvclByb3ZpZGVyLmphdmEKaW5kZXggNWY1NTZiOC4uYjRkMjQ1MiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3Jvb3Z5VHJhbnNsYXRvclByb3ZpZGVyLmphdmEKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3Jvb3Z5VHJhbnNsYXRvclByb3ZpZGVyLmphdmEKQEAgLTIwNywxMCArMjA3LDYgQEAKICAgICAgICAgbWV0aG9kID0gInNob3VsZE5ldmVyUHJvcGFnYXRlQU5vQnVsa1RyYXZlcnNlciIsCiAgICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCiBAR3JhcGguT3B0T3V0KAotICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQ29yZVRyYXZlcnNhbFRlc3QiLAotICAgICAgICBtZXRob2QgPSAic2hvdWxkTmV2ZXJQcm9wYWdhdGVBTnVsbFZhbHVlZFRyYXZlcnNlciIsCi0gICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCi1AR3JhcGguT3B0T3V0KAogICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuUmVhZFRlc3QiLAogICAgICAgICBtZXRob2QgPSAiKiIsCiAgICAgICAgIHJlYXNvbiA9ICJyZWFkIGFuZCB3cml0ZSB0ZXN0cyBkb24ndCB0cmFuc2xhdGUgbG9jYWxseSB3ZWxsIGJlY2F1c2Ugb2YgY2FsbGluZyBpdGVyYXRlKCkgaW5zaWRlIHJlYWQoKS93cml0ZSgpIGFkZCBhIG5vbmUoKSIpCmRpZmYgLS1naXQgYS9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9Hcm9vdnlUcmFuc2xhdG9yVGVzdC5qYXZhIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3Jvb3Z5VHJhbnNsYXRvclRlc3QuamF2YQppbmRleCA3MWY3OWVjLi41MjNjMTlmIDEwMDY0NAotLS0gYS9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9Hcm9vdnlUcmFuc2xhdG9yVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyb292eVRyYW5zbGF0b3JUZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZ3Jvb3Z5LmpzcjIyMzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLk1hcENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLk1hcENvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuVHJhbnNsYXRvckN1c3RvbWl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5PcmRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlBvcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlNjb3BlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuU2NyaXB0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhbnNsYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKQEAgLTEwNywyMiArMTA4LDIyIEBACiAgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKIAogICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LERvdWJsZT4gdENvbnN0YW50VW5hcnkgPSBnLndpdGhTYWNrKDEuMCwgTGFtYmRhLnVuYXJ5T3BlcmF0b3IoIml0ICsgMSIpKS5WKCkuc2FjaygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0Q29uc3RhbnRVbmFyeSA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUodENvbnN0YW50VW5hcnkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0Q29uc3RhbnRVbmFyeSA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUodENvbnN0YW50VW5hcnkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpLmdldFNjcmlwdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImcud2l0aFNhY2soMS4wZCwgKGphdmEudXRpbC5mdW5jdGlvbi5VbmFyeU9wZXJhdG9yKSB7aXQgKyAxfSkuVigpLnNhY2soKSIsIHNjcmlwdENvbnN0YW50VW5hcnkpOwogICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2soc2NyaXB0Q29uc3RhbnRVbmFyeSwgImciLCBnKTsKIAogICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LERvdWJsZT4gdFN1cHBsaWVyVW5hcnkgPSBnLndpdGhTYWNrKExhbWJkYS5zdXBwbGllcigiMS4wZCIpLCBMYW1iZGEuPERvdWJsZT51bmFyeU9wZXJhdG9yKCJpdCArIDEiKSkuVigpLnNhY2soKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdFN1cHBsaWVyVW5hcnkgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKHRTdXBwbGllclVuYXJ5LmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdFN1cHBsaWVyVW5hcnkgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKHRTdXBwbGllclVuYXJ5LmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKS5nZXRTY3JpcHQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLndpdGhTYWNrKChqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXIpIHsxLjBkfSwgKGphdmEudXRpbC5mdW5jdGlvbi5VbmFyeU9wZXJhdG9yKSB7aXQgKyAxfSkuVigpLnNhY2soKSIsIHNjcmlwdFN1cHBsaWVyVW5hcnkpOwogICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2soc2NyaXB0U3VwcGxpZXJVbmFyeSwgImciLCBnKTsKIAogICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LERvdWJsZT4gdENvbnN0YW50QmluYXJ5ID0gZy53aXRoU2FjaygxLjAsIExhbWJkYS5iaW5hcnlPcGVyYXRvcigieCx5IC0+IHggKyB5ICsgMSIpKS5WKCkuc2FjaygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0Q29uc3RhbnRCaW5hcnkgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKHRDb25zdGFudEJpbmFyeS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHRDb25zdGFudEJpbmFyeSA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUodENvbnN0YW50QmluYXJ5LmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKS5nZXRTY3JpcHQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLndpdGhTYWNrKDEuMGQsIChqYXZhLnV0aWwuZnVuY3Rpb24uQmluYXJ5T3BlcmF0b3IpIHt4LHkgLT4geCArIHkgKyAxfSkuVigpLnNhY2soKSIsIHNjcmlwdENvbnN0YW50QmluYXJ5KTsKICAgICAgICAgYXNzZXJ0VGhhdFNjcmlwdE9rKHNjcmlwdENvbnN0YW50QmluYXJ5LCAiZyIsIGcpOwogCiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsRG91YmxlPiB0U3VwcGxpZXJCaW5hcnkgPSBnLndpdGhTYWNrKExhbWJkYS5zdXBwbGllcigiMS4wZCIpLCBMYW1iZGEuPERvdWJsZT5iaW5hcnlPcGVyYXRvcigieCx5IC0+IHggKyB5ICsgMSIpKS5WKCkuc2FjaygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0U3VwcGxpZXJCaW5hcnkgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKHRTdXBwbGllckJpbmFyeS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHRTdXBwbGllckJpbmFyeSA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUodFN1cHBsaWVyQmluYXJ5LmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKS5nZXRTY3JpcHQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLndpdGhTYWNrKChqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXIpIHsxLjBkfSwgKGphdmEudXRpbC5mdW5jdGlvbi5CaW5hcnlPcGVyYXRvcikge3gseSAtPiB4ICsgeSArIDF9KS5WKCkuc2FjaygpIiwgc2NyaXB0U3VwcGxpZXJCaW5hcnkpOwogICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2soc2NyaXB0U3VwcGxpZXJCaW5hcnksICJnIiwgZyk7CiAgICAgfQpAQCAtMTY4LDcgKzE2OSw3IEBACiAgICAgICAgIC8vCiAgICAgICAgIGFzc2VydEVxdWFscygyNCwgdC5nZXRTaWRlRWZmZWN0cygpLjxOdW1iZXI+Z2V0KCJsZW5ndGhTdW0iKS5pbnRWYWx1ZSgpKTsKIAotICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0ID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZSh0LmdldEJ5dGVjb2RlKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0ID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZSh0LmdldEJ5dGVjb2RlKCkpLmdldFNjcmlwdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImcud2l0aFN0cmF0ZWdpZXMob3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlRyYW5zbGF0aW9uU3RyYXRlZ3kuaW5zdGFuY2UoKSkiICsKICAgICAgICAgICAgICAgICAgICAgICAgICIud2l0aFNpZGVFZmZlY3QoXCJsZW5ndGhTdW1cIiwoaW50KSAwKS53aXRoU2FjaygoaW50KSAxKSIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIi5WKCkiICsKQEAgLTE4OCw3ICsxODksNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0ID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLlYoKS5pZCgpLmlzKG5ldyBMaW5rZWRIYXNoTWFwPE9iamVjdCxPYmplY3Q+KCkge3sKICAgICAgICAgICAgIHB1dCgzLCAiMzIiKTsKICAgICAgICAgICAgIHB1dChBcnJheXMuYXNMaXN0KDEsIDIsIDMuMWQpLCA0KTsKLSAgICAgICAgfX0pLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgfX0pLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKS5nZXRTY3JpcHQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLlYoKS5pZCgpLmlzKFsoKGludCkgMyk6KFwiMzJcIiksKFsoaW50KSAxLCAoaW50KSAyLCAzLjFkXSk6KChpbnQpIDQpXSkiLCBzY3JpcHQpOwogICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2soc2NyaXB0LCAiZyIsIGcpOwogICAgIH0KQEAgLTE5OCw3ICsxOTksNyBAQAogICAgICAgICBmaW5hbCBUaW5rZXJHcmFwaCBncmFwaCA9IFRpbmtlckZhY3RvcnkuY3JlYXRlTW9kZXJuKCk7CiAgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKICAgICAgICAgZmluYWwgRnVuY3Rpb24gaWRlbnRpdHkgPSBuZXcgTGFtYmRhLk9uZUFyZ0xhbWJkYSgiaXQuZ2V0KCkiLCAiZ3JlbWxpbi1ncm9vdnkiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoZy5pbmplY3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkubWFwKGlkZW50aXR5KS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKGcuaW5qZWN0KENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpLm1hcChpZGVudGl0eSkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpLmdldFNjcmlwdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImcuaW5qZWN0KFtdKS5tYXAoe2l0LmdldCgpfSkiLCBzY3JpcHQpOwogICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2soc2NyaXB0LCAiZyIsIGcpOwogICAgIH0KQEAgLTIzNyw3ICsyMzgsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRIYW5kbGVPcmRlcigpIHsKLSAgICAgICAgYXNzZXJ0VHJhbnNsYXRpb24oIk9yZGVyLmRlY3IiLCBPcmRlci5kZWNyKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNsYXRpb24oIk9yZGVyLnNodWZmbGUiLCBPcmRlci5zaHVmZmxlKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjU4LDEyICsyNTksMTIgQEAKIAogICAgICAgICAvLyB3aXRob3V0IHR5cGUgdHJhbnNsYXRpb24gd2UgZ2V0IHVnbGluZXNzcwogICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0QmFkID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLgotICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShnLmluamVjdChub3RTaWxseUVub3VnaCkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShnLmluamVjdChub3RTaWxseUVub3VnaCkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpLmdldFNjcmlwdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiZy5pbmplY3QoJXMpIiwgIm5vdCBzaWxseSBlbm91Z2g6MTAwIiksIHNjcmlwdEJhZCk7CiAKICAgICAgICAgLy8gd2l0aCB0eXBlIHRyYW5zbGF0aW9uIHdlIGdldCB2YWxpZCBncmVtbGluCi0gICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHRHb29kID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIsIG5ldyBTaWxseUNsYXNzVHJhbnNsYXRvcigpKS4KLSAgICAgICAgICAgICAgICB0cmFuc2xhdGUoZy5pbmplY3Qobm90U2lsbHlFbm91Z2gpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdEdvb2QgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIiwgbmV3IFNpbGx5Q2xhc3NUcmFuc2xhdG9yKGZhbHNlKSkuCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlKGcuaW5qZWN0KG5vdFNpbGx5RW5vdWdoKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSkuZ2V0U2NyaXB0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJnLmluamVjdChvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS5qc3IyMjMuR3Jvb3Z5VHJhbnNsYXRvclRlc3QuU2lsbHlDbGFzcy5mcm9tKCclcycsIChpbnQpICVzKSkiLCBub3RTaWxseUVub3VnaC5nZXRYKCksIG5vdFNpbGx5RW5vdWdoLmdldFkoKSksIHNjcmlwdEdvb2QpOwogICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2soc2NyaXB0R29vZCwgImciLCBnKTsKIApAQCAtMjkxLDcgKzI5Miw3IEBACiAgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJuYW1lIiwgIkZvb1x1MDAyMEJhciIpCiAgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJhZ2UiLCAyNSkKICAgICAgICAgICAgICAgICAucHJvcGVydHkoInNwZWNpYWwiLCAiYH4hQCMkJV4mKigpLV89K1t7XX1cXHw7OidcIiw8Lj4vPyIpCi0gICAgICAgICAgICAgICAgLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgICAgICAgICAuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpLmdldFNjcmlwdCgpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygiZy5hZGRWKFwiY3VzdG9tZXJcIikiICsKICAgICAgICAgICAgICAgICAgICAgICAgICIucHJvcGVydHkoXCJjdXN0b21lcl9pZFwiLDUwMUwpIiArCkBAIC0zMDksNyArMzEwLDcgQEAKICAgICAgICAgZmluYWwgT2JqZWN0IGlkMSA9ICJjdXN0b21lcjoxMDpmb29cdTAwMjBiYXJcdTAwMjBcdTAwMjQxMDAjOTAiOyAvLyBjdXN0b21lcjoxMDpmb28gYmFyICQxMDAjOTAKICAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleDEgPSBEZXRhY2hlZFZlcnRleC5idWlsZCgpLnNldExhYmVsKCJjdXN0b21lciIpLnNldElkKGlkMSkKICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHQxID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLmluamVjdCh2ZXJ0ZXgxKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHQxID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLmluamVjdCh2ZXJ0ZXgxKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSkuZ2V0U2NyaXB0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZy5pbmplY3QobmV3IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZGV0YWNoZWQuRGV0YWNoZWRWZXJ0ZXgoIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJjdXN0b21lcjoxMDpmb28gYmFyIFxcJDEwMCM5MFwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIlwiY3VzdG9tZXJcIiwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkpIiwKQEAgLTMxOSw3ICszMjAsNyBAQAogICAgICAgICBmaW5hbCBPYmplY3QgaWQyID0gInVzZXI6MjA6Zm9vXFx1MDAyMGJhclxcdTAwNWNcXHUwMDIybXJcXHUwMDVjXFx1MDAyMlxcdTAwMjQxMDAwIzUwIjsgLy8gdXNlcjoyMDpmb29cdTAwMjBiYXJcdTAwNWNcdTAwMjJtclx1MDA1Y1x1MDAyMlx1MDAyNDEwMDAjNTAKICAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleDIgPSBEZXRhY2hlZFZlcnRleC5idWlsZCgpLnNldExhYmVsKCJ1c2VyIikuc2V0SWQoaWQyKQogICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdDIgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKGcuaW5qZWN0KHZlcnRleDIpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdDIgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKGcuaW5qZWN0KHZlcnRleDIpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKS5nZXRTY3JpcHQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLmluamVjdChuZXcgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5kZXRhY2hlZC5EZXRhY2hlZFZlcnRleCgiICsKICAgICAgICAgICAgICAgICAgICAgICAgICJcInVzZXI6MjA6Zm9vXFxcXHUwMDIwYmFyXFxcXHUwMDVjXFxcXHUwMDIybXJcXFxcdTAwNWNcXFxcdTAwMjJcXFxcdTAwMjQxMDAwIzUwXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJ1c2VyXCIsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKSIsCkBAIC0zMzEsNyArMzMyLDcgQEAKICAgICAgICAgICAgICAgICAuc2V0T3V0VigoRGV0YWNoZWRWZXJ0ZXgpIHZlcnRleDEpCiAgICAgICAgICAgICAgICAgLnNldEluVigoRGV0YWNoZWRWZXJ0ZXgpIHZlcnRleDIpCiAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0MyA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoZy5pbmplY3QoZWRnZSkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0MyA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoZy5pbmplY3QoZWRnZSkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpLmdldFNjcmlwdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImcuaW5qZWN0KG5ldyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkRWRnZSgiICsKICAgICAgICAgICAgICAgICAgICAgICAgICJcImtub3dzOjMwOmZvbyBiYXIgXFwkMTAwOlxcXFx1MDAyMFxcXFx1MDAyNDUwMCM3MFwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIlwia25vd3NcIixDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCIgKwpAQCAtMzQyLDcgKzM0Myw3IEBACiAKICAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdDQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKAogICAgICAgICAgICAgICAgIGcuYWRkRSgia25vd3MiKS5mcm9tKHZlcnRleDEpLnRvKHZlcnRleDIpLnByb3BlcnR5KCJ3aGVuIiwgIjIwMTgvMDkvMjEiKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSkuZ2V0U2NyaXB0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZy5hZGRFKFwia25vd3NcIikiICsKICAgICAgICAgICAgICAgICAgICAgICAgICIuZnJvbShuZXcgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5kZXRhY2hlZC5EZXRhY2hlZFZlcnRleChcImN1c3RvbWVyOjEwOmZvbyBiYXIgXFwkMTAwIzkwXCIsXCJjdXN0b21lclwiLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSkiICsKICAgICAgICAgICAgICAgICAgICAgICAgICIudG8obmV3IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZGV0YWNoZWQuRGV0YWNoZWRWZXJ0ZXgoXCJ1c2VyOjIwOmZvb1xcXFx1MDAyMGJhclxcXFx1MDA1Y1xcXFx1MDAyMm1yXFxcXHUwMDVjXFxcXHUwMDIyXFxcXHUwMDI0MTAwMCM1MFwiLFwidXNlclwiLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSkiICsKQEAgLTM1OSw5ICszNjAsOSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUcmFuc2xhdGlvbihmaW5hbCBTdHJpbmcgZXhwZWN0ZWRUcmFuc2xhdGlvbiwgZmluYWwgT2JqZWN0Li4uIG9ianMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoZy5pbmplY3Qob2JqcykuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiZy5pbmplY3QoJXMpIiwgZXhwZWN0ZWRUcmFuc2xhdGlvbiksIHNjcmlwdCk7Ci0gICAgICAgIGFzc2VydFRoYXRTY3JpcHRPayhzY3JpcHQsICJnIiwgZyk7CisgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKGcuaW5qZWN0KG9ianMpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoImcuaW5qZWN0KCVzKSIsIGV4cGVjdGVkVHJhbnNsYXRpb24pLCBzY3JpcHQuZ2V0U2NyaXB0KCkpOworICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2soc2NyaXB0LmdldFNjcmlwdCgpLCAiZyIsIGcpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUaGF0U2NyaXB0T2soZmluYWwgU3RyaW5nIHMsIGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CkBAIC00MDMsMTMgKzQwNCwxOCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaWxseUNsYXNzVHJhbnNsYXRvciBleHRlbmRzIEdyb292eVRyYW5zbGF0b3IuRGVmYXVsdFR5cGVUcmFuc2xhdG9yIHsKIAorICAgICAgICBwdWJsaWMgU2lsbHlDbGFzc1RyYW5zbGF0b3IoZmluYWwgYm9vbGVhbiB3aXRoUGFyYW1ldGVycykgeworICAgICAgICAgICAgc3VwZXIod2l0aFBhcmFtZXRlcnMpOworICAgICAgICB9CisKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTaWxseUNsYXNzKQotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS5qc3IyMjMuR3Jvb3Z5VHJhbnNsYXRvclRlc3QuU2lsbHlDbGFzcy5mcm9tKCclcycsIChpbnQpICVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFNpbGx5Q2xhc3MpIG9iamVjdCkuZ2V0WCgpLCAoKFNpbGx5Q2xhc3MpIG9iamVjdCkuZ2V0WSgpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKG9iamVjdCk7CisgICAgICAgIHByb3RlY3RlZCBTY3JpcHQgY29udmVydFRvU2NyaXB0KGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTaWxseUNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyb292eVRyYW5zbGF0b3JUZXN0LlNpbGx5Q2xhc3MuZnJvbSgnJXMnLCAoaW50KSAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgKChTaWxseUNsYXNzKSBvYmplY3QpLmdldFgoKSwgKChTaWxseUNsYXNzKSBvYmplY3QpLmdldFkoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU2NyaXB0KG9iamVjdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxNyw3ICs0MjMsNyBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgVHJhbnNsYXRvci5TY3JpcHRUcmFuc2xhdG9yLlR5cGVUcmFuc2xhdG9yIGNyZWF0ZVR5cGVUcmFuc2xhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWxseUNsYXNzVHJhbnNsYXRvcigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWxseUNsYXNzVHJhbnNsYXRvcihmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9QYXJhbWV0ZXJpemVkR3Jvb3Z5VHJhbnNsYXRvckNvbXB1dGVyUHJvdmlkZXIuamF2YSBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL1BhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yQ29tcHV0ZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTQ4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9QYXJhbWV0ZXJpemVkR3Jvb3Z5VHJhbnNsYXRvckNvbXB1dGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqICB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS5qc3IyMjM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5wcm9jZXNzLmNvbXB1dGVyLlRpbmtlckdyYXBoQ29tcHV0ZXI7CisKKy8qKgorICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCisgKi8KK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXJUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gInNob3VsZFN1Y2NlZWRXaXRoUHJvcGVyVHJhdmVyc2VyUmVxdWlyZW1lbnRzIiwKKyAgICAgICAgcmVhc29uID0gIlJlYXNvbiByZXF1aXJlcyBpbnZlc3RpZ2F0aW9uIikKK0BHcmFwaFByb3ZpZGVyLkRlc2NyaXB0b3IoY29tcHV0ZXIgPSBUaW5rZXJHcmFwaENvbXB1dGVyLmNsYXNzKQorcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yQ29tcHV0ZXJQcm92aWRlciBleHRlbmRzIFBhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdyYXBoVHJhdmVyc2FsU291cmNlIHRyYXZlcnNhbChmaW5hbCBHcmFwaCBncmFwaCkgeworICAgICAgICByZXR1cm4gc3VwZXIudHJhdmVyc2FsKGdyYXBoKS53aXRoQ29tcHV0ZXIoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JQcm9jZXNzQ29tcHV0ZXJUZXN0LmphdmEgYi9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9QYXJhbWV0ZXJpemVkR3Jvb3Z5VHJhbnNsYXRvclByb2Nlc3NDb21wdXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGNhZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JQcm9jZXNzQ29tcHV0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiAgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzOworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyQ2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLlByb2Nlc3NDb21wdXRlclN1aXRlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckdyYXBoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworQFJ1bldpdGgoUHJvY2Vzc0NvbXB1dGVyU3VpdGUuY2xhc3MpCitAR3JhcGhQcm92aWRlckNsYXNzKHByb3ZpZGVyID0gUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JDb21wdXRlclByb3ZpZGVyLmNsYXNzLCBncmFwaCA9IFRpbmtlckdyYXBoLmNsYXNzKQorcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yUHJvY2Vzc0NvbXB1dGVyVGVzdCB7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JQcm9jZXNzU3RhbmRhcmRUZXN0LmphdmEgYi9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9QYXJhbWV0ZXJpemVkR3Jvb3Z5VHJhbnNsYXRvclByb2Nlc3NTdGFuZGFyZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBhNTNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JQcm9jZXNzU3RhbmRhcmRUZXN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiAgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzOworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyQ2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLlByb2Nlc3NTdGFuZGFyZFN1aXRlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckdyYXBoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworQFJ1bldpdGgoUHJvY2Vzc1N0YW5kYXJkU3VpdGUuY2xhc3MpCitAR3JhcGhQcm92aWRlckNsYXNzKHByb3ZpZGVyID0gUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JQcm92aWRlci5jbGFzcywgZ3JhcGggPSBUaW5rZXJHcmFwaC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkR3Jvb3Z5VHJhbnNsYXRvclByb2Nlc3NTdGFuZGFyZFRlc3QgeworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL1BhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yUHJvdmlkZXIuamF2YSBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL1BhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ2NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqICB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS5qc3IyMjM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbFNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uVHJhbnNsYXRpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuVGlua2VyR3JhcGhQcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLlByb2ZpbGVUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gIioiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgZm9yIHByb2ZpbGUoKSBhcmUgbm90IHN1cHBvcnRlZCBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5icmFuY2guQnJhbmNoVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZfYnJhbmNoWGxhYmVsX2VxX3BlcnNvbl9fYV9iWF9vcHRpb25YYV9fYWdlWF9vcHRpb25YYl9fbGFuZ1hfb3B0aW9uWGJfX25hbWVYIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLmJyYW5jaC5DaG9vc2VUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVl9jaG9vc2VYbGFiZWxfZXFYcGVyc29uWF9fb3V0WGtub3dzWF9faW5YY3JlYXRlZFhYX25hbWUiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkRlZHVwVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZfYm90aF9uYW1lX29yZGVyX2J5WGFfYlhfZGVkdXBfdmFsdWUiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkZpbHRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19FX2ZpbHRlclhmYWxzZVgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkZpbHRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19FX2ZpbHRlclh0cnVlWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5maWx0ZXIuRmlsdGVyVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZfZmlsdGVyWGZhbHNlWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5maWx0ZXIuRmlsdGVyVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZfZmlsdGVyWGxhbmdfZXFfamF2YVgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkZpbHRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WX2ZpbHRlclhuYW1lX3N0YXJ0c1dpdGhfbV9PUl9uYW1lX3N0YXJ0c1dpdGhfcFgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkZpbHRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WX2ZpbHRlclh0cnVlWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5maWx0ZXIuRmlsdGVyVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZYMVhfZmlsdGVyWGFnZV9ndF8zMFgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuZmlsdGVyLkZpbHRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WWDFYX291dF9maWx0ZXJYYWdlX2d0XzMwWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5maWx0ZXIuRmlsdGVyVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZYMlhfZmlsdGVyWGFnZV9ndF8zMFgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5Hcm91cFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WX2dyb3VwX2J5WG5hbWVfc3Vic3RyaW5nXzFYX2J5WGNvbnN0YW50WDFYWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0Lkdyb3VwVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZfZ3JvdXBYYVhfYnlYbmFtZV9zdWJzdHJpbmdfMVhfYnlYY29uc3RhbnRYMVhYX2NhcFhhWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5maWx0ZXIuSGFzVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1Zfb3V0WGNyZWF0ZWRYX2hhc1huYW1lX19tYXBYbGVuZ3RoWF9pc1hndFgzWFhYX25hbWUiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JbmplY3RUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVlgxWF9vdXRfbmFtZV9pbmplY3RYZGFuaWVsWF9hc1hhWF9tYXBYbGVuZ3RoWF9wYXRoIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5NYXBUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVlgxWF9tYXBYbmFtZVgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLk1hcFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WWDFYX291dF9tYXBYbmFtZVhfbWFwWGxlbmd0aFgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLk1hcFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WWDFYX291dEVfbGFiZWxfbWFwWGxlbmd0aFgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLk1hcFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ193aXRoUGF0aF9WX2FzWGFYX291dF9tYXBYYV9uYW1lWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuTWFwVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX3dpdGhQYXRoX1ZfYXNYYVhfb3V0X291dF9tYXBYYV9uYW1lX2l0X25hbWVYIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5PcmRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WX2hhc0xhYmVsWHBlcnNvblhfb3JkZXJfYnlYdmFsdWVYYWdlWF9kZXNjWF9uYW1lIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5PcmRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WX25hbWVfb3JkZXJfYnlYYTFfYjFYX2J5WGIyX2EyWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuT3JkZXJUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVl9vcmRlcl9ieVhuYW1lX2ExX2IxWF9ieVhuYW1lX2IyX2EyWF9uYW1lIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5PcmRlclRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WWDFYX2hhc1hsYWJlbF9wZXJzb25YX21hcFhtYXBYaW50X2FnZVhYX29yZGVyWGxvY2FsWF9ieVh2YWx1ZXNfZGVzY1hfYnlYa2V5c19hc2NYIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLmJyYW5jaC5SZXBlYXRUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVl9yZXBlYXRYYm90aFhfdW50aWxYbmFtZV9lcV9tYXJrb19vcl9sb29wc19ndF8xWF9ncm91cENvdW50X2J5WG5hbWVYIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuU2Fja1Rlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ193aXRoU2Fja1htYXBfX21hcF9jbG9uZVhfVl9vdXRfb3V0X3NhY2tYbWFwX2FfbmFtZVhfc2FjayIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlNpZGVFZmZlY3RUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVlgxWF9vdXRfc2lkZUVmZmVjdFhpbmNyX2NYX25hbWUiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5TaWRlRWZmZWN0VGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZYMVhfb3V0X3NpZGVFZmZlY3RYWF9uYW1lIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuU2lkZUVmZmVjdFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WWDFYX3NpZGVFZmZlY3RYc3RvcmVfYVhfbmFtZSIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlNpZGVFZmZlY3RUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfd2l0aFNpZGVFZmZlY3RzWGFfX2xpbmtlZGhhc2htYXBYX3dpdGhTaWRlRWZmZWN0WGJfX2FycmF5bGlzdF9fYWRkQWxsWF93aXRoU2lkZUVmZmVjdFhjX19hcnJheUxpc3RfX2FkZEFsbFhfVl9ncm91cFhhWF9ieVhsYWJlbFhfYnlYY291bnRYX3NpZGVFZmZlY3RYYl9fMV8yXzNYX291dF9vdXRfb3V0X3NpZGVFZmZlY3RYY19fYm9iX2RhbmllbFhfY2FwWGFYIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuU2lkZUVmZmVjdFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ193aXRoU2lkZUVmZmVjdFhhXzBfc3VtWF9WX291dF9zaWRlRWZmZWN0WHNpZGVFZmZlY3RzWGFfYnVsa1hYX2NhcFhhWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlNpZGVFZmZlY3RUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfd2l0aFNpZGVFZmZlY3RYYV8wWF9WX291dF9zaWRlRWZmZWN0WHNpZGVFZmZlY3RzWGFfMVhYX2NhcFhhWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0cyB0aGF0IGluY2x1ZGUgbGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzdWl0ZSBmb3IgcmVtb3RlcyIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlNpZGVFZmZlY3RUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfd2l0aFNpZGVFZmZlY3RYYV9fbGlua2VkaGFzaG1hcFhfVl9vdXRfZ3JvdXBDb3VudFhhWF9ieVhsYWJlbFhfb3V0X291dF9jYXBYYVgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5TdWJncmFwaFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiZ19WX3dpdGhTaWRlRWZmZWN0WHNnWF9vdXRFWGtub3dzWF9zdWJncmFwaFhzZ1hfbmFtZV9jYXBYc2dYIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuU3ViZ3JhcGhUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVl93aXRoU2lkZUVmZmVjdFhzZ1hfcmVwZWF0WGJvdGhFWGNyZWF0ZWRYX3N1YmdyYXBoWHNnWF9vdXRWWF90aW1lc1g1WF9uYW1lX2RlZHVwIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuU3ViZ3JhcGhUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfd2l0aFNpZGVFZmZlY3RYc2dYX1ZfaGFzWG5hbWVfZGFuaWVsWG91dF9jYXBYc2dYIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3RzIHRoYXQgaW5jbHVkZSBsYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IHN1aXRlIGZvciByZW1vdGVzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5VbmZvbGRUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gImdfVl92YWx1ZU1hcF91bmZvbGRfbWFwWGtleVgiLAorICAgICAgICByZWFzb24gPSAiVGVzdHMgdGhhdCBpbmNsdWRlIGxhbWJkYXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc3VpdGUgZm9yIHJlbW90ZXMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLlByb2dyYW1UZXN0IiwKKyAgICAgICAgbWV0aG9kID0gIioiLAorICAgICAgICByZWFzb24gPSAiUmVhc29uIHJlcXVpcmVzIGludmVzdGlnYXRpb24iKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbEludGVycnVwdGlvblRlc3QiLAorICAgICAgICBtZXRob2QgPSAiKiIsCisgICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsSW50ZXJydXB0aW9uQ29tcHV0ZXJUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gIioiLAorICAgICAgICByZWFzb24gPSAiUmVhc29uIHJlcXVpcmVzIGludmVzdGlnYXRpb24iKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uRXZlbnRTdHJhdGVneVByb2Nlc3NUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gIioiLAorICAgICAgICByZWFzb24gPSAiU3RyYXRlZ3kgbm90IHByb3Blcmx5IHN1cHBvcnRlZCBieSBCeXRlY29kZSBiYXNlZCB0cmF2ZXJzYWxzIikKK0BHcmFwaC5PcHRPdXQoCisgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLkVsZW1lbnRJZFN0cmF0ZWd5UHJvY2Vzc1Rlc3QiLAorICAgICAgICBtZXRob2QgPSAiKiIsCisgICAgICAgIHJlYXNvbiA9ICJTdHJhdGVneSBub3QgcHJvcGVybHkgc3VwcG9ydGVkIGJ5IEJ5dGVjb2RlIGJhc2VkIHRyYXZlcnNhbHMiKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkNvcmVUcmF2ZXJzYWxUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gInNob3VsZE5ldmVyUHJvcGFnYXRlQU5vQnVsa1RyYXZlcnNlciIsCisgICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuUmVhZFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiKiIsCisgICAgICAgIHJlYXNvbiA9ICJyZWFkIGFuZCB3cml0ZSB0ZXN0cyBkb24ndCB0cmFuc2xhdGUgbG9jYWxseSB3ZWxsIGJlY2F1c2Ugb2YgY2FsbGluZyBpdGVyYXRlKCkgaW5zaWRlIHJlYWQoKS93cml0ZSgpIGFkZCBhIG5vbmUoKSIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuV3JpdGVUZXN0IiwKKyAgICAgICAgbWV0aG9kID0gIioiLAorICAgICAgICByZWFzb24gPSAicmVhZCBhbmQgd3JpdGUgdGVzdHMgZG9uJ3QgdHJhbnNsYXRlIGxvY2FsbHkgd2VsbCBiZWNhdXNlIG9mIGNhbGxpbmcgaXRlcmF0ZSgpIGluc2lkZSByZWFkKCkvd3JpdGUoKSBhZGQgYSBub25lKCkiKQorcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yUHJvdmlkZXIgZXh0ZW5kcyBUaW5rZXJHcmFwaFByb3ZpZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgdHJhdmVyc2FsKGZpbmFsIEdyYXBoIGdyYXBoKSB7CisgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKKyAgICAgICAgcmV0dXJuIGcud2l0aFN0cmF0ZWdpZXMobmV3IFRyYW5zbGF0aW9uU3RyYXRlZ3koZywgR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIsIHRydWUpLCB0cnVlKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL1BhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yVGVzdC5qYXZhIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwN2I1MgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL1BhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjY0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqICB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZ3Jvb3Z5LmpzcjIyMzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLlRyYW5zbGF0b3JDdXN0b21pemVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQ29tcGFyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLk9yZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlBvcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlNhY2tGdW5jdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5TY29wZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlNjcmlwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLlRyYXZlcnNhbE9wdGlvblBhcmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU3ViZ3JhcGhTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uVHJhbnNsYXRpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LnZlcmlmaWNhdGlvbi5SZWFkT25seVN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5BbmRQOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXhQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkRWRnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkVmVydGV4OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VyR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkxhbWJkYTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmF4LnNjcmlwdC5CaW5kaW5nczsKK2ltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNjcmlwdC5TaW1wbGVCaW5kaW5nczsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqICB0ZXN0IHtAbGluayBHcm9vdnlUcmFuc2xhdG9yfSB3aGljaCByZXR1cm4gcGFyYW1ldGVyaXplZCByZXN1bHQsIGNvdmVyczoKKyAqICAgLSBwYXJhbWV0ZXJpemVkIHNjcmlwdCBjaGVja2luZworICogICAtIGJpbmRpbmcgY2hlY2tpbmcKKyAqICAgLSBldmFsIHJlc3VsdCBjaGVja2luZworICoKKyAqICA8cD4KKyAqICB7QGxpbmsgR3Jvb3Z5VHJhbnNsYXRvclRlc3QgfSBpcyB1c2VkIHRvIHRlc3Qge0BsaW5rIEdyb292eVRyYW5zbGF0b3J9LCBib3RoIHRlc3QgY2FzZXMgbG9va3MgdGhlIHNhbWUKKyAqICA8cD4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKKyAqIEBhdXRob3IgU3RhcmsgQXJ5YSAoc2FuZHN6aG91LnpqQGFsaWJhYmEtaW5jLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRHcm9vdnlUcmFuc2xhdG9yVGVzdCB7CisKKyAgICBwcml2YXRlIEdyYXBoIGdyYXBoID0gVGlua2VyR3JhcGgub3BlbigpOworICAgIHByaXZhdGUgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IGdyYXBoLnRyYXZlcnNhbCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmUgcGFyYW1ldGVyaXplZEVuZ2luZSA9IG5ldyBHcmVtbGluR3Jvb3Z5U2NyaXB0RW5naW5lKG5ldyBUcmFuc2xhdG9yQ3VzdG9taXplcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUcmFuc2xhdG9yLlNjcmlwdFRyYW5zbGF0b3IuVHlwZVRyYW5zbGF0b3IgY3JlYXRlVHlwZVRyYW5zbGF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdyb292eVRyYW5zbGF0b3IuRGVmYXVsdFR5cGVUcmFuc2xhdG9yKHRydWUpOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhbmRsZVN0cmF0ZWdpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVGlua2VyR3JhcGggZ3JhcGggPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpOworICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCkud2l0aFN0cmF0ZWdpZXMoU3ViZ3JhcGhTdHJhdGVneS5jcmVhdGUobmV3IE1hcENvbmZpZ3VyYXRpb24obmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKKyAgICAgICAgICAgIHB1dChTdWJncmFwaFN0cmF0ZWd5LlZFUlRJQ0VTLCBfXy5oYXMoIm5hbWUiLCAibWFya28iKSk7CisgICAgICAgIH19KSkpOworICAgICAgICBmaW5hbCBCaW5kaW5ncyBiaW5kaW5ncyA9IG5ldyBTaW1wbGVCaW5kaW5ncygpOworICAgICAgICBiaW5kaW5ncy5wdXQoImciLCBnKTsKKyAgICAgICAgVHJhdmVyc2FsLkFkbWluPFZlcnRleCwgT2JqZWN0PiB0cmF2ZXJzYWwgPSBwYXJhbWV0ZXJpemVkRW5naW5lLmV2YWwoZy5WKCkudmFsdWVzKCJuYW1lIikuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCksIGJpbmRpbmdzLCAiZyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtvIiwgdHJhdmVyc2FsLm5leHQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOworICAgICAgICAvLworICAgICAgICB0cmF2ZXJzYWwgPSBwYXJhbWV0ZXJpemVkRW5naW5lLmV2YWwoZy53aXRob3V0U3RyYXRlZ2llcyhTdWJncmFwaFN0cmF0ZWd5LmNsYXNzKS5WKCkuY291bnQoKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSwgYmluZGluZ3MsICJnIik7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZyg2KSwgdHJhdmVyc2FsLm5leHQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOworICAgICAgICAvLworICAgICAgICB0cmF2ZXJzYWwgPSBwYXJhbWV0ZXJpemVkRW5naW5lLmV2YWwoZy53aXRoU3RyYXRlZ2llcyhTdWJncmFwaFN0cmF0ZWd5LmNyZWF0ZShuZXcgTWFwQ29uZmlndXJhdGlvbihuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7eworICAgICAgICAgICAgcHV0KFN1YmdyYXBoU3RyYXRlZ3kuVkVSVElDRVMsIF9fLmhhcygibmFtZSIsICJtYXJrbyIpKTsKKyAgICAgICAgfX0pKSwgUmVhZE9ubHlTdHJhdGVneS5pbnN0YW5jZSgpKS5WKCkudmFsdWVzKCJuYW1lIikuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCksIGJpbmRpbmdzLCAiZyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtvIiwgdHJhdmVyc2FsLm5leHQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkU3VwcG9ydFN0cmluZ1N1cHBsaWVyTGFtYmRhcygpIHsKKyAgICAgICAgZmluYWwgVGlua2VyR3JhcGggZ3JhcGggPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpOworICAgICAgICBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCk7CisgICAgICAgIGcgPSBnLndpdGhTdHJhdGVnaWVzKG5ldyBUcmFuc2xhdGlvblN0cmF0ZWd5KGcsIEdyb292eVRyYW5zbGF0b3Iub2YoImciLCB0cnVlKSwgZmFsc2UpKTsKKyAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWwuQWRtaW48VmVydGV4LCBJbnRlZ2VyPiB0ID0gZy53aXRoU2lkZUVmZmVjdCgibGVuZ3RoU3VtIiwgMCkud2l0aFNhY2soMSkKKyAgICAgICAgICAgICAgICAuVigpCisgICAgICAgICAgICAgICAgLmZpbHRlcihMYW1iZGEucHJlZGljYXRlKCJpdC5nZXQoKS5sYWJlbCgpLmVxdWFscygncGVyc29uJykiKSkKKyAgICAgICAgICAgICAgICAuZmxhdE1hcChMYW1iZGEuZnVuY3Rpb24oIml0LmdldCgpLnZlcnRpY2VzKERpcmVjdGlvbi5PVVQpIikpCisgICAgICAgICAgICAgICAgLm1hcChMYW1iZGEuPFRyYXZlcnNlcjxPYmplY3Q+LCBJbnRlZ2VyPmZ1bmN0aW9uKCJpdC5nZXQoKS52YWx1ZSgnbmFtZScpLmxlbmd0aCgpIikpCisgICAgICAgICAgICAgICAgLnNpZGVFZmZlY3QoTGFtYmRhLmNvbnN1bWVyKCJ7IHggLT4geC5zaWRlRWZmZWN0cyhcImxlbmd0aFN1bVwiLCB4LjxJbnRlZ2VyPnNpZGVFZmZlY3RzKCdsZW5ndGhTdW0nKSArIHguZ2V0KCkpIH0iKSkKKyAgICAgICAgICAgICAgICAub3JkZXIoKS5ieShMYW1iZGEuY29tcGFyYXRvcigiYSxiIC0+IGEgPD0+IGIiKSkKKyAgICAgICAgICAgICAgICAuc2FjayhMYW1iZGEuYmlGdW5jdGlvbigieyBhLGIgLT4gYSArIGIgfSIpKQorICAgICAgICAgICAgICAgIC5hc0FkbWluKCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxJbnRlZ2VyPiBzYWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGxlbmd0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgd2hpbGUgKHQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48SW50ZWdlcj4gdHJhdmVyc2VyID0gdC5uZXh0VHJhdmVyc2VyKCk7CisgICAgICAgICAgICBzYWNrcy5hZGQodHJhdmVyc2VyLnNhY2soKSk7CisgICAgICAgICAgICBsZW5ndGhzLmFkZCh0cmF2ZXJzZXIuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKHQuaGFzTmV4dCgpKTsKKyAgICAgICAgLy8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGxlbmd0aHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGxlbmd0aHMuZ2V0KDApLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbGVuZ3Rocy5nZXQoMSkuaW50VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBsZW5ndGhzLmdldCgyKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGxlbmd0aHMuZ2V0KDMpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbGVuZ3Rocy5nZXQoNCkuaW50VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBsZW5ndGhzLmdldCg1KS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgLy8vCisgICAgICAgIGFzc2VydEVxdWFscyg2LCBzYWNrcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2Fja3MuZ2V0KDApLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2Fja3MuZ2V0KDEpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2Fja3MuZ2V0KDIpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgc2Fja3MuZ2V0KDMpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgc2Fja3MuZ2V0KDQpLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgc2Fja3MuZ2V0KDUpLmludFZhbHVlKCkpOworICAgICAgICAvLworICAgICAgICBhc3NlcnRFcXVhbHMoMjQsIHQuZ2V0U2lkZUVmZmVjdHMoKS48TnVtYmVyPmdldCgibGVuZ3RoU3VtIikuaW50VmFsdWUoKSk7CisKKyAgICAgICAgZmluYWwgU2NyaXB0IHNjcmlwdCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciLCB0cnVlKS50cmFuc2xhdGUodC5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgQmluZGluZ3MgYmluZGluZ3MgPSBuZXcgU2ltcGxlQmluZGluZ3MoKTsKKyAgICAgICAgc2NyaXB0LmdldFBhcmFtZXRlcnMoKS5pZlByZXNlbnQoYmluZGluZ3M6OnB1dEFsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxlbmd0aFN1bSIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgYmluZGluZ3MuZ2V0KCJfYXJnc18xIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMYW1iZGEucHJlZGljYXRlKCJpdC5nZXQoKS5sYWJlbCgpLmVxdWFscygncGVyc29uJykiKSwgYmluZGluZ3MuZ2V0KCJfYXJnc18zIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGFtYmRhLmZ1bmN0aW9uKCJpdC5nZXQoKS52ZXJ0aWNlcyhEaXJlY3Rpb24uT1VUKSIpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMYW1iZGEuPFRyYXZlcnNlcjxPYmplY3Q+LCBJbnRlZ2VyPmZ1bmN0aW9uKCJpdC5nZXQoKS52YWx1ZSgnbmFtZScpLmxlbmd0aCgpIiksIGJpbmRpbmdzLmdldCgiX2FyZ3NfNSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExhbWJkYS5jb25zdW1lcigieyB4IC0+IHguc2lkZUVmZmVjdHMoXCJsZW5ndGhTdW1cIiwgeC48SW50ZWdlcj5zaWRlRWZmZWN0cygnbGVuZ3RoU3VtJykgKyB4LmdldCgpKSB9IiksIGJpbmRpbmdzLmdldCgiX2FyZ3NfNiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExhbWJkYS5jb21wYXJhdG9yKCJhLGIgLT4gYSA8PT4gYiIpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzciKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMYW1iZGEuYmlGdW5jdGlvbigieyBhLGIgLT4gYSArIGIgfSIpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZy53aXRoU3RyYXRlZ2llcyhvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uVHJhbnNsYXRpb25TdHJhdGVneS5pbnN0YW5jZSgpKSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIi53aXRoU2lkZUVmZmVjdChfYXJnc18wLF9hcmdzXzEpLndpdGhTYWNrKF9hcmdzXzIpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiLlYoKSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIi5maWx0ZXIoX2FyZ3NfMykiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIuZmxhdE1hcChfYXJnc180KSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIi5tYXAoX2FyZ3NfNSkiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIuc2lkZUVmZmVjdChfYXJnc182KSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIi5vcmRlcigpLmJ5KF9hcmdzXzcpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiLnNhY2soX2FyZ3NfOCkiLAorICAgICAgICAgICAgICAgIHNjcmlwdC5nZXRTY3JpcHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRIYW5kbGVBcnJheSgpIHsKKyAgICAgICAgZmluYWwgVGlua2VyR3JhcGggZ3JhcGggPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpOworICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCk7CisgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIiwgdHJ1ZSkudHJhbnNsYXRlKGcuVigpLmhhcyhULmlkLCBQLndpdGhpbihuZXcgQXJyYXlMaXN0KCkge3sKKyAgICAgICAgICAgIGFkZCgxKTsKKyAgICAgICAgICAgIGFkZCgyKTsKKyAgICAgICAgICAgIGFkZCgzKTsKKyAgICAgICAgICAgIGFkZCg0KTsKKyAgICAgICAgICAgIGFkZCg1KTsKKyAgICAgICAgfX0pKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIEJpbmRpbmdzIGJpbmRpbmdzID0gbmV3IFNpbXBsZUJpbmRpbmdzKCk7CisgICAgICAgIHNjcmlwdC5nZXRQYXJhbWV0ZXJzKCkuaWZQcmVzZW50KGJpbmRpbmdzOjpwdXRBbGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgYmluZGluZ3Muc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgYmluZGluZ3MuZ2V0KCJfYXJnc18wIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMyksIGJpbmRpbmdzLmdldCgiX2FyZ3NfMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0KSwgYmluZGluZ3MuZ2V0KCJfYXJnc18zIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZy5WKCkuaGFzKFQuaWQsUC53aXRoaW4oW19hcmdzXzAsIF9hcmdzXzEsIF9hcmdzXzIsIF9hcmdzXzMsIF9hcmdzXzRdKSkiLCBzY3JpcHQuZ2V0U2NyaXB0KCkpOworCisgICAgICAgIGZpbmFsIFNjcmlwdCBzdGFuZGFyZCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoZy5WKCkuaGFzKFQuaWQsIFAud2l0aGluKG5ldyBBcnJheUxpc3QoKSB7eworICAgICAgICAgICAgYWRkKDEpOworICAgICAgICAgICAgYWRkKDIpOworICAgICAgICAgICAgYWRkKDMpOworICAgICAgICAgICAgYWRkKDQpOworICAgICAgICAgICAgYWRkKDUpOworICAgICAgICB9fSkpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKworICAgICAgICBiaW5kaW5ncy5wdXQoImciLCBnKTsKKyAgICAgICAgYXNzZXJ0UGFyYW1ldGVyaXplZFNjcmlwdE9rKHN0YW5kYXJkLmdldFNjcmlwdCgpLCBzY3JpcHQuZ2V0U2NyaXB0KCksIGJpbmRpbmdzLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhbmRsZVNldCgpIHsKKyAgICAgICAgZmluYWwgVGlua2VyR3JhcGggZ3JhcGggPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpOworICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCk7CisgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIiwgdHJ1ZSkudHJhbnNsYXRlKGcuVigpLmlkKCkuaXMobmV3IEhhc2hTZXQ8T2JqZWN0PigpIHt7CisgICAgICAgICAgICBhZGQoMyk7CisgICAgICAgICAgICBhZGQoQXJyYXlzLmFzTGlzdCgxLCAyLCAzLjFkKSk7CisgICAgICAgICAgICBhZGQoMyk7CisgICAgICAgICAgICBhZGQoIjMiKTsKKyAgICAgICAgfX0pLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgQmluZGluZ3MgYmluZGluZ3MgPSBuZXcgU2ltcGxlQmluZGluZ3MoKTsKKyAgICAgICAgc2NyaXB0LmdldFBhcmFtZXRlcnMoKS5pZlByZXNlbnQoYmluZGluZ3M6OnB1dEFsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDMpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgYmluZGluZ3MuZ2V0KCJfYXJnc18yIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEb3VibGUudmFsdWVPZigzLjEpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZy5WKCkuaWQoKS5pcyhbX2FyZ3NfMCwgX2FyZ3NfMSwgW19hcmdzXzIsIF9hcmdzXzMsIF9hcmdzXzRdXSBhcyBTZXQpIiwgc2NyaXB0LmdldFNjcmlwdCgpKTsKKworICAgICAgICBmaW5hbCBTY3JpcHQgc3RhbmRhcmQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIiApLnRyYW5zbGF0ZShnLlYoKS5pZCgpLmlzKG5ldyBIYXNoU2V0PE9iamVjdD4oKSB7eworICAgICAgICAgICAgYWRkKDMpOworICAgICAgICAgICAgYWRkKEFycmF5cy5hc0xpc3QoMSwgMiwgMy4xZCkpOworICAgICAgICAgICAgYWRkKDMpOworICAgICAgICAgICAgYWRkKCIzIik7CisgICAgICAgIH19KS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGJpbmRpbmdzLnB1dCgiZyIsIGcpOworICAgICAgICBhc3NlcnRQYXJhbWV0ZXJpemVkU2NyaXB0T2soc3RhbmRhcmQuZ2V0U2NyaXB0KCksIHNjcmlwdC5nZXRTY3JpcHQoKSwgYmluZGluZ3MsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlTWFwcygpIHsKKyAgICAgICAgZmluYWwgVGlua2VyR3JhcGggZ3JhcGggPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpOworICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCk7CisgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIiwgdHJ1ZSkudHJhbnNsYXRlKGcuVigpLmlkKCkuaXMobmV3IExpbmtlZEhhc2hNYXA8T2JqZWN0LE9iamVjdD4oKSB7eworICAgICAgICAgICAgcHV0KDMsICIzMiIpOworICAgICAgICAgICAgcHV0KEFycmF5cy5hc0xpc3QoMSwgMiwgMy4xZCksIDQpOworICAgICAgICB9fSkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICBCaW5kaW5ncyBiaW5kaW5ncyA9IG5ldyBTaW1wbGVCaW5kaW5ncygpOworICAgICAgICBzY3JpcHQuZ2V0UGFyYW1ldGVycygpLmlmUHJlc2VudChiaW5kaW5nczo6cHV0QWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGJpbmRpbmdzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMyksIGJpbmRpbmdzLmdldCgiX2FyZ3NfMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzMiIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgYmluZGluZ3MuZ2V0KCJfYXJnc18yIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEb3VibGUudmFsdWVPZigzLjEpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNCksIGJpbmRpbmdzLmdldCgiX2FyZ3NfNSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLlYoKS5pZCgpLmlzKFsoX2FyZ3NfMCk6KF9hcmdzXzEpLChbX2FyZ3NfMiwgX2FyZ3NfMywgX2FyZ3NfNF0pOihfYXJnc181KV0pIiwgc2NyaXB0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgZmluYWwgU2NyaXB0IHN0YW5kYXJkID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLlYoKS5pZCgpLmlzKG5ldyBMaW5rZWRIYXNoTWFwPE9iamVjdCxPYmplY3Q+KCkge3sKKyAgICAgICAgICAgIHB1dCgzLCAiMzIiKTsKKyAgICAgICAgICAgIHB1dChBcnJheXMuYXNMaXN0KDEsIDIsIDMuMWQpLCA0KTsKKyAgICAgICAgfX0pLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgYmluZGluZ3MucHV0KCJnIiwgZyk7CisgICAgICAgIGFzc2VydFBhcmFtZXRlcml6ZWRTY3JpcHRPayhzdGFuZGFyZC5nZXRTY3JpcHQoKSwgc2NyaXB0LmdldFNjcmlwdCgpLCBiaW5kaW5ncywgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRIYW5kbGVFbXB0eU1hcHMoKSB7CisgICAgICAgIGZpbmFsIFRpbmtlckdyYXBoIGdyYXBoID0gVGlua2VyRmFjdG9yeS5jcmVhdGVNb2Rlcm4oKTsKKyAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IGdyYXBoLnRyYXZlcnNhbCgpOworICAgICAgICBmaW5hbCBGdW5jdGlvbiBpZGVudGl0eSA9IG5ldyBMYW1iZGEuT25lQXJnTGFtYmRhKCJpdC5nZXQoKSIsICJncmVtbGluLWdyb292eSIpOworICAgICAgICBmaW5hbCBTY3JpcHQgc2NyaXB0ID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIsIHRydWUpLnRyYW5zbGF0ZShnLmluamVjdChDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKS5tYXAoaWRlbnRpdHkpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgQmluZGluZ3MgYmluZGluZ3MgPSBuZXcgU2ltcGxlQmluZGluZ3MoKTsKKyAgICAgICAgc2NyaXB0LmdldFBhcmFtZXRlcnMoKS5pZlByZXNlbnQoYmluZGluZ3M6OnB1dEFsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaWRlbnRpdHksIGJpbmRpbmdzLmdldCgiX2FyZ3NfMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLmluamVjdChbXSkubWFwKF9hcmdzXzApIiwgc2NyaXB0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgYmluZGluZ3MucHV0KCJnIiwgZyk7CisgICAgICAgIGFzc2VydFRoYXRTY3JpcHRPayhzY3JpcHQuZ2V0U2NyaXB0KCksIGJpbmRpbmdzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhbmRsZURhdGUoKSB7CisgICAgICAgIGZpbmFsIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjLnNldCgxOTc1LCBDYWxlbmRhci5TRVBURU1CRVIsIDcpOworICAgICAgICBmaW5hbCBEYXRlIGQgPSBjLmdldFRpbWUoKTsKKyAgICAgICAgYXNzZXJ0UGFyYW1ldGVyaXplZFRyYW5zbGF0aW9uKFN0cmluZy5mb3JtYXQoIm5ldyBqYXZhLnV0aWwuRGF0ZSglcykiLCBkLmdldFRpbWUoKSksIGQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlUHJlZGljYXRlKCkgeworICAgICAgICBQIHAgPSBuZXcgUChDb21wYXJlLmVxLCAxMCk7CisgICAgICAgIGFzc2VydFBhcmFtZXRlcml6ZWRUcmFuc2xhdGlvbihTdHJpbmcuZm9ybWF0KCJuZXcgamF2YS51dGlsLkRhdGUoJXMpIiwgcC50b1N0cmluZygpKSwgMTApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlVGltZXN0YW1wKCkgeworICAgICAgICBmaW5hbCBDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgYy5zZXQoMTk3NSwgQ2FsZW5kYXIuU0VQVEVNQkVSLCA3KTsKKyAgICAgICAgZmluYWwgVGltZXN0YW1wIHQgPSBuZXcgVGltZXN0YW1wKGMuZ2V0VGltZSgpLmdldFRpbWUoKSk7CisgICAgICAgIGFzc2VydFBhcmFtZXRlcml6ZWRUcmFuc2xhdGlvbihTdHJpbmcuZm9ybWF0KCJuZXcgamF2YS5zcWwuVGltZXN0YW1wKCVzKSIsIHQuZ2V0VGltZSgpKSwgdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRIYW5kbGVVdWlkKCkgeworICAgICAgICBmaW5hbCBVVUlEIHV1aWQgPSBVVUlELmZyb21TdHJpbmcoImZmZmZmZmZmLWZkNDktMWU0Yi0wMDAwLTAwMDAwZDRiOGExZCIpOworICAgICAgICBhc3NlcnRQYXJhbWV0ZXJpemVkVHJhbnNsYXRpb24oU3RyaW5nLmZvcm1hdCgiamF2YS51dGlsLlVVSUQuZnJvbVN0cmluZygnJXMnKSIsIHV1aWQpLCB1dWlkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhbmRsZUNsYXNzKCkgeworICAgICAgICBDbGFzcyBjbHMgPSBWZXJ0ZXguY2xhc3M7CisgICAgICAgIGFzc2VydFBhcmFtZXRlcml6ZWRUcmFuc2xhdGlvbihTdHJpbmcuZm9ybWF0KCIlcyIsIGNscyksIGNscy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlQmFycmllcigpIHsKKyAgICAgICAgU2Fja0Z1bmN0aW9ucy5CYXJyaWVyIGJhcnJpZXIgPSBTYWNrRnVuY3Rpb25zLkJhcnJpZXIubm9ybVNhY2s7CisgICAgICAgIGFzc2VydE5vblBhcmFtZXRlcml6ZWRUcmFuc2xhdGlvbihTdHJpbmcuZm9ybWF0KCJTYWNrRnVuY3Rpb25zLkJhcnJpZXIuJXMiLCBiYXJyaWVyKSwgYmFycmllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRIYW5kbGVDYXJkaW5hbGl0eSgpIHsKKyAgICAgICAgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkgY2FyZGluYWxpdHkgPSBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5zZXQ7CisgICAgICAgIGFzc2VydE5vblBhcmFtZXRlcml6ZWRUcmFuc2xhdGlvbihTdHJpbmcuZm9ybWF0KCJWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS4lcyIsIGNhcmRpbmFsaXR5KSwgY2FyZGluYWxpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlUGljaygpIHsKKyAgICAgICAgVHJhdmVyc2FsT3B0aW9uUGFyZW50LlBpY2sgcGljayA9IFRyYXZlcnNhbE9wdGlvblBhcmVudC5QaWNrLmFueTsKKyAgICAgICAgYXNzZXJ0Tm9uUGFyYW1ldGVyaXplZFRyYW5zbGF0aW9uKFN0cmluZy5mb3JtYXQoIlRyYXZlcnNhbE9wdGlvblBhcmVudC5QaWNrLiVzIiwgcGljayksIHBpY2spOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlQ29sdW1uKCkgeworICAgICAgICBhc3NlcnROb25QYXJhbWV0ZXJpemVkVHJhbnNsYXRpb24oIkNvbHVtbi5rZXlzIiwgQ29sdW1uLmtleXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlRGlyZWN0aW9uKCkgeworICAgICAgICBhc3NlcnROb25QYXJhbWV0ZXJpemVkVHJhbnNsYXRpb24oIkRpcmVjdGlvbi5CT1RIIiwgRGlyZWN0aW9uLkJPVEgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlT3JkZXIoKSB7CisgICAgICAgIGFzc2VydE5vblBhcmFtZXRlcml6ZWRUcmFuc2xhdGlvbigiT3JkZXIuc2h1ZmZsZSIsIE9yZGVyLnNodWZmbGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlUG9wKCkgeworICAgICAgICBhc3NlcnROb25QYXJhbWV0ZXJpemVkVHJhbnNsYXRpb24oIlBvcC5sYXN0IiwgUG9wLmxhc3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlU2NvcGUoKSB7CisgICAgICAgIGFzc2VydE5vblBhcmFtZXRlcml6ZWRUcmFuc2xhdGlvbigiU2NvcGUubG9jYWwiLCBTY29wZS5sb2NhbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRJbmNsdWRlQ3VzdG9tVHlwZVRyYW5zbGF0aW9uRm9yU29tZXRoaW5nU2lsbHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVGlua2VyR3JhcGggZ3JhcGggPSBUaW5rZXJHcmFwaC5vcGVuKCk7CisgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzIG5vdFNpbGx5RW5vdWdoID0gUGFyYW1ldGVyaXplZFNpbGx5Q2xhc3MuZnJvbSgibm90IHNpbGx5IGVub3VnaCIsIDEwMCk7CisgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKKworICAgICAgICAvLyB3aXRob3V0IHR5cGUgdHJhbnNsYXRpb24gd2UgZ2V0IHVnbGluZXNzcworICAgICAgICBmaW5hbCBTY3JpcHQgcGFyYW1ldGVyaXplZFNjcmlwdEJhZCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciLCB0cnVlKS4KKyAgICAgICAgICAgICAgICB0cmFuc2xhdGUoZy5pbmplY3Qobm90U2lsbHlFbm91Z2gpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgQmluZGluZ3MgYmluZGluZ3MgPSBuZXcgU2ltcGxlQmluZGluZ3MoKTsKKyAgICAgICAgcGFyYW1ldGVyaXplZFNjcmlwdEJhZC5nZXRQYXJhbWV0ZXJzKCkuaWZQcmVzZW50KGJpbmRpbmdzOjpwdXRBbGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiZy5pbmplY3QoJXMpIiwgIl9hcmdzXzAiKSwgcGFyYW1ldGVyaXplZFNjcmlwdEJhZC5nZXRTY3JpcHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobm90U2lsbHlFbm91Z2gsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMCIpKTsKKyAgICAgICAgYmluZGluZ3MuY2xlYXIoKTsKKworICAgICAgICAvLyB3aXRoIHR5cGUgdHJhbnNsYXRpb24gd2UgZ2V0IHZhbGlkIGdyZW1saW4KKyAgICAgICAgZmluYWwgU2NyaXB0IHBhcmFtZXRlcml6ZWRTY3JpcHRHb29kID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIsIG5ldyBQYXJhbWV0ZXJpemVkU2lsbHlDbGFzc1RyYW5zbGF0b3JDdXN0b21pemVyKCkuY3JlYXRlVHlwZVRyYW5zbGF0b3IoKSkuCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlKGcuaW5qZWN0KG5vdFNpbGx5RW5vdWdoKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIHBhcmFtZXRlcml6ZWRTY3JpcHRHb29kLmdldFBhcmFtZXRlcnMoKS5pZlByZXNlbnQoYmluZGluZ3M6OnB1dEFsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobm90U2lsbHlFbm91Z2guZ2V0WCgpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhub3RTaWxseUVub3VnaC5nZXRZKCksIGJpbmRpbmdzLmdldCgiX2FyZ3NfMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLmluamVjdChvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS5qc3IyMjMuUGFyYW1ldGVyaXplZEdyb292eVRyYW5zbGF0b3JUZXN0LlBhcmFtZXRlcml6ZWRTaWxseUNsYXNzLmZyb20oX2FyZ3NfMCxfYXJnc18xKSkiLCBwYXJhbWV0ZXJpemVkU2NyaXB0R29vZC5nZXRTY3JpcHQoKSk7CisgICAgICAgIGJpbmRpbmdzLnB1dCgiZyIsIGcpOworICAgICAgICBhc3NlcnRUaGF0U2NyaXB0T2socGFyYW1ldGVyaXplZFNjcmlwdEdvb2QuZ2V0U2NyaXB0KCksIGJpbmRpbmdzKTsKKworICAgICAgICBmaW5hbCBHcmVtbGluR3Jvb3Z5U2NyaXB0RW5naW5lIGN1c3RvbUVuZ2luZSA9IG5ldyBHcmVtbGluR3Jvb3Z5U2NyaXB0RW5naW5lKG5ldyBQYXJhbWV0ZXJpemVkU2lsbHlDbGFzc1RyYW5zbGF0b3JDdXN0b21pemVyKCkpOworICAgICAgICBmaW5hbCBUcmF2ZXJzYWwgdCA9IGN1c3RvbUVuZ2luZS5ldmFsKGcuaW5qZWN0KG5vdFNpbGx5RW5vdWdoKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSwgYmluZGluZ3MsICJnIik7CisgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzIHNjID0gKFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzKSB0Lm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdFNpbGx5RW5vdWdoLmdldFgoKSwgc2MuZ2V0WCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdFNpbGx5RW5vdWdoLmdldFkoKSwgc2MuZ2V0WSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0Lmhhc05leHQoKSwgaXMoZmFsc2UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEhhdmVWYWxpZFRvU3RyaW5nKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInRyYW5zbGF0b3JbaDpncmVtbGluLWdyb292eV0iLCBHcm9vdnlUcmFuc2xhdG9yLm9mKCJoIiwgdHJ1ZSkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRFc2NhcGVTdHJpbmdzKCkgeworICAgICAgICBmaW5hbCBUaW5rZXJHcmFwaCBncmFwaCA9IFRpbmtlckZhY3RvcnkuY3JlYXRlTW9kZXJuKCk7CisgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKKyAgICAgICAgZmluYWwgU2NyaXB0IHNjcmlwdCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciLCB0cnVlKS50cmFuc2xhdGUoZy5hZGRWKCJjdXN0b21lciIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJjdXN0b21lcl9pZCIsIDUwMUwpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJuYW1lIiwgIkZvb1x1MDAyMEJhciIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJhZ2UiLCAyNSkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoInNwZWNpYWwiLCAiYH4hQCMkJV4mKigpLV89K1t7XX1cXHw7OidcIiw8Lj4vPyIpCisgICAgICAgICAgICAgICAgLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgQmluZGluZ3MgYmluZGluZ3MgPSBuZXcgU2ltcGxlQmluZGluZ3MoKTsKKyAgICAgICAgc2NyaXB0LmdldFBhcmFtZXRlcnMoKS5pZlByZXNlbnQoYmluZGluZ3M6OnB1dEFsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbWVyIiwgYmluZGluZ3MuZ2V0KCJfYXJnc18wIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbWVyX2lkIiwgYmluZGluZ3MuZ2V0KCJfYXJnc18xIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKDUwMSksIGJpbmRpbmdzLmdldCgiX2FyZ3NfMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYmluZGluZ3MuZ2V0KCJfYXJnc18zIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZvb1x1MDAyMEJhciIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfNCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZ2UiLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjUpLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzYiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3BlY2lhbCIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfNyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJgfiFAIyQlXiYqKCktXz0rW3tdfVxcfDs6J1wiLDwuPi8/IiwgYmluZGluZ3MuZ2V0KCJfYXJnc184IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImcuYWRkVihfYXJnc18wKS5wcm9wZXJ0eShfYXJnc18xLF9hcmdzXzIpLnByb3BlcnR5KF9hcmdzXzMsX2FyZ3NfNCkucHJvcGVydHkoX2FyZ3NfNSxfYXJnc182KS5wcm9wZXJ0eShfYXJnc183LF9hcmdzXzgpIiwgc2NyaXB0LmdldFNjcmlwdCgpKTsKKworICAgICAgICBmaW5hbCBTY3JpcHQgc3RhbmRhcmQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIikudHJhbnNsYXRlKGcuYWRkVigiY3VzdG9tZXIiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiY3VzdG9tZXJfaWQiLCA1MDFMKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgibmFtZSIsICJGb29cdTAwMjBCYXIiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiYWdlIiwgMjUpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJzcGVjaWFsIiwgImB+IUAjJCVeJiooKS1fPStbe119XFx8OzonXCIsPC4+Lz8iKQorICAgICAgICAgICAgICAgIC5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisKKyAgICAgICAgYmluZGluZ3MucHV0KCJnIiwgZyk7CisgICAgICAgIC8vYWRkIHZlcnRleCB3aWxsIHJldHVybiBkaWZmZXJlbnQgdmVydGV4IGlkCisgICAgICAgIGFzc2VydFBhcmFtZXRlcml6ZWRTY3JpcHRPayhzdGFuZGFyZC5nZXRTY3JpcHQoKSwgc2NyaXB0LmdldFNjcmlwdCgpLCBiaW5kaW5ncywgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlVmVydGV4QW5kRWRnZSgpIHsKKyAgICAgICAgZmluYWwgVGlua2VyR3JhcGggZ3JhcGggPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpOworICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCk7CisKKyAgICAgICAgZmluYWwgT2JqZWN0IGlkMSA9ICJjdXN0b21lcjoxMDpmb29cdTAwMjBiYXJcdTAwMjBcdTAwMjQxMDAjOTAiOyAvLyBjdXN0b21lcjoxMDpmb28gYmFyICQxMDAjOTAKKyAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleDEgPSBEZXRhY2hlZFZlcnRleC5idWlsZCgpLnNldExhYmVsKCJjdXN0b21lciIpLnNldElkKGlkMSkKKyAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQxID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIsIHRydWUpLnRyYW5zbGF0ZShnLmluamVjdCh2ZXJ0ZXgxKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIEJpbmRpbmdzIGJpbmRpbmdzID0gbmV3IFNpbXBsZUJpbmRpbmdzKCk7CisgICAgICAgIHNjcmlwdDEuZ2V0UGFyYW1ldGVycygpLmlmUHJlc2VudChiaW5kaW5nczo6cHV0QWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJpbmRpbmdzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpZDEsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdXN0b21lciIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnLmluamVjdChuZXcgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5kZXRhY2hlZC5EZXRhY2hlZFZlcnRleChfYXJnc18wLF9hcmdzXzEsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKSIsIHNjcmlwdDEuZ2V0U2NyaXB0KCkpOworICAgICAgICBmaW5hbCBTY3JpcHQgc3RhbmRhcmQxID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLmluamVjdCh2ZXJ0ZXgxKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGJpbmRpbmdzLnB1dCgiZyIsIGcpOworICAgICAgICAvLyBUaW5rZXJHcmFwaCBub3Qgc3VwcG9ydCBzdHJpbmcgaWQKKyAgICAgICAgYXNzZXJ0UGFyYW1ldGVyaXplZFNjcmlwdE9rKHN0YW5kYXJkMS5nZXRTY3JpcHQoKSwgc2NyaXB0MS5nZXRTY3JpcHQoKSwgYmluZGluZ3MsIGZhbHNlKTsKKyAgICAgICAgYmluZGluZ3MuY2xlYXIoKTsKKworICAgICAgICBmaW5hbCBPYmplY3QgaWQyID0gInVzZXI6MjA6Zm9vXFx1MDAyMGJhclxcdTAwNWNcXHUwMDIybXJcXHUwMDVjXFx1MDAyMlxcdTAwMjQxMDAwIzUwIjsgLy8gdXNlcjoyMDpmb29cdTAwMjBiYXJcdTAwNWNcdTAwMjJtclx1MDA1Y1x1MDAyMlx1MDAyNDEwMDAjNTAKKyAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleDIgPSBEZXRhY2hlZFZlcnRleC5idWlsZCgpLnNldExhYmVsKCJ1c2VyIikuc2V0SWQoaWQyKQorICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKKyAgICAgICAgZmluYWwgU2NyaXB0IHNjcmlwdDIgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIiwgdHJ1ZSkudHJhbnNsYXRlKGcuaW5qZWN0KHZlcnRleDIpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgc2NyaXB0Mi5nZXRQYXJhbWV0ZXJzKCkuaWZQcmVzZW50KGJpbmRpbmdzOjpwdXRBbGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYmluZGluZ3Muc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlkMiwgYmluZGluZ3MuZ2V0KCJfYXJnc18wIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXIiLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZy5pbmplY3QobmV3IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZGV0YWNoZWQuRGV0YWNoZWRWZXJ0ZXgoX2FyZ3NfMCxfYXJnc18xLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSkiLCBzY3JpcHQyLmdldFNjcmlwdCgpKTsKKyAgICAgICAgZmluYWwgU2NyaXB0IHN0YW5kYXJkMiA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoZy5pbmplY3QodmVydGV4MikuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICBiaW5kaW5ncy5wdXQoImciLCBnKTsKKyAgICAgICAgYXNzZXJ0UGFyYW1ldGVyaXplZFNjcmlwdE9rKHN0YW5kYXJkMi5nZXRTY3JpcHQoKSwgc2NyaXB0Mi5nZXRTY3JpcHQoKSwgYmluZGluZ3MsIGZhbHNlKTsKKyAgICAgICAgYmluZGluZ3MuY2xlYXIoKTsKKworICAgICAgICBmaW5hbCBPYmplY3QgaWQzID0gImtub3dzOjMwOmZvb1x1MDAyMGJhclx1MDAyMFx1MDAyNDEwMDpcXHUwMDIwXFx1MDAyNDUwMCM3MCI7CisgICAgICAgIGZpbmFsIEVkZ2UgZWRnZSA9IERldGFjaGVkRWRnZS5idWlsZCgpLnNldExhYmVsKCJrbm93cyIpLnNldElkKGlkMykKKyAgICAgICAgICAgICAgICAuc2V0T3V0VigoRGV0YWNoZWRWZXJ0ZXgpIHZlcnRleDEpCisgICAgICAgICAgICAgICAgLnNldEluVigoRGV0YWNoZWRWZXJ0ZXgpIHZlcnRleDIpCisgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOworICAgICAgICBmaW5hbCBTY3JpcHQgc2NyaXB0MyA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciLCB0cnVlKS50cmFuc2xhdGUoZy5pbmplY3QoZWRnZSkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICBzY3JpcHQzLmdldFBhcmFtZXRlcnMoKS5pZlByZXNlbnQoYmluZGluZ3M6OnB1dEFsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaWQzLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygia25vd3MiLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpZDEsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdXN0b21lciIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlkMiwgYmluZGluZ3MuZ2V0KCJfYXJnc180IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXIiLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZy5pbmplY3QobmV3IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuZGV0YWNoZWQuRGV0YWNoZWRFZGdlKF9hcmdzXzAsX2FyZ3NfMSxDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLF9hcmdzXzIsX2FyZ3NfMyxfYXJnc180LF9hcmdzXzUpKSIsIHNjcmlwdDMuZ2V0U2NyaXB0KCkpOworICAgICAgICBmaW5hbCBTY3JpcHQgc3RhbmRhcmQzID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLmluamVjdChlZGdlKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGJpbmRpbmdzLnB1dCgiZyIsIGcpOworICAgICAgICBhc3NlcnRQYXJhbWV0ZXJpemVkU2NyaXB0T2soc3RhbmRhcmQzLmdldFNjcmlwdCgpLCBzY3JpcHQzLmdldFNjcmlwdCgpLCBiaW5kaW5ncywgZmFsc2UpOworICAgICAgICBiaW5kaW5ncy5jbGVhcigpOworCisgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQ0ID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIsIHRydWUpLnRyYW5zbGF0ZSgKKyAgICAgICAgICAgICAgICBnLmFkZEUoImtub3dzIikuZnJvbSh2ZXJ0ZXgxKS50byh2ZXJ0ZXgyKS5wcm9wZXJ0eSgid2hlbiIsICIyMDE4LzA5LzIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIHNjcmlwdDQuZ2V0UGFyYW1ldGVycygpLmlmUHJlc2VudChiaW5kaW5nczo6cHV0QWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGJpbmRpbmdzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygia25vd3MiLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpZDEsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdXN0b21lciIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlkMiwgYmluZGluZ3MuZ2V0KCJfYXJnc18zIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXIiLCBiaW5kaW5ncy5nZXQoIl9hcmdzXzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2hlbiIsIGJpbmRpbmdzLmdldCgiX2FyZ3NfNSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDE4LzA5LzIxIiwgYmluZGluZ3MuZ2V0KCJfYXJnc182IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImcuYWRkRShfYXJnc18wKS5mcm9tKG5ldyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkVmVydGV4KF9hcmdzXzEsX2FyZ3NfMiwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkpLnRvKG5ldyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkVmVydGV4KF9hcmdzXzMsX2FyZ3NfNCwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkpLnByb3BlcnR5KF9hcmdzXzUsX2FyZ3NfNikiLCBzY3JpcHQ0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgZmluYWwgU2NyaXB0IHN0YW5kYXJkNCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoCisgICAgICAgICAgICAgICAgZy5hZGRFKCJrbm93cyIpLmZyb20odmVydGV4MSkudG8odmVydGV4MikucHJvcGVydHkoIndoZW4iLCAiMjAxOC8wOS8yMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICBiaW5kaW5ncy5wdXQoImciLCBnKTsKKyAgICAgICAgYXNzZXJ0UGFyYW1ldGVyaXplZFNjcmlwdE9rKHN0YW5kYXJkNC5nZXRTY3JpcHQoKSwgc2NyaXB0NC5nZXRTY3JpcHQoKSwgYmluZGluZ3MsIGZhbHNlKTsKKyAgICAgICAgYmluZGluZ3MuY2xlYXIoKTsKKworICAgICAgICBmaW5hbCBTY3JpcHQgc2NyaXB0NSA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciLCB0cnVlKS50cmFuc2xhdGUoZy5WKCkuaGFzKCJhZ2UiKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIHNjcmlwdDUuZ2V0UGFyYW1ldGVycygpLmlmUHJlc2VudChiaW5kaW5nczo6cHV0QWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGJpbmRpbmdzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWdlIiwgYmluZGluZ3MuZ2V0KCJfYXJnc18wIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImcuVigpLmhhcyhfYXJnc18wKSIsIHNjcmlwdDUuZ2V0U2NyaXB0KCkpOworICAgICAgICBmaW5hbCBTY3JpcHQgc3RhbmRhcmQ1ID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLlYoKS5oYXMoImFnZSIpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgYmluZGluZ3MucHV0KCJnIiwgZyk7CisgICAgICAgIC8vIE9rLCBoZXJlIHdlIGNoZWNraW5nIGFsbCB0aGUgcmVzdWx0CisgICAgICAgIGFzc2VydFBhcmFtZXRlcml6ZWRTY3JpcHRPayhzdGFuZGFyZDUuZ2V0U2NyaXB0KCksIHNjcmlwdDUuZ2V0U2NyaXB0KCksIGJpbmRpbmdzLCB0cnVlKTsKKyAgICAgICAgYmluZGluZ3MuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBldmFsKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBCaW5kaW5ncyBiKSB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcml6ZWRFbmdpbmUuZXZhbChzLCBiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGFyYW1ldGVyaXplZFRyYW5zbGF0aW9uKGZpbmFsIFN0cmluZyBleHBlY3RlZFRyYW5zbGF0aW9uLCBmaW5hbCBPYmplY3QuLi4gb2JqcykgeworICAgICAgICBmaW5hbCBTY3JpcHQgc2NyaXB0ID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIsIHRydWUpLnRyYW5zbGF0ZShnLmluamVjdChvYmpzKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIEJpbmRpbmdzIGJpbmRpbmdzID0gbmV3IFNpbXBsZUJpbmRpbmdzKCk7CisgICAgICAgIHNjcmlwdC5nZXRQYXJhbWV0ZXJzKCkuaWZQcmVzZW50KGJpbmRpbmdzOjpwdXRBbGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYmluZGluZ3Muc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9ianNbMF0sIGJpbmRpbmdzLmdldCgiX2FyZ3NfMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoImcuaW5qZWN0KF9hcmdzXzApIiwgZXhwZWN0ZWRUcmFuc2xhdGlvbiksIHNjcmlwdC5nZXRTY3JpcHQoKSk7CisKKyAgICAgICAgZmluYWwgU2NyaXB0IHN0YW5kYXJkID0gR3Jvb3Z5VHJhbnNsYXRvci5vZigiZyIpLnRyYW5zbGF0ZShnLmluamVjdChvYmpzKS5hc0FkbWluKCkuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIGJpbmRpbmdzLnB1dCgiZyIsIGcpOworICAgICAgICBhc3NlcnRQYXJhbWV0ZXJpemVkU2NyaXB0T2soc3RhbmRhcmQuZ2V0U2NyaXB0KCksIHNjcmlwdC5nZXRTY3JpcHQoKSwgYmluZGluZ3MsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb25QYXJhbWV0ZXJpemVkVHJhbnNsYXRpb24oZmluYWwgU3RyaW5nIGV4cGVjdGVkVHJhbnNsYXRpb24sIGZpbmFsIE9iamVjdC4uLiBvYmpzKSB7CisgICAgICAgIGZpbmFsIFNjcmlwdCBzY3JpcHQgPSBHcm9vdnlUcmFuc2xhdG9yLm9mKCJnIiwgdHJ1ZSkudHJhbnNsYXRlKGcuaW5qZWN0KG9ianMpLmFzQWRtaW4oKS5nZXRCeXRlY29kZSgpKTsKKyAgICAgICAgQmluZGluZ3MgYmluZGluZ3MgPSBuZXcgU2ltcGxlQmluZGluZ3MoKTsKKyAgICAgICAgc2NyaXB0LmdldFBhcmFtZXRlcnMoKS5pZlByZXNlbnQoYmluZGluZ3M6OnB1dEFsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBiaW5kaW5ncy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiZy5pbmplY3QoJXMpIiwgZXhwZWN0ZWRUcmFuc2xhdGlvbiksICBzY3JpcHQuZ2V0U2NyaXB0KCkpOworCisgICAgICAgIGZpbmFsIFNjcmlwdCBzdGFuZGFyZCA9IEdyb292eVRyYW5zbGF0b3Iub2YoImciKS50cmFuc2xhdGUoZy5pbmplY3Qob2JqcykuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhbmRhcmQuZ2V0U2NyaXB0KCksIHNjcmlwdC5nZXRTY3JpcHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRoYXRTY3JpcHRPayhmaW5hbCBTdHJpbmcgcywgQmluZGluZ3MgYmluZGluZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXZhbChzLCBiaW5kaW5ncykpOworICAgICAgICB9IGNhdGNoIChTY3JpcHRFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHNlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiU2NyaXB0IHNob3VsZCBoYXZlIGV2YWwnZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBhcmFtZXRlcml6ZWRTY3JpcHRPayhmaW5hbCBTdHJpbmcgc3RhbmRhcmRTY3JpcHQsIGZpbmFsIFN0cmluZyBjaGVja2luZ1NjcmlwdCwgZmluYWwgQmluZGluZ3MgYmluZGluZ3MsIGZpbmFsIGJvb2xlYW4gcmVzdWx0Q2hlY2tpbmcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGFuZGFyZFNjcmlwdCArICIgIiArIGNoZWNraW5nU2NyaXB0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIXN0YW5kYXJkU2NyaXB0LmVxdWFscyhjaGVja2luZ1NjcmlwdCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdFNjcmlwdE9rKGNoZWNraW5nU2NyaXB0LCBiaW5kaW5ncyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXZhbChzdGFuZGFyZFNjcmlwdCwgYmluZGluZ3MpLCBldmFsKGNoZWNraW5nU2NyaXB0LCBiaW5kaW5ncykpOworICAgICAgICAgICAgaWYgKHJlc3VsdENoZWNraW5nKSB7CisgICAgICAgICAgICAgICAgVHJhdmVyc2FsLkFkbWluPFZlcnRleCwgT2JqZWN0PiBzdGFuZGFyZFRyYXZlcnNhbCA9IChUcmF2ZXJzYWwuQWRtaW4pIGV2YWwoc3RhbmRhcmRTY3JpcHQsIGJpbmRpbmdzKTsKKyAgICAgICAgICAgICAgICBUcmF2ZXJzYWwuQWRtaW48VmVydGV4LCBPYmplY3Q+IGNoZWNraW5nVHJhdmVyc2FsID0gKFRyYXZlcnNhbC5BZG1pbikgZXZhbChjaGVja2luZ1NjcmlwdCwgYmluZGluZ3MpOworICAgICAgICAgICAgICAgIHdoaWxlIChzdGFuZGFyZFRyYXZlcnNhbC5oYXNOZXh0KCkgJiYgY2hlY2tpbmdUcmF2ZXJzYWwuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFzc2VydEVxdWFscyhzdGFuZGFyZFRyYXZlcnNhbC5uZXh0KCksIGNoZWNraW5nVHJhdmVyc2FsLm5leHQoKSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGFuZGFyZFRyYXZlcnNhbC5uZXh0KCkgKyAgIiAiICsgY2hlY2tpbmdUcmF2ZXJzYWwubmV4dCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YW5kYXJkVHJhdmVyc2FsLmhhc05leHQoKSwgY2hlY2tpbmdUcmF2ZXJzYWwuaGFzTmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2NyaXB0RXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBzZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlNjcmlwdCBzaG91bGQgaGF2ZSBldmFsJ2QiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVyaXplZFNpbGx5Q2xhc3MgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHg7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHk7CisKKyAgICAgICAgcHJpdmF0ZSBQYXJhbWV0ZXJpemVkU2lsbHlDbGFzcyhmaW5hbCBTdHJpbmcgeCwgZmluYWwgaW50IHkpIHsKKyAgICAgICAgICAgIHRoaXMueCA9IHg7CisgICAgICAgICAgICB0aGlzLnkgPSB5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQYXJhbWV0ZXJpemVkU2lsbHlDbGFzcyBmcm9tKGZpbmFsIFN0cmluZyB4LCBmaW5hbCBpbnQgeSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkU2lsbHlDbGFzcyh4LCB5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0WCgpIHsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRZKCkgeworICAgICAgICAgICAgcmV0dXJuIHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJndW1lbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7eCx5fTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZ3Jvb3Z5LmpzcjIyMy5QYXJhbWV0ZXJpemVkR3Jvb3Z5VHJhbnNsYXRvclRlc3QuUGFyYW1ldGVyaXplZFNpbGx5Q2xhc3MuZnJvbSgnJXMnLCAoaW50KSAlcykiLCBnZXRYKCksIGdldFkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzVHJhbnNsYXRvciBleHRlbmRzICBHcm9vdnlUcmFuc2xhdG9yLkRlZmF1bHRUeXBlVHJhbnNsYXRvciB7CisgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkU2lsbHlDbGFzc1RyYW5zbGF0b3IoZmluYWwgYm9vbGVhbiB3aXRoUGFyYW1ldGVycykgeworICAgICAgICAgICBzdXBlcih3aXRoUGFyYW1ldGVycyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNjcmlwdCBjb252ZXJ0VG9TY3JpcHQoZmluYWwgT2JqZWN0IG9iamVjdCkgeworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzKSB7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyaXplZFNpbGx5Q2xhc3Mgb2JqID0gKFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZChvYmouZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgICAgIGlmICgwID09IG9iai5nZXRBcmd1bWVudHMoKS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgiLiIpLmFwcGVuZCgiZnJvbSIpLmFwcGVuZCgiKCkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIuIikuYXBwZW5kKCJmcm9tIikuYXBwZW5kKCIoIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGFyZ3VtZW50OiBvYmouZ2V0QXJndW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjcmlwdChhcmd1bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNldENoYXJBdEVuZCgnKScpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU2NyaXB0KG9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzVHJhbnNsYXRvckN1c3RvbWl6ZXIgaW1wbGVtZW50cyBUcmFuc2xhdG9yQ3VzdG9taXplciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUcmFuc2xhdG9yLlNjcmlwdFRyYW5zbGF0b3IuVHlwZVRyYW5zbGF0b3IgY3JlYXRlVHlwZVRyYW5zbGF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRTaWxseUNsYXNzVHJhbnNsYXRvcih0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS91dGlsL0RlcGVuZGVuY3lHcmFiYmVySW50ZWdyYXRlVGVzdC5qYXZhIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS91dGlsL0RlcGVuZGVuY3lHcmFiYmVySW50ZWdyYXRlVGVzdC5qYXZhCmluZGV4IDg1MGE2MmYuLmEwZDU1NDkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvdXRpbC9EZXBlbmRlbmN5R3JhYmJlckludGVncmF0ZVRlc3QuamF2YQorKysgYi9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L3V0aWwvRGVwZW5kZW5jeUdyYWJiZXJJbnRlZ3JhdGVUZXN0LmphdmEKQEAgLTM2LDcgKzM2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIERlcGVuZGVuY3lHcmFiYmVySW50ZWdyYXRlVGVzdCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0lEID0gIm9yZy5hcGFjaGUudGlua2VycG9wIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIzLjMuNyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMy4zLjkiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ3Jvb3Z5Q2xhc3NMb2FkZXIgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIGV4dFRlc3REaXIgPSBUZXN0SGVscGVyLm1ha2VUZXN0RGF0YVBhdGgoRGVwZW5kZW5jeUdyYWJiZXJJbnRlZ3JhdGVUZXN0LmNsYXNzKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi91dGlsL1RpbmtlckdyYXBoUHJvdmlkZXIuamF2YSBiL2dyZW1saW4tZ3Jvb3Z5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi91dGlsL1RpbmtlckdyYXBoUHJvdmlkZXIuamF2YQppbmRleCA4OWZkYjExLi4yOTIzMGJiIDEwMDY0NAotLS0gYS9ncmVtbGluLWdyb292eS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdXRpbC9UaW5rZXJHcmFwaFByb3ZpZGVyLmphdmEKKysrIGIvZ3JlbWxpbi1ncm9vdnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3V0aWwvVGlua2VyR3JhcGhQcm92aWRlci5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkFic3RyYWN0R3JhcGhQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkxvYWRHcmFwaFdpdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5UZXN0SGVscGVyOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1qYXZhc2NyaXB0L2dsdi9HcmFwaFRyYXZlcnNhbFNvdXJjZS50ZW1wbGF0ZSBiL2dyZW1saW4tamF2YXNjcmlwdC9nbHYvR3JhcGhUcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDc2ZjEuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1qYXZhc2NyaXB0L2dsdi9HcmFwaFRyYXZlcnNhbFNvdXJjZS50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBhdXRob3IgSm9yZ2UgQmF5IEdvbmRyYQotICovCi0ndXNlIHN0cmljdCc7Ci0KLWNvbnN0IHsgVHJhdmVyc2FsIH0gPSByZXF1aXJlKCcuL3RyYXZlcnNhbCcpOwotY29uc3QgcmVtb3RlID0gcmVxdWlyZSgnLi4vZHJpdmVyL3JlbW90ZS1jb25uZWN0aW9uJyk7Ci1jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7Ci1jb25zdCBCeXRlY29kZSA9IHJlcXVpcmUoJy4vYnl0ZWNvZGUnKTsKLWNvbnN0IHsgVHJhdmVyc2FsU3RyYXRlZ2llcywgVmVydGV4UHJvZ3JhbVN0cmF0ZWd5IH0gPSByZXF1aXJlKCcuL3RyYXZlcnNhbC1zdHJhdGVneScpOwotCi0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgcHJpbWFyeSBEU0wgb2YgdGhlIEdyZW1saW4gdHJhdmVyc2FsIG1hY2hpbmUuCi0gKi8KLWNsYXNzIEdyYXBoVHJhdmVyc2FsU291cmNlIHsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgR3JhcGhUcmF2ZXJzYWxTb3VyY2V9LgotICAgKiBAcGFyYW0ge0dyYXBofSBncmFwaAotICAgKiBAcGFyYW0ge1RyYXZlcnNhbFN0cmF0ZWdpZXN9IHRyYXZlcnNhbFN0cmF0ZWdpZXMKLSAgICogQHBhcmFtIHtCeXRlY29kZX0gW2J5dGVjb2RlXQotICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZ3JhcGhUcmF2ZXJzYWxTb3VyY2VDbGFzc10gT3B0aW9uYWwge0BsaW5rIEdyYXBoVHJhdmVyc2FsU291cmNlfSBjb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2dyYXBoVHJhdmVyc2FsQ2xhc3NdIE9wdGlvbmFsIHtAbGluayBHcmFwaFRyYXZlcnNhbH0gY29uc3RydWN0b3IuCi0gICAqLwotICBjb25zdHJ1Y3RvcihncmFwaCwgdHJhdmVyc2FsU3RyYXRlZ2llcywgYnl0ZWNvZGUsIGdyYXBoVHJhdmVyc2FsU291cmNlQ2xhc3MsIGdyYXBoVHJhdmVyc2FsQ2xhc3MpIHsKLSAgICB0aGlzLmdyYXBoID0gZ3JhcGg7Ci0gICAgdGhpcy50cmF2ZXJzYWxTdHJhdGVnaWVzID0gdHJhdmVyc2FsU3RyYXRlZ2llczsKLSAgICB0aGlzLmJ5dGVjb2RlID0gYnl0ZWNvZGUgfHwgbmV3IEJ5dGVjb2RlKCk7Ci0gICAgdGhpcy5ncmFwaFRyYXZlcnNhbFNvdXJjZUNsYXNzID0gZ3JhcGhUcmF2ZXJzYWxTb3VyY2VDbGFzcyB8fCBHcmFwaFRyYXZlcnNhbFNvdXJjZTsKLSAgICB0aGlzLmdyYXBoVHJhdmVyc2FsQ2xhc3MgPSBncmFwaFRyYXZlcnNhbENsYXNzIHx8IEdyYXBoVHJhdmVyc2FsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSByZW1vdGVDb25uZWN0aW9uCi0gICAqIEByZXR1cm5zIHtHcmFwaFRyYXZlcnNhbFNvdXJjZX0KLSAgICovCi0gIHdpdGhSZW1vdGUocmVtb3RlQ29ubmVjdGlvbikgewotICAgIGNvbnN0IHRyYXZlcnNhbFN0cmF0ZWd5ID0gbmV3IFRyYXZlcnNhbFN0cmF0ZWdpZXModGhpcy50cmF2ZXJzYWxTdHJhdGVnaWVzKTsKLSAgICB0cmF2ZXJzYWxTdHJhdGVneS5hZGRTdHJhdGVneShuZXcgcmVtb3RlLlJlbW90ZVN0cmF0ZWd5KHJlbW90ZUNvbm5lY3Rpb24pKTsKLSAgICByZXR1cm4gbmV3IHRoaXMuZ3JhcGhUcmF2ZXJzYWxTb3VyY2VDbGFzcyh0aGlzLmdyYXBoLCB0cmF2ZXJzYWxTdHJhdGVneSwgbmV3IEJ5dGVjb2RlKHRoaXMuYnl0ZWNvZGUpLCB0aGlzLmdyYXBoVHJhdmVyc2FsU291cmNlQ2xhc3MsIHRoaXMuZ3JhcGhUcmF2ZXJzYWxDbGFzcyk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGdyYXBoQ29tcHV0ZXIKLSAgICogQHBhcmFtIHdvcmtlcnMKLSAgICogQHBhcmFtIHJlc3VsdAotICAgKiBAcGFyYW0gcGVyc2lzdAotICAgKiBAcGFyYW0gdmVydGljZXMKLSAgICogQHBhcmFtIGVkZ2VzCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqIEByZXR1cm5zIHtHcmFwaFRyYXZlcnNhbFNvdXJjZX0KLSAgICovCi0gIHdpdGhDb21wdXRlcihncmFwaENvbXB1dGVyLCB3b3JrZXJzLCByZXN1bHQsIHBlcnNpc3QsIHZlcnRpY2VzLCBlZGdlcywgY29uZmlndXJhdGlvbikgewotICAgIHJldHVybiB0aGlzLndpdGhTdHJhdGVnaWVzKG5ldyBWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3koZ3JhcGhDb21wdXRlciwgd29ya2VycywgcmVzdWx0LCBwZXJzaXN0LCB2ZXJ0aWNlcywgZWRnZXMsIGNvbmZpZ3VyYXRpb24pKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEdyYXBoVHJhdmVyc2FsU291cmNlLgotICAgKiBAcmV0dXJucyB7c3RyaW5nfQotICAgKi8KLSAgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdncmFwaHRyYXZlcnNhbHNvdXJjZVsnICsgdGhpcy5ncmFwaC50b1N0cmluZygpICsgJ10nOwotICB9Ci0gIDwlIHNvdXJjZVN0ZXBNZXRob2RzLmVhY2h7IG1ldGhvZCAtPiAlPgotICAvKioKLSAgICogR3JhcGggVHJhdmVyc2FsIFNvdXJjZSA8JT0gbWV0aG9kICU+IG1ldGhvZC4KLSAgICogQHBhcmFtIHsuLi5PYmplY3R9IGFyZ3MKLSAgICogQHJldHVybnMge0dyYXBoVHJhdmVyc2FsU291cmNlfQotICAgKi8KLSAgPCU9IHRvSnMuY2FsbChtZXRob2QpICU+KC4uLmFyZ3MpIHsKLSAgICBjb25zdCBiID0gbmV3IEJ5dGVjb2RlKHRoaXMuYnl0ZWNvZGUpLmFkZFNvdXJjZSgnPCU9IG1ldGhvZCAlPicsIGFyZ3MpOwotICAgIHJldHVybiBuZXcgdGhpcy5ncmFwaFRyYXZlcnNhbFNvdXJjZUNsYXNzKHRoaXMuZ3JhcGgsIG5ldyBUcmF2ZXJzYWxTdHJhdGVnaWVzKHRoaXMudHJhdmVyc2FsU3RyYXRlZ2llcyksIGIsIHRoaXMuZ3JhcGhUcmF2ZXJzYWxTb3VyY2VDbGFzcywgdGhpcy5ncmFwaFRyYXZlcnNhbENsYXNzKTsKLSAgfQotICA8JQotICB9Ci0gIHNvdXJjZVNwYXduTWV0aG9kcy5lYWNoeyBtZXRob2QgLT4gJT4KLSAgLyoqCi0gICAqIDwlPSBtZXRob2QgJT4gR3JhcGhUcmF2ZXJzYWxTb3VyY2Ugc3RlcCBtZXRob2QuCi0gICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBhcmdzCi0gICAqIEByZXR1cm5zIHtHcmFwaFRyYXZlcnNhbH0KLSAgICovCi0gIDwlPSB0b0pzLmNhbGwobWV0aG9kKSAlPiguLi5hcmdzKSB7Ci0gICAgY29uc3QgYiA9IG5ldyBCeXRlY29kZSh0aGlzLmJ5dGVjb2RlKS5hZGRTdGVwKCc8JT0gbWV0aG9kICU+JywgYXJncyk7Ci0gICAgcmV0dXJuIG5ldyB0aGlzLmdyYXBoVHJhdmVyc2FsQ2xhc3ModGhpcy5ncmFwaCwgbmV3IFRyYXZlcnNhbFN0cmF0ZWdpZXModGhpcy50cmF2ZXJzYWxTdHJhdGVnaWVzKSwgYik7Ci0gIH0KLSAgPCUgfSAlPgotfQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBncmFwaCB0cmF2ZXJzYWwuCi0gKi8KLWNsYXNzIEdyYXBoVHJhdmVyc2FsIGV4dGVuZHMgVHJhdmVyc2FsIHsKLSAgY29uc3RydWN0b3IoZ3JhcGgsIHRyYXZlcnNhbFN0cmF0ZWdpZXMsIGJ5dGVjb2RlKSB7Ci0gICAgc3VwZXIoZ3JhcGgsIHRyYXZlcnNhbFN0cmF0ZWdpZXMsIGJ5dGVjb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb3B5IGEgdHJhdmVyc2FsIHNvIGFzIHRvIHJlc2V0IGFuZCByZS11c2UgaXQuCi0gICAqLwotICBjbG9uZSgpIHsKLSAgICByZXR1cm4gbmV3IEdyYXBoVHJhdmVyc2FsKHRoaXMuZ3JhcGgsIHRoaXMudHJhdmVyc2FsU3RyYXRlZ2llcywgdGhpcy5nZXRCeXRlY29kZSgpKTsKLSAgfQotCi0gIDwlIGdyYXBoU3RlcE1ldGhvZHMuZWFjaHsgbWV0aG9kIC0+ICU+Ci0gIC8qKgotICAgKiBHcmFwaCB0cmF2ZXJzYWwgPCU9IG1ldGhvZCAlPiBtZXRob2QuCi0gICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBhcmdzCi0gICAqIEByZXR1cm5zIHtHcmFwaFRyYXZlcnNhbH0KLSAgICovCi0gIDwlPSB0b0pzLmNhbGwobWV0aG9kKSAlPiguLi5hcmdzKSB7Ci0gICAgdGhpcy5ieXRlY29kZS5hZGRTdGVwKCc8JT0gbWV0aG9kICU+JywgYXJncyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgPCUgfSAlPgotfQotCi1mdW5jdGlvbiBjYWxsT25FbXB0eVRyYXZlcnNhbChmbk5hbWUsIGFyZ3MpIHsKLSAgY29uc3QgZyA9IG5ldyBHcmFwaFRyYXZlcnNhbChudWxsLCBudWxsLCBuZXcgQnl0ZWNvZGUoKSk7Ci0gIHJldHVybiBnW2ZuTmFtZV0uYXBwbHkoZywgYXJncyk7Ci19Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN0YXRpYyBtZXRob2QgZGVmaW5pdGlvbnMKLSAqIEB0eXBlIHtPYmplY3R9Ci0gKi8KLWNvbnN0IHN0YXRpY3MgPSB7PCUgYW5vblN0ZXBNZXRob2RzLmVhY2hXaXRoSW5kZXggeyBtZXRob2QsIGkgLT4gJT4KLSAgPCU9IHRvSnMuY2FsbChtZXRob2QpICU+OiAoLi4uYXJncykgPT4gY2FsbE9uRW1wdHlUcmF2ZXJzYWwoJzwlPSB0b0pzLmNhbGwobWV0aG9kKSAlPicsIGFyZ3MpPCU9IGkgPCBhbm9uU3RlcE1ldGhvZHMuc2l6ZSgpIC0gMSA/ICIsIiA6ICIiJT48JSB9ICU+Ci19OwotCi1tb2R1bGUuZXhwb3J0cyA9IHsKLSAgR3JhcGhUcmF2ZXJzYWwsCi0gIEdyYXBoVHJhdmVyc2FsU291cmNlLAotICBzdGF0aWNzCi19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tamF2YXNjcmlwdC9nbHYvUGFja2FnZUpzb24udGVtcGxhdGUgYi9ncmVtbGluLWphdmFzY3JpcHQvZ2x2L1BhY2thZ2VKc29uLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg5ZGMyLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tamF2YXNjcmlwdC9nbHYvUGFja2FnZUpzb24udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08JQotLyoKLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0lPnsKLSAgIm5hbWUiOiAiZ3JlbWxpbiIsCi0gICJ2ZXJzaW9uIjogIjwlPSB2ZXJzaW9uICU+IiwKLSAgImRlc2NyaXB0aW9uIjogIkphdmFTY3JpcHQgR3JlbWxpbiBMYW5ndWFnZSBWYXJpYW50IiwKLSAgImF1dGhvciI6ICJBcGFjaGUgVGlua2VyUG9wIHRlYW0iLAotICAia2V5d29yZHMiOiBbCi0gICAgImdyYXBoIiwKLSAgICAiZ3JlbWxpbiIsCi0gICAgInRpbmtlcnBvcCIsCi0gICAgImNvbm5lY3Rpb24iLAotICAgICJnbHYiLAotICAgICJkcml2ZXIiLAotICAgICJncmFwaGRiIgotICBdLAotICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKLSAgImRlcGVuZGVuY2llcyI6IHsKLSAgICAid3MiOiAiXjYuMi4xIgotICB9LAotICAiZGV2RGVwZW5kZW5jaWVzIjogewotICAgICJjaGFpIjogIn40LjEuMiIsCi0gICAgImN1Y3VtYmVyIjogIn40LjIuMSIsCi0gICAgImdydW50IjogIn4xLjAuNCIsCi0gICAgImdydW50LWNsaSI6ICJ+MS4zLjIiLAotICAgICJncnVudC1qc2RvYyI6ICJ+Mi4zLjEiLAotICAgICJtb2NoYSI6ICJ+NS4yLjAiCi0gIH0sCi0gICJyZXBvc2l0b3J5IjogewotICAgICJ0eXBlIjogImdpdCIsCi0gICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RpbmtlcnBvcC5naXQiCi0gIH0sCi0gICJob21lcGFnZSI6ICJodHRwczovL3RpbmtlcnBvcC5hcGFjaGUub3JnLyIsCi0gICJidWdzIjogewotICAgICJ1cmwiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USU5LRVJQT1AiCi0gIH0sCi0gICJzY3JpcHRzIjogewotICAgICJ0ZXN0IjogIi4vbm9kZV9tb2R1bGVzL21vY2hhL2Jpbi9tb2NoYSB0ZXN0L3VuaXQgdGVzdC9pbnRlZ3JhdGlvbiAtdCA1MDAwIiwKLSAgICAiZmVhdHVyZXMiOiAiLi9ub2RlX21vZHVsZXMvLmJpbi9jdWN1bWJlci1qcyAtLXJlcXVpcmUgdGVzdC9jdWN1bWJlciAuLi8uLi8uLi8uLi8uLi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvIiwKLSAgICAidW5pdC10ZXN0IjogIi4vbm9kZV9tb2R1bGVzL21vY2hhL2Jpbi9tb2NoYSB0ZXN0L3VuaXQiCi0gIH0sCi0gICJlbmdpbmVzIjogewotICAgICJub2RlIjogIj49NiIKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tamF2YXNjcmlwdC9nbHYvVHJhdmVyc2FsU291cmNlLnRlbXBsYXRlIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L2dsdi9UcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWUxMjMuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1qYXZhc2NyaXB0L2dsdi9UcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIEpvcmdlIEJheSBHb25kcmEKLSAqLwotJ3VzZSBzdHJpY3QnOwotCi1jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7Ci1jb25zdCBpdGVtRG9uZSA9IE9iamVjdC5mcmVlemUoeyB2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZSB9KTsKLWNvbnN0IGFzeW5jSXRlcmF0b3JTeW1ib2wgPSBTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBTeW1ib2woJ0BAYXN5bmNJdGVyYXRvcicpOwotCi1jbGFzcyBUcmF2ZXJzYWwgewotICBjb25zdHJ1Y3RvcihncmFwaCwgdHJhdmVyc2FsU3RyYXRlZ2llcywgYnl0ZWNvZGUpIHsKLSAgICB0aGlzLmdyYXBoID0gZ3JhcGg7Ci0gICAgdGhpcy50cmF2ZXJzYWxTdHJhdGVnaWVzID0gdHJhdmVyc2FsU3RyYXRlZ2llczsKLSAgICB0aGlzLmJ5dGVjb2RlID0gYnl0ZWNvZGU7Ci0gICAgLyoqIEB0eXBlIHtBcnJheTxUcmF2ZXJzZXI+fSAqLwotICAgIHRoaXMudHJhdmVyc2VycyA9IG51bGw7Ci0gICAgdGhpcy5zaWRlRWZmZWN0cyA9IG51bGw7Ci0gICAgdGhpcy5fdHJhdmVyc2FsU3RyYXRlZ2llc1Byb21pc2UgPSBudWxsOwotICAgIHRoaXMuX3RyYXZlcnNlcnNJdGVyYXRvckluZGV4ID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBBc3luYyBpdGVyYWJsZSBtZXRob2QgaW1wbGVtZW50YXRpb24uCi0gICAqLwotICBbYXN5bmNJdGVyYXRvclN5bWJvbF0oKSB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKiogQHJldHVybnMge0J5dGVjb2RlfSAqLwotICBnZXRCeXRlY29kZSgpIHsKLSAgICByZXR1cm4gdGhpcy5ieXRlY29kZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGhlIHRyYXZlcnNlciBvYmplY3RzLgotICAgKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXk+fQotICAgKi8KLSAgdG9MaXN0KCkgewotICAgIHJldHVybiB0aGlzLl9hcHBseVN0cmF0ZWdpZXMoKS50aGVuKCgpID0+IHsKLSAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwotICAgICAgbGV0IGl0OwotICAgICAgd2hpbGUgKChpdCA9IHRoaXMuX2dldE5leHQoKSkgJiYgIWl0LmRvbmUpIHsKLSAgICAgICAgcmVzdWx0LnB1c2goaXQudmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9KTsKLSAgfTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGVyZSBhcmUgYW55IG1vcmUgaXRlbXMgdG8gaXRlcmF0ZSBmcm9tIHRoZSB0cmF2ZXJzYWwuCi0gICAqIEByZXR1cm5zIHtQcm9taXNlLjxib29sZWFuPn0KLSAgICovCi0gICBoYXNOZXh0KCkgewotICAgICByZXR1cm4gdGhpcy5fYXBwbHlTdHJhdGVnaWVzKCkudGhlbigoKSA9PiB7Ci0gICAgICAgcmV0dXJuIHRoaXMudHJhdmVyc2VycyAmJiB0aGlzLnRyYXZlcnNlcnMubGVuZ3RoID4gMCAmJgotICAgICAgICAgICAgICB0aGlzLl90cmF2ZXJzZXJzSXRlcmF0b3JJbmRleCA8IHRoaXMudHJhdmVyc2Vycy5sZW5ndGggJiYKLSAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzZXJzW3RoaXMuX3RyYXZlcnNlcnNJdGVyYXRvckluZGV4XS5idWxrID4gMDsKLSAgICAgfSk7Ci0gICB9Ci0KLSAgLyoqCi0gICAqIEl0ZXJhdGVzIGFsbCBUcmF2ZXJzZXIgaW5zdGFuY2VzIGluIHRoZSB0cmF2ZXJzYWwuCi0gICAqIEByZXR1cm5zIHtQcm9taXNlfQotICAgKi8KLSAgaXRlcmF0ZSgpIHsKLSAgICB0aGlzLmJ5dGVjb2RlLmFkZFN0ZXAoJ25vbmUnKTsKLSAgICByZXR1cm4gdGhpcy5fYXBwbHlTdHJhdGVnaWVzKCkudGhlbigoKSA9PiB7Ci0gICAgICBsZXQgaXQ7Ci0gICAgICB3aGlsZSAoKGl0ID0gdGhpcy5fZ2V0TmV4dCgpKSAmJiAhaXQuZG9uZSkgewotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzeW5jIGl0ZXJhdG9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLSAgICogUmV0dXJucyBhIHByb21pc2UgY29udGFpbmluZyBhbiBpdGVyYXRvciBpdGVtLgotICAgKiBAcmV0dXJucyB7UHJvbWlzZS48e3ZhbHVlLCBkb25lfT59Ci0gICAqLwotICBuZXh0KCkgewotICAgIHJldHVybiB0aGlzLl9hcHBseVN0cmF0ZWdpZXMoKS50aGVuKCgpID0+IHRoaXMuX2dldE5leHQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogU3luY2hyb25vdXMgaXRlcmF0b3Igb2YgdHJhdmVyc2VycyBpbmNsdWRpbmcKLSAgICogQHByaXZhdGUKLSAgICovCi0gIF9nZXROZXh0KCkgewotICAgIHdoaWxlICh0aGlzLnRyYXZlcnNlcnMgJiYgdGhpcy5fdHJhdmVyc2Vyc0l0ZXJhdG9ySW5kZXggPCB0aGlzLnRyYXZlcnNlcnMubGVuZ3RoKSB7Ci0gICAgICBsZXQgdHJhdmVyc2VyID0gdGhpcy50cmF2ZXJzZXJzW3RoaXMuX3RyYXZlcnNlcnNJdGVyYXRvckluZGV4XTsKLSAgICAgIGlmICh0cmF2ZXJzZXIuYnVsayA+IDApIHsKLSAgICAgICAgdHJhdmVyc2VyLmJ1bGstLTsKLSAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRyYXZlcnNlci5vYmplY3QsIGRvbmU6IGZhbHNlIH07Ci0gICAgICB9Ci0gICAgICB0aGlzLl90cmF2ZXJzZXJzSXRlcmF0b3JJbmRleCsrOwotICAgIH0KLSAgICByZXR1cm4gaXRlbURvbmU7Ci0gIH0KLQotICBfYXBwbHlTdHJhdGVnaWVzKCkgewotICAgIGlmICh0aGlzLl90cmF2ZXJzYWxTdHJhdGVnaWVzUHJvbWlzZSkgewotICAgICAgLy8gQXBwbHkgc3RyYXRlZ2llcyBvbmx5IG9uY2UKLSAgICAgIHJldHVybiB0aGlzLl90cmF2ZXJzYWxTdHJhdGVnaWVzUHJvbWlzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXMuX3RyYXZlcnNhbFN0cmF0ZWdpZXNQcm9taXNlID0gdGhpcy50cmF2ZXJzYWxTdHJhdGVnaWVzLmFwcGx5U3RyYXRlZ2llcyh0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBCeXRlY29kZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmF2ZXJzYWwKLSAgICogQHJldHVybnMge1N0cmluZ30KLSAgICovCi0gIHRvU3RyaW5nKCkgewotICAgIHJldHVybiB0aGlzLmJ5dGVjb2RlLnRvU3RyaW5nKCk7Ci0gIH07Ci19Ci0KLTwlIHRva2Vucy5lYWNoIHsgayx2IC0+ICU+Ci1jbGFzcyA8JT0gayAlPiB7Ci08JSB2LmVhY2gge2EsYiAtPiAlPgotIHN0YXRpYyBnZXQgPCU9IGEgJT4oKSB7Ci0gICByZXR1cm4gIjwlPSBiICU+IgotIH0KLTwlIH0gJT59Ci08JSB9ICU+Ci0KLWNsYXNzIFAgewotICAvKioKLSAgICogUmVwcmVzZW50cyBhbiBvcGVyYXRpb24uCi0gICAqIEBjb25zdHJ1Y3RvcgotICAgKi8KLSAgY29uc3RydWN0b3Iob3BlcmF0b3IsIHZhbHVlLCBvdGhlcikgewotICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgdGhpcy5vdGhlciA9IG90aGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuCi0gICAqIEByZXR1cm5zIHtzdHJpbmd9Ci0gICAqLwotICB0b1N0cmluZygpIHsKLSAgICBpZiAodGhpcy5vdGhlciA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICByZXR1cm4gdGhpcy5vcGVyYXRvciArICcoJyArIHRoaXMudmFsdWUgKyAnKSc7Ci0gICAgfQotICAgIHJldHVybiB0aGlzLm9wZXJhdG9yICsgJygnICsgdGhpcy52YWx1ZSArICcsICcgKyB0aGlzLm90aGVyICsgJyknOwotICB9Ci0KLSAgYW5kKGFyZykgewotICAgIHJldHVybiBuZXcgUCgnYW5kJywgdGhpcywgYXJnKTsKLSAgfQotCi0gIG9yKGFyZykgewotICAgIHJldHVybiBuZXcgUCgnb3InLCB0aGlzLCBhcmcpOwotICB9Ci0KLSAgc3RhdGljIHdpdGhpbiguLi5hcmdzKSB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHsKLSAgICAgIHJldHVybiBuZXcgUCgid2l0aGluIiwgYXJnc1swXSwgbnVsbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBuZXcgUCgid2l0aGluIiwgYXJncywgbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHdpdGhvdXQoLi4uYXJncykgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7Ci0gICAgICByZXR1cm4gbmV3IFAoIndpdGhvdXQiLCBhcmdzWzBdLCBudWxsKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBQKCJ3aXRob3V0IiwgYXJncywgbnVsbCk7Ci0gICAgfQotICB9Ci0KLTwlIHBtZXRob2RzLmZpbmRBbGx7IShpdCBpbiBbIndpdGhpbiIsIndpdGhvdXQiXSl9LmVhY2h7IG1ldGhvZCAtPiAlPgotICAvKiogQHBhcmFtIHsuLi5PYmplY3R9IGFyZ3MgKi8KLSAgc3RhdGljIDwlPSB0b0pzLmNhbGwobWV0aG9kKSAlPiguLi5hcmdzKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZVAoJzwlPSBtZXRob2QgJT4nLCBhcmdzKTsKLSAgfQotPCUgfSAlPgotfQotCi1mdW5jdGlvbiBjcmVhdGVQKG9wZXJhdG9yLCBhcmdzKSB7Ci0gIGFyZ3MudW5zaGlmdChudWxsLCBvcGVyYXRvcik7Ci0gIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KFAsIGFyZ3MpKTsKLX0KLQotY2xhc3MgVGV4dFAgewotICAvKioKLSAgICogUmVwcmVzZW50cyBhbiBvcGVyYXRpb24uCi0gICAqIEBjb25zdHJ1Y3RvcgotICAgKi8KLSAgY29uc3RydWN0b3Iob3BlcmF0b3IsIHZhbHVlLCBvdGhlcikgewotICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgdGhpcy5vdGhlciA9IG90aGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuCi0gICAqIEByZXR1cm5zIHtzdHJpbmd9Ci0gICAqLwotICB0b1N0cmluZygpIHsKLSAgICBpZiAodGhpcy5vdGhlciA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICByZXR1cm4gdGhpcy5vcGVyYXRvciArICcoJyArIHRoaXMudmFsdWUgKyAnKSc7Ci0gICAgfQotICAgIHJldHVybiB0aGlzLm9wZXJhdG9yICsgJygnICsgdGhpcy52YWx1ZSArICcsICcgKyB0aGlzLm90aGVyICsgJyknOwotICB9Ci0KLSAgYW5kKGFyZykgewotICAgIHJldHVybiBuZXcgUCgnYW5kJywgdGhpcywgYXJnKTsKLSAgfQotCi0gIG9yKGFyZykgewotICAgIHJldHVybiBuZXcgUCgnb3InLCB0aGlzLCBhcmcpOwotICB9Ci08JSB0cG1ldGhvZHMuZWFjaHsgbWV0aG9kIC0+ICU+Ci0gIC8qKiBAcGFyYW0gey4uLk9iamVjdH0gYXJncyAqLwotICBzdGF0aWMgPCU9IHRvSnMuY2FsbChtZXRob2QpICU+KC4uLmFyZ3MpIHsKLSAgICByZXR1cm4gY3JlYXRlVGV4dFAoJzwlPSBtZXRob2QgJT4nLCBhcmdzKTsKLSAgfQotPCUgfSAlPgotfQotCi1mdW5jdGlvbiBjcmVhdGVUZXh0UChvcGVyYXRvciwgYXJncykgewotICBhcmdzLnVuc2hpZnQobnVsbCwgb3BlcmF0b3IpOwotICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShUZXh0UCwgYXJncykpOwotfQotCi1jbGFzcyBUcmF2ZXJzZXIgewotICBjb25zdHJ1Y3RvcihvYmplY3QsIGJ1bGspIHsKLSAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB0aGlzLmJ1bGsgPSBidWxrIHx8IDE7Ci0gIH0KLX0KLQotY2xhc3MgVHJhdmVyc2FsU2lkZUVmZmVjdHMgewotCi19Ci0KLWNvbnN0IHdpdGhPcHRpb25zID0gewotICA8JT0gd2l0aE9wdGlvbnMuY29sbGVjdCB7IGl0Lm5hbWUgKyAiOiAiICsgaXQudmFsdWUgfS5qb2luKCIsXG4gICIpJT4KLX07Ci0KLWZ1bmN0aW9uIHRvRW51bSh0eXBlTmFtZSwga2V5cykgewotICBjb25zdCByZXN1bHQgPSB7fTsKLSAga2V5cy5zcGxpdCgnICcpLmZvckVhY2goayA9PiB7Ci0gICAgbGV0IGpzS2V5ID0gazsKLSAgICBpZiAoanNLZXkgPT09IGpzS2V5LnRvVXBwZXJDYXNlKCkpIHsKLSAgICAgIGpzS2V5ID0ganNLZXkudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci0gICAgcmVzdWx0W2pzS2V5XSA9IG5ldyBFbnVtVmFsdWUodHlwZU5hbWUsIGspOwotICB9KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY2xhc3MgRW51bVZhbHVlIHsKLSAgY29uc3RydWN0b3IodHlwZU5hbWUsIGVsZW1lbnROYW1lKSB7Ci0gICAgdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgfQotCi0gIHRvU3RyaW5nKCkgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnROYW1lOwotICB9Ci19Ci0KLW1vZHVsZS5leHBvcnRzID0gewotICBFbnVtVmFsdWUsCi0gIFAsCi0gIFRleHRQLAotICB3aXRoT3B0aW9ucywKLSAgSU8sCi0gIFRyYXZlcnNhbCwKLSAgVHJhdmVyc2FsU2lkZUVmZmVjdHMsCi0gIFRyYXZlcnNlcjwlCi1lbnVtcy5lYWNoeyBlbnVtQ2xhc3MgLT4KLSAgICBvdXQucHJpbnQgIixcbiAgIiArIGRlY2FwaXRhbGl6ZS5jYWxsKGVudW1DbGFzcy5zaW1wbGVOYW1lKSArICI6IHRvRW51bSgnIiArIGVudW1DbGFzcy5zaW1wbGVOYW1lICsgIicsICciICsKLSAgICAgICAgZW51bUNsYXNzLmdldEVudW1Db25zdGFudHMoKS5zb3J0IHsgYSwgYiAtPiBhLm5hbWUoKSA8PT4gYi5uYW1lKCkgfS5jb2xsZWN0IHsgdG9Kcy5jYWxsKGl0Lm5hbWUoKSkgfS5qb2luKCcgJykgKyAiJykiCi19Ci0lPgotfTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tamF2YXNjcmlwdC9nbHYvZ2VuZXJhdGUuZ3Jvb3Z5IGIvZ3JlbWxpbi1qYXZhc2NyaXB0L2dsdi9nZW5lcmF0ZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2U4OTkuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1qYXZhc2NyaXB0L2dsdi9nZW5lcmF0ZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGdyb292eS50ZXh0LkdTdHJpbmdUZW1wbGF0ZUVuZ2luZQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkNvcmVJbXBvcnRzCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5Db25uZWN0ZWRDb21wb25lbnQKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlBhZ2VSYW5rCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5QZWVyUHJlc3N1cmUKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlNob3J0ZXN0UGF0aAotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU291cmNlCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWwKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbFNvdXJjZQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUAotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVGV4dFAKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLklPCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX18KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5XaXRoT3B0aW9ucwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyCi0KLWRlZiB0b0pzTWFwID0gWyJpbiI6ICJpbl8iLAotICAgICAgICAgICAgICAgImZyb20iOiAiZnJvbV8iLAotICAgICAgICAgICAgICAgIndpdGgiOiAid2l0aF8iXQotCi1kZWYgdG9KcyA9IHsgc3ltYm9sIC0+IHRvSnNNYXAuZ2V0T3JEZWZhdWx0KHN5bWJvbCwgc3ltYm9sKSB9Ci0KLWRlZiB0b0pTVmFsdWUgPSB7IHR5cGUsIHZhbHVlIC0+Ci0gIHR5cGUgPT0gU3RyaW5nLmNsYXNzICYmIHZhbHVlICE9IG51bGwgPyAoJyInICsgdmFsdWUgKyAnIicpIDogdmFsdWUKLX0KLQotZGVmIGRlY2FwaXRhbGl6ZSA9IHsKLSAgICBTdHJpbmcgc3RyaW5nID0gaXQ7Ci0gICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgfQotICAgIGRlZiBjID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0gICAgY1swXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjWzBdKTsKLSAgICByZXR1cm4gbmV3IFN0cmluZyhjKTsKLX0KLQotZGVmIGRldGVybWluZVZlcnNpb24gPSB7Ci0gICAgZGVmIGVudiA9IFN5c3RlbS5nZXRlbnYoKQotICAgIGRlZiBtYXZlblZlcnNpb24gPSBlbnYuY29udGFpbnNLZXkoIlRQX1JFTEVBU0VfVkVSU0lPTiIpID8gZW52LmdldCgiSlNfUkVMRUFTRV9WRVJTSU9OIikgOiBwcm9qZWN0LnZlcnNpb24KLSAgICByZXR1cm4gbWF2ZW5WZXJzaW9uLnJlcGxhY2UoIi1TTkFQU0hPVCIsICItYWxwaGExIikKLX0KLQotZGVmIGdhdGhlclRva2Vuc0Zyb20gPSB7IHRva2VuQ2xhc3NlcyAtPgotICAgIGRlZiBtID0gWzpdCi0gICAgdG9rZW5DbGFzc2VzLmVhY2ggeyB0YyAtPiBtIDw8IFsodGMuc2ltcGxlTmFtZSkgOiB0Yy5nZXRGaWVsZHMoKS5zb3J0eyBhLCBiIC0+IGEubmFtZSA8PT4gYi5uYW1lIH0uY29sbGVjdEVudHJpZXN7IGYgLT4gWyhmLm5hbWUpIDogZi5nZXQobnVsbCldfV19Ci0gICAgcmV0dXJuIG0KLX0KLQotZGVmIGJpbmRpbmcgPSBbImVudW1zIjogQ29yZUltcG9ydHMuZ2V0Q2xhc3NJbXBvcnRzKCkKLSAgICAgICAgLmZpbmRBbGwgeyBFbnVtLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaXQpIH0KLSAgICAgICAgLnNvcnQgeyBhLCBiIC0+IGEuZ2V0U2ltcGxlTmFtZSgpIDw9PiBiLmdldFNpbXBsZU5hbWUoKSB9LAotICAgICAgICAgICAgICAgInBtZXRob2RzIjogUC5jbGFzcy5nZXRNZXRob2RzKCkuCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyBNb2RpZmllci5pc1N0YXRpYyhpdC5nZXRNb2RpZmllcnMoKSkgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IFAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgaXQubmFtZSB9LgotICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYSA8PT4gYiB9LAotICAgICAgICAgICAgICAgInRwbWV0aG9kcyI6IFRleHRQLmNsYXNzLmdldE1ldGhvZHMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IE1vZGlmaWVyLmlzU3RhdGljKGl0LmdldE1vZGlmaWVycygpKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgVGV4dFAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgaXQubmFtZSB9LgotICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYSA8PT4gYiB9LAotICAgICAgICAgICAgICAgInNvdXJjZVN0ZXBNZXRob2RzIjogR3JhcGhUcmF2ZXJzYWxTb3VyY2UuZ2V0TWV0aG9kcygpLiAvLyBTT1VSQ0UgU1RFUFMKLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IEdyYXBoVHJhdmVyc2FsU291cmNlLmNsYXNzLmVxdWFscyhpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdC5uYW1lLmVxdWFscygiY2xvbmUiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgaGFyZGNvZGVkIG5hbWUgdG8gYmUgZm9yIGZvcndhcmQtY29tcGF0aWJpbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXQubmFtZS5lcXVhbHMoIndpdGhCaW5kaW5ncyIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdC5uYW1lLmVxdWFscyhUcmF2ZXJzYWxTb3VyY2UuU3ltYm9scy53aXRoUmVtb3RlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXQubmFtZS5lcXVhbHMoVHJhdmVyc2FsU291cmNlLlN5bWJvbHMud2l0aENvbXB1dGVyKQotICAgICAgICAgICAgICAgICAgICAgICB9LgotICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgaXQubmFtZSB9LgotICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYSA8PT4gYiB9LAotICAgICAgICAgICAgICAgInNvdXJjZVNwYXduTWV0aG9kcyI6IEdyYXBoVHJhdmVyc2FsU291cmNlLmdldE1ldGhvZHMoKS4gLy8gU1BBV04gU1RFUFMKLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IEdyYXBoVHJhdmVyc2FsLmNsYXNzLmVxdWFscyhpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgaXQubmFtZSB9LgotICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYSA8PT4gYiB9LAotICAgICAgICAgICAgICAgImdyYXBoU3RlcE1ldGhvZHMiOiBHcmFwaFRyYXZlcnNhbC5nZXRNZXRob2RzKCkuCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyBHcmFwaFRyYXZlcnNhbC5jbGFzcy5lcXVhbHMoaXQucmV0dXJuVHlwZSkgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7ICFpdC5uYW1lLmVxdWFscygiY2xvbmUiKSAmJiAhaXQubmFtZS5lcXVhbHMoIml0ZXJhdGUiKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgaXQubmFtZSB9LgotICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYSA8PT4gYiB9LAotICAgICAgICAgICAgICAgImFub25TdGVwTWV0aG9kcyI6IF9fLmNsYXNzLmdldE1ldGhvZHMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IEdyYXBoVHJhdmVyc2FsLmNsYXNzLmVxdWFscyhpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgTW9kaWZpZXIuaXNTdGF0aWMoaXQuZ2V0TW9kaWZpZXJzKCkpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyAhaXQubmFtZS5lcXVhbHMoIl9fIikgJiYgIWl0Lm5hbWUuZXF1YWxzKCJzdGFydCIpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgeyBpdC5uYW1lIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSgpLgotICAgICAgICAgICAgICAgICAgICAgICBzb3J0IHsgYSwgYiAtPiBhIDw9PiBiIH0sCi0gICAgICAgICAgICAgICAidG9rZW5zIjogZ2F0aGVyVG9rZW5zRnJvbShbSU8sIENvbm5lY3RlZENvbXBvbmVudCwgU2hvcnRlc3RQYXRoLCBQYWdlUmFuaywgUGVlclByZXNzdXJlXSksCi0gICAgICAgICAgICAgICAidG9KcyI6IHRvSnMsCi0gICAgICAgICAgICAgICAidmVyc2lvbiI6IGRldGVybWluZVZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICJkZWNhcGl0YWxpemUiOiBkZWNhcGl0YWxpemUsCi0gICAgICAgICAgICAgICAid2l0aE9wdGlvbnMiOiBXaXRoT3B0aW9ucy5nZXREZWNsYXJlZEZpZWxkcygpLgotICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCB7WyJuYW1lIjogaXQubmFtZSwgInZhbHVlIjogdG9KU1ZhbHVlKGl0LnR5cGUsIGl0LmdldChudWxsKSldfV0KLQotZGVmIGVuZ2luZSA9IG5ldyBHU3RyaW5nVGVtcGxhdGVFbmdpbmUoKQotZGVmIGdyYXBoVHJhdmVyc2FsVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoIiR7cHJvamVjdC5iYXNlZGlyfS9nbHYvR3JhcGhUcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUiKSkKLSAgICAgICAgLm1ha2UoYmluZGluZykKLWRlZiBncmFwaFRyYXZlcnNhbEZpbGUgPQotICAgICAgICBuZXcgRmlsZSgiJHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L2xpYi9wcm9jZXNzL2dyYXBoLXRyYXZlcnNhbC5qcyIpCi1ncmFwaFRyYXZlcnNhbEZpbGUubmV3V3JpdGVyKCkud2l0aFdyaXRlcnsgaXQgPDwgZ3JhcGhUcmF2ZXJzYWxUZW1wbGF0ZSB9Ci0KLWRlZiB0cmF2ZXJzYWxUZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgiJHtwcm9qZWN0LmJhc2VkaXJ9L2dsdi9UcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUiKSkubWFrZShiaW5kaW5nKQotZGVmIHRyYXZlcnNhbEZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L2xpYi9wcm9jZXNzL3RyYXZlcnNhbC5qcyIpCi10cmF2ZXJzYWxGaWxlLm5ld1dyaXRlcigpLndpdGhXcml0ZXJ7IGl0IDw8IHRyYXZlcnNhbFRlbXBsYXRlIH0KLQotZGVmIHBhY2thZ2VKc29uVGVtcGxhdGUgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoIiR7cHJvamVjdC5iYXNlZGlyfS9nbHYvUGFja2FnZUpzb24udGVtcGxhdGUiKSkubWFrZShiaW5kaW5nKQotZGVmIHBhY2thZ2VKc29uRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvcGFja2FnZS5qc29uIikKLXBhY2thZ2VKc29uRmlsZS5uZXdXcml0ZXIoKS53aXRoV3JpdGVyeyBpdCA8PCBwYWNrYWdlSnNvblRlbXBsYXRlIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tamF2YXNjcmlwdC9wb20ueG1sIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L3BvbS54bWwKaW5kZXggOThmZmJkMS4uMmU4YjM1NSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1qYXZhc2NyaXB0L3BvbS54bWwKKysrIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L3BvbS54bWwKQEAgLTIxLDcgKzIxLDcgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VycG9wPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1qYXZhc2NyaXB0PC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogR3JlbWxpbiBKYXZhc2NyaXB0PC9uYW1lPgpAQCAtMjksMTAgKzI5LDIxIEBACiAgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+ZmFsc2U8L21hdmVuLnRlc3Quc2tpcD4KICAgICAgICAgPHNraXBUZXN0cz4ke21hdmVuLnRlc3Quc2tpcH08L3NraXBUZXN0cz4KICAgICAgICAgPGdyZW1saW4uc2VydmVyLmRpcj4ke3Byb2plY3QucGFyZW50LmJhc2VkaXJ9L2dyZW1saW4tc2VydmVyPC9ncmVtbGluLnNlcnZlci5kaXI+CisgICAgICAgIDxucG0udmVyc2lvbj42LjE0LjY8L25wbS52ZXJzaW9uPgorICAgICAgICA8bm9kZS52ZXJzaW9uPnYxMC4yMi4wPC9ub2RlLnZlcnNpb24+CiAgICAgPC9wcm9wZXJ0aWVzPgogICAgIDxidWlsZD4KICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldDwvZGlyZWN0b3J5PgogICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmVpcnNsZXR0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5mcm9udGVuZC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTAuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgogICAgICAgICA8cGx1Z2lucz4KICAgICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICAgICAgPCEtLQpAQCAtNDksNiArNjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi10ZXN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bG9nNGoudmVyc2lvbn08L3ZlcnNpb24+CkBAIC02NCwyNCArODAsMTkgQEAKICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1qYXZhc2NyaXB0PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51cGRhdGUtdmVyc2lvbjwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+CiAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZXhlY3V0ZTwvZ29hbD4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJvamVjdEJhc2VEaXI8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtwcm9qZWN0LmJhc2VkaXJ9PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJvamVjdFZlcnNpb248L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtwcm9qZWN0LnZlcnNpb259PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+JHtwcm9qZWN0LmJhc2VkaXJ9L2dsdi9nZW5lcmF0ZS5ncm9vdnk8L3NjcmlwdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD4KK2RlZiBtYXZlblZlcnNpb24gPSAiJHtwcm9qZWN0LnZlcnNpb259IgorZGVmIHZlcnNpb25Gb3JKcyA9IG1hdmVuVmVyc2lvbi5yZXBsYWNlKCItU05BUFNIT1QiLCAiLWFscGhhMSIpCitkZWYgZmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvcGFja2FnZS5qc29uIikKK2ZpbGUud3JpdGUoZmlsZS5nZXRUZXh0KCJVVEYtOCIpLnJlcGxhY2VGaXJzdCgvInZlcnNpb24iOiAiKC4qKSIsLywgIlwidmVyc2lvblwiOiBcIiIgKyB2ZXJzaW9uRm9ySnMgKyAiXCIsIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2NyaXB0cz4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CkBAIC05OCwxMCArMTA5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke3NraXBUZXN0c308L3ZhbHVlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5weXRob248L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+ZmFsc2U8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5ncmVtbGluU2VydmVyRGlyPC9uYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7Z3JlbWxpbi5zZXJ2ZXIuZGlyfTwvdmFsdWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CkBAIC0xNjEsNyArMTY4LDYgQEAKICAgICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5laXJzbGV0dDwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5mcm9udGVuZC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS43LjY8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+aW5zdGFsbCBub2RlIGFuZCBucG08L2lkPgpAQCAtMjE3LDcgKzIyMyw4IEBACiAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgogICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8d29ya2luZ0RpcmVjdG9yeT5zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdDwvd29ya2luZ0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPG5vZGVWZXJzaW9uPnY2LjEyLjM8L25vZGVWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8bm9kZVZlcnNpb24+JHtub2RlLnZlcnNpb259PC9ub2RlVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPG5wbVZlcnNpb24+JHtucG0udmVyc2lvbn08L25wbVZlcnNpb24+CiAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgICAgICA8IS0tCkBAIC0yNzMsNyArMjgwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuZWlyc2xldHQ8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5mcm9udGVuZC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bnBtIHB1Ymxpc2g8L2lkPgpAQCAtMjk0LDcgKzMwMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtpbmdEaXJlY3Rvcnk+c3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQ8L3dvcmtpbmdEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vZGVWZXJzaW9uPnY2LjEyLjM8L25vZGVWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxub2RlVmVyc2lvbj4ke25vZGUudmVyc2lvbn08L25vZGVWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxucG1WZXJzaW9uPiR7bnBtLnZlcnNpb259PC9ucG1WZXJzaW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CmRpZmYgLS1naXQgYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvbGliL2RyaXZlci9jbGllbnQuanMgYi9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvbGliL2RyaXZlci9jbGllbnQuanMKaW5kZXggZWFhOWRiMS4uMjYyYTk2YiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L2xpYi9kcml2ZXIvY2xpZW50LmpzCisrKyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC9saWIvZHJpdmVyL2NsaWVudC5qcwpAQCAtNjksMTcgKzY5LDE4IEBACiAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBHcmVtbGluIFNlcnZlciwgY2FuIHNlbmQgYSBzY3JpcHQgb3IgYnl0ZWNvZGUgc3RlcHMuCiAgICAqIEBwYXJhbSB7Qnl0ZWNvZGV8c3RyaW5nfSBtZXNzYWdlIFRoZSBieXRlY29kZSBvciBzY3JpcHQgdG8gc2VuZAogICAgKiBAcGFyYW0ge09iamVjdH0gW2JpbmRpbmdzXSBUaGUgc2NyaXB0IGJpbmRpbmdzLCBpZiBhbnkuCisgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXh0cmFBcmdzXSBUaGUgZXh0cmEgYXJndW1lbnRzLCBpZiBhbnkuCiAgICAqIEByZXR1cm5zIHtQcm9taXNlfQogICAgKi8KLSAgc3VibWl0KG1lc3NhZ2UsIGJpbmRpbmdzKSB7CisgIHN1Ym1pdChtZXNzYWdlLCBiaW5kaW5ncywgZXh0cmFBcmdzKSB7CiAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykgewotICAgICAgY29uc3QgYXJncyA9IHsKKyAgICAgIGNvbnN0IGFyZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBleHRyYUFyZ3MsIHsKICAgICAgICAgJ2dyZW1saW4nOiBtZXNzYWdlLAogICAgICAgICAnYmluZGluZ3MnOiBiaW5kaW5ncywKICAgICAgICAgJ2xhbmd1YWdlJzogJ2dyZW1saW4tZ3Jvb3Z5JywKICAgICAgICAgJ2FjY2VwdCc6IHRoaXMuX2Nvbm5lY3Rpb24ubWltZVR5cGUsCiAgICAgICAgICdhbGlhc2VzJzogeyAnZyc6IHRoaXMuX29wdGlvbnMudHJhdmVyc2FsU291cmNlIHx8ICdnJyB9Ci0gICAgICB9OworICAgICAgfSk7CiAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXNzaW9uICYmIHRoaXMuX29wdGlvbnMucHJvY2Vzc29yID09PSAnc2Vzc2lvbicpIHsKICAgICAgICAgYXJnc1snc2Vzc2lvbiddID0gdGhpcy5fb3B0aW9ucy5zZXNzaW9uOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L2xpYi9wcm9jZXNzL2J5dGVjb2RlLmpzIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L2xpYi9wcm9jZXNzL2J5dGVjb2RlLmpzCmluZGV4IGU3ZmRkNDAuLjRjMGU5NGMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC9saWIvcHJvY2Vzcy9ieXRlY29kZS5qcworKysgYi9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvbGliL3Byb2Nlc3MvYnl0ZWNvZGUuanMKQEAgLTIyLDYgKzIyLDggQEAKICAqLwogJ3VzZSBzdHJpY3QnOwogCitjb25zdCB7IFRyYXZlcnNhbCB9ID0gcmVxdWlyZSgnLi90cmF2ZXJzYWwnKTsKKwogY2xhc3MgQnl0ZWNvZGUgewogICAvKioKICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBCeXRlY29kZQpAQCAtNzYsNyArNzgsMTEgQEAKICAgICBjb25zdCBpbnN0cnVjdGlvbiA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgIGluc3RydWN0aW9uWzBdID0gbmFtZTsKICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbnN0cnVjdGlvbltpXSA9IHZhbHVlc1tpIC0gMV07CisgICAgICBjb25zdCB2YWwgPSB2YWx1ZXNbaSAtIDFdOworICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFRyYXZlcnNhbCAmJiB2YWwuZ3JhcGggIT0gbnVsbCkKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgY2hpbGQgdHJhdmVyc2FsIG9mICR7dmFsfSB3YXMgbm90IHNwYXduZWQgYW5vbnltb3VzbHkgLSB1c2UgIiArCisgICAgICAgICAgICAidGhlIF9fIGNsYXNzIHJhdGhlciB0aGFuIGEgVHJhdmVyc2FsU291cmNlIHRvIGNvbnN0cnVjdCB0aGUgY2hpbGQgdHJhdmVyc2FsIik7CisgICAgICBpbnN0cnVjdGlvbltpXSA9IHZhbDsKICAgICB9CiAgICAgcmV0dXJuIGluc3RydWN0aW9uOwogICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvbGliL3Byb2Nlc3MvdHJhdmVyc2FsLmpzIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L2xpYi9wcm9jZXNzL3RyYXZlcnNhbC5qcwppbmRleCA5MDYyNDMzLi4yNTRiZjc0IDEwMDY0NAotLS0gYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvbGliL3Byb2Nlc3MvdHJhdmVyc2FsLmpzCisrKyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC9saWIvcHJvY2Vzcy90cmF2ZXJzYWwuanMKQEAgLTQ2OCw3ICs0NjgsNyBAQAogICBncmFwaFNPTlZlcnNpb246IHRvRW51bSgnR3JhcGhTT05WZXJzaW9uJywgJ1YxXzAgVjJfMCBWM18wJyksCiAgIGdyeW9WZXJzaW9uOiB0b0VudW0oJ0dyeW9WZXJzaW9uJywgJ1YxXzAgVjNfMCcpLAogICBvcGVyYXRvcjogdG9FbnVtKCdPcGVyYXRvcicsICdhZGRBbGwgYW5kIGFzc2lnbiBkaXYgbWF4IG1pbiBtaW51cyBtdWx0IG9yIHN1bSBzdW1Mb25nJyksCi0gIG9yZGVyOiB0b0VudW0oJ09yZGVyJywgJ2FzYyBkZWNyIGRlc2MgaW5jciBzaHVmZmxlJyksCisgIG9yZGVyOiB0b0VudW0oJ09yZGVyJywgJ2FzYyBkZXNjIHNodWZmbGUnKSwKICAgcGljazogdG9FbnVtKCdQaWNrJywgJ2FueSBub25lJyksCiAgIHBvcDogdG9FbnVtKCdQb3AnLCAnYWxsIGZpcnN0IGxhc3QgbWl4ZWQnKSwKICAgc2NvcGU6IHRvRW51bSgnU2NvcGUnLCAnZ2xvYmFsIGxvY2FsJyksCmRpZmYgLS1naXQgYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvcGFja2FnZS5qc29uIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L3BhY2thZ2UuanNvbgppbmRleCBiNjc3MDhhLi5jZjI0YTliIDEwMDY0NAotLS0gYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvcGFja2FnZS5qc29uCisrKyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC9wYWNrYWdlLmpzb24KQEAgLTEsNiArMSw2IEBACiB7CiAgICJuYW1lIjogImdyZW1saW4iLAotICAidmVyc2lvbiI6ICIzLjQuOS1hbHBoYTEiLAorICAidmVyc2lvbiI6ICIzLjUuMC1hbHBoYTEiLAogICAiZGVzY3JpcHRpb24iOiAiSmF2YVNjcmlwdCBHcmVtbGluIExhbmd1YWdlIFZhcmlhbnQiLAogICAiYXV0aG9yIjogIkFwYWNoZSBUaW5rZXJQb3AgdGVhbSIsCiAgICJrZXl3b3JkcyI6IFsKQEAgLTE5LDkgKzE5LDkgQEAKICAgImRldkRlcGVuZGVuY2llcyI6IHsKICAgICAiY2hhaSI6ICJ+NC4xLjIiLAogICAgICJjdWN1bWJlciI6ICJ+NC4yLjEiLAotICAgICJncnVudCI6ICJ+MS4wLjQiLAorICAgICJncnVudCI6ICJ+MS4yLjAiLAogICAgICJncnVudC1jbGkiOiAifjEuMy4yIiwKLSAgICAiZ3J1bnQtanNkb2MiOiAifjIuMy4xIiwKKyAgICAiZ3J1bnQtanNkb2MiOiAifjIuNC4xIiwKICAgICAibW9jaGEiOiAifjUuMi4wIgogICB9LAogICAicmVwb3NpdG9yeSI6IHsKQEAgLTM4LDYgKzM4LDYgQEAKICAgICAidW5pdC10ZXN0IjogIi4vbm9kZV9tb2R1bGVzL21vY2hhL2Jpbi9tb2NoYSB0ZXN0L3VuaXQiCiAgIH0sCiAgICJlbmdpbmVzIjogewotICAgICJub2RlIjogIj49NiIKKyAgICAibm9kZSI6ICI+PTEwIgogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L3Rlc3QvY3VjdW1iZXIvZmVhdHVyZS1zdGVwcy5qcyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L2N1Y3VtYmVyL2ZlYXR1cmUtc3RlcHMuanMKaW5kZXggNTE5M2VjNy4uNzY4YjM2NiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L3Rlc3QvY3VjdW1iZXIvZmVhdHVyZS1zdGVwcy5qcworKysgYi9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvdGVzdC9jdWN1bWJlci9mZWF0dXJlLXN0ZXBzLmpzCkBAIC01OCw2ICs1OCw3IEBACiBdLm1hcCh4ID0+IFsgbmV3IFJlZ0V4cCgnXicgKyB4WzBdICsgJyQnKSwgeFsxXSBdKTsKIAogY29uc3QgaWdub3JlUmVhc29uID0geworICBudWxsS2V5c0luTWFwTm90U3VwcG9ydGVkV2VsbDogIkphdmFzY3JpcHQgZG9lcyBub3QgbmljZWx5IHN1cHBvcnQgJ251bGwnIGFzIGEga2V5IGluIE1hcCBpbnN0YW5jZXMiLAogICBzZXROb3RTdXBwb3J0ZWQ6ICJUaGVyZSBpcyBubyBTZXQgc3VwcG9ydCBpbiBncmVtbGluLWphdmFzY3JpcHQiLAogICBuZWVkc0Z1cnRoZXJJbnZlc3RpZ2F0aW9uOiAnJywKIH07CkBAIC02Niw2ICs2Nyw3IEBACiAgIC8vIEFuIGFzc29jaWF0aXZlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNjZW5hcmlvIG5hbWUgYXMga2V5LCBmb3IgZXhhbXBsZToKICAgJ2dfd2l0aFNpZGVFZmZlY3RYYV9zZXRYX1ZfYm90aF9uYW1lX3N0b3JlWGFYX2NhcFhhWCc6IG5ldyBJZ25vcmVFcnJvcihpZ25vcmVSZWFzb24uc2V0Tm90U3VwcG9ydGVkKSwKICAgJ2dfd2l0aFNpZGVFZmZlY3RYYV9zZXRYX1ZfYm90aF9uYW1lX2FnZ3JlZ2F0ZVhsb2NhbF9hWF9jYXBYYVgnOiBuZXcgSWdub3JlRXJyb3IoaWdub3JlUmVhc29uLnNldE5vdFN1cHBvcnRlZCksCisgICdnX1ZfZ3JvdXBfYnlYYWdlWCc6IG5ldyBJZ25vcmVFcnJvcihpZ25vcmVSZWFzb24ubnVsbEtleXNJbk1hcE5vdFN1cHBvcnRlZFdlbGwpLAogICAnZ19WX3Nob3J0ZXN0UGF0aF9lZGdlc0luY2x1ZGVkJzogbmV3IElnbm9yZUVycm9yKGlnbm9yZVJlYXNvbi5uZWVkc0Z1cnRoZXJJbnZlc3RpZ2F0aW9uKSwKICAgJ2dfVl9zaG9ydGVzdFBhdGhfZWRnZXNJbmNsdWRlZF9lZGdlc1hvdXRFWCc6IG5ldyBJZ25vcmVFcnJvcihpZ25vcmVSZWFzb24ubmVlZHNGdXJ0aGVySW52ZXN0aWdhdGlvbikKIH07CkBAIC0yMjMsNiArMjI1LDEwIEBACiB9CiAKIGZ1bmN0aW9uIHBhcnNlVmFsdWUoc3RyaW5nVmFsdWUpIHsKKworICBpZihzdHJpbmdWYWx1ZSA9PT0gIm51bGwiKQorICAgIHJldHVybiBudWxsOworCiAgIGxldCBleHRyYWN0ZWRWYWx1ZSA9IG51bGw7CiAgIGxldCBwYXJzZXIgPSBudWxsOwogICBmb3IgKGxldCBpdGVtIG9mIHBhcnNlcnMpIHsKQEAgLTIzNCw2ICsyNDAsNyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICB9CisKICAgcmV0dXJuIHBhcnNlciAhPT0gbnVsbCA/IHBhcnNlci5jYWxsKHRoaXMsIGV4dHJhY3RlZFZhbHVlKSA6IHN0cmluZ1ZhbHVlOwogfQogCkBAIC0yNzksNyArMjg2LDcgQEAKIH0KIAogZnVuY3Rpb24gdG9EaXJlY3Rpb24odmFsdWUpIHsKLSAgICByZXR1cm4gZGlyZWN0aW9uW3ZhbHVlLnRvTG93ZXJDYXNlKCldOworICByZXR1cm4gZGlyZWN0aW9uW3ZhbHVlLnRvTG93ZXJDYXNlKCldOwogfQogCiBmdW5jdGlvbiB0b0FycmF5KHN0cmluZ0xpc3QpIHsKQEAgLTI5NCw2ICszMDEsOSBAQAogfQogCiBmdW5jdGlvbiBwYXJzZU1hcFZhbHVlKHZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PT0gbnVsbCkKKyAgICByZXR1cm4gbnVsbDsKKwogICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgewogICAgIHJldHVybiBwYXJzZVZhbHVlLmNhbGwodGhpcywgdmFsdWUpOwogICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvdGVzdC91bml0L2NsaWVudC10ZXN0LmpzIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L3Rlc3QvdW5pdC9jbGllbnQtdGVzdC5qcwppbmRleCA5NTZhMDFhLi5hODY0MDlmIDEwMDY0NAotLS0gYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvdGVzdC91bml0L2NsaWVudC10ZXN0LmpzCisrKyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L3VuaXQvY2xpZW50LXRlc3QuanMKQEAgLTU1LDQgKzU1LDIwIEBACiAgICAgY3VzdG9tQ2xpZW50Ll9jb25uZWN0aW9uID0gY29ubmVjdGlvbk1vY2s7CiAgICAgY3VzdG9tQ2xpZW50LnN1Ym1pdChxdWVyeSkKICAgfSk7CisKKyAgaXQoJ3Nob3VsZCBhbGxvdyB0byBzdWJtaXQgZXh0cmEgYXJndW1lbnRzJywgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IGNvbm5lY3Rpb25Nb2NrID0geworICAgICAgc3VibWl0OiBmdW5jdGlvbiAoYnl0ZWNvZGUsIG9wLCBhcmdzLCByZXF1ZXN0SWQsIHByb2Nlc3NvcikgeworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYXJncy5ncmVtbGluLCBxdWVyeSk7CisgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhcmdzLnNjcmlwdEV2YWx1YXRpb25UaW1lb3V0LCAxMjMpOworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocHJvY2Vzc29yLCBjdXN0b21PcFByb2Nlc3Nvcik7CisKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOworICAgICAgfQorICAgIH07CisKKyAgICBjb25zdCBjdXN0b21DbGllbnQgPSBuZXcgQ2xpZW50KCd3czovL2xvY2FsaG9zdDo5MzIxJywge3RyYXZlcnNhbFNvdXJjZTogJ2cnLCBwcm9jZXNzb3I6IGN1c3RvbU9wUHJvY2Vzc29yfSk7CisgICAgY3VzdG9tQ2xpZW50Ll9jb25uZWN0aW9uID0gY29ubmVjdGlvbk1vY2s7CisgICAgY3VzdG9tQ2xpZW50LnN1Ym1pdChxdWVyeSwgbnVsbCwgeyJzY3JpcHRFdmFsdWF0aW9uVGltZW91dCI6IDEyM30pCisgIH0pOwogfSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvdGVzdC91bml0L2dyYXBoc29uLXRlc3QuanMgYi9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvdGVzdC91bml0L2dyYXBoc29uLXRlc3QuanMKaW5kZXggZjM1NWZiNS4uMjk0MmQwMSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L3Rlc3QvdW5pdC9ncmFwaHNvbi10ZXN0LmpzCisrKyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L3VuaXQvZ3JhcGhzb24tdGVzdC5qcwpAQCAtMzIsNiArMzIsMTEgQEAKIGNvbnN0IFAgPSB0LlA7CiAKIGRlc2NyaWJlKCdHcmFwaFNPTlJlYWRlcicsIGZ1bmN0aW9uICgpIHsKKyAgaXQoJ3Nob3VsZCBwYXJzZSBHcmFwaFNPTiBudWxsJywgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IHJlYWRlciA9IG5ldyBHcmFwaFNPTlJlYWRlcigpOworICAgIGNvbnN0IHJlc3VsdCA9IHJlYWRlci5yZWFkKG51bGwpOworICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIG51bGwpOworICB9KTsKICAgaXQoJ3Nob3VsZCBwYXJzZSBHcmFwaFNPTiBpbnQzMiwgZmxvYXQgYW5kIGRvdWJsZSB0byBOdW1iZXIgZnJvbSBHcmFwaFNPTicsIGZ1bmN0aW9uICgpIHsKICAgICBjb25zdCByZWFkZXIgPSBuZXcgR3JhcGhTT05SZWFkZXIoKTsKICAgICBbCmRpZmYgLS1naXQgYS9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvdGVzdC91bml0L3RyYW5zbGF0b3ItdGVzdC5qcyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L3VuaXQvdHJhbnNsYXRvci10ZXN0LmpzCmluZGV4IDkxYzkwM2UuLjlmNDJjZDEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L3VuaXQvdHJhbnNsYXRvci10ZXN0LmpzCisrKyBiL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L3VuaXQvdHJhbnNsYXRvci10ZXN0LmpzCkBAIC01NSw5ICs1NSw5IEBACiAKICAgICBpdCgnc2hvdWxkIHByb2R1Y2UgdmFsaWQgc2NyaXB0IHJlcHJlc2VudGF0aW9uIGZyb20gYnl0ZWNvZGUgZ2x2IHN0ZXBzIGNvbnRhaW5pbmcgZW51bScsIGZ1bmN0aW9uICgpIHsKICAgICAgIGNvbnN0IGcgPSBuZXcgZ3JhcGguR3JhcGgoKS50cmF2ZXJzYWwoKTsKLSAgICAgIGNvbnN0IHNjcmlwdCA9IG5ldyBUcmFuc2xhdG9yKCdnJykudHJhbnNsYXRlKGcuVigpLm9yZGVyKCkuYnkoJ2FnZScsIHQub3JkZXIuZGVjcikuZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICBjb25zdCBzY3JpcHQgPSBuZXcgVHJhbnNsYXRvcignZycpLnRyYW5zbGF0ZShnLlYoKS5vcmRlcigpLmJ5KCdhZ2UnLCB0Lm9yZGVyLnNodWZmbGUpLmdldEJ5dGVjb2RlKCkpOwogICAgICAgYXNzZXJ0Lm9rKHNjcmlwdCk7Ci0gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0LCAnZy5WKCkub3JkZXIoKS5ieShcJ2FnZVwnLCBkZWNyKScpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdCwgJ2cuVigpLm9yZGVyKCkuYnkoXCdhZ2VcJywgc2h1ZmZsZSknKTsKICAgICB9KTsKIAogICAgIGl0KCdzaG91bGQgcHJvZHVjZSB2YWxpZCBzY3JpcHQgcmVwcmVzZW50YXRpb24gZnJvbSBieXRlY29kZSBnbHYgc3RlcHMgY29udGFpbmluZyBhIHByZWRpY2F0ZScsIGZ1bmN0aW9uICgpIHsKZGlmZiAtLWdpdCBhL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L3VuaXQvdHJhdmVyc2FsLXRlc3QuanMgYi9ncmVtbGluLWphdmFzY3JpcHQvc3JjL21haW4vamF2YXNjcmlwdC9ncmVtbGluLWphdmFzY3JpcHQvdGVzdC91bml0L3RyYXZlcnNhbC10ZXN0LmpzCmluZGV4IGFjZGNkZDQuLjIyZWJmMTcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tamF2YXNjcmlwdC9zcmMvbWFpbi9qYXZhc2NyaXB0L2dyZW1saW4tamF2YXNjcmlwdC90ZXN0L3VuaXQvdHJhdmVyc2FsLXRlc3QuanMKKysrIGIvZ3JlbWxpbi1qYXZhc2NyaXB0L3NyYy9tYWluL2phdmFzY3JpcHQvZ3JlbWxpbi1qYXZhc2NyaXB0L3Rlc3QvdW5pdC90cmF2ZXJzYWwtdGVzdC5qcwpAQCAtMjUsNyArMjUsMTAgQEAKIGNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOwogY29uc3QgZXhwZWN0ID0gcmVxdWlyZSgnY2hhaScpLmV4cGVjdDsKIGNvbnN0IGdyYXBoID0gcmVxdWlyZSgnLi4vLi4vbGliL3N0cnVjdHVyZS9ncmFwaCcpOworY29uc3QgYW5vbiA9IHJlcXVpcmUoJy4uLy4uL2xpYi9wcm9jZXNzL2Fub255bW91cy10cmF2ZXJzYWwnKTsKIGNvbnN0IHQgPSByZXF1aXJlKCcuLi8uLi9saWIvcHJvY2Vzcy90cmF2ZXJzYWwnKTsKK2NvbnN0IGd0ID0gcmVxdWlyZSgnLi4vLi4vbGliL3Byb2Nlc3MvZ3JhcGgtdHJhdmVyc2FsJyk7Citjb25zdCBWID0gZ3Quc3RhdGljcy5WOwogY29uc3QgQnl0ZWNvZGUgPSByZXF1aXJlKCcuLi8uLi9saWIvcHJvY2Vzcy9ieXRlY29kZScpOwogY29uc3QgVHJhdmVyc2FsU3RyYXRlZ2llcyA9IHJlcXVpcmUoJy4uLy4uL2xpYi9wcm9jZXNzL3RyYXZlcnNhbC1zdHJhdGVneScpLlRyYXZlcnNhbFN0cmF0ZWdpZXM7CiAKQEAgLTMzLDcgKzM2LDcgQEAKIAogICBkZXNjcmliZSgnI2dldEJ5dGVDb2RlKCknLCBmdW5jdGlvbiAoKSB7CiAgICAgaXQoJ3Nob3VsZCBhZGQgc3RlcHMgZm9yIHdpdGggYSBzdHJpbmcgcGFyYW1ldGVyJywgZnVuY3Rpb24gKCkgewotICAgICAgY29uc3QgZyA9IG5ldyBncmFwaC5HcmFwaCgpLnRyYXZlcnNhbCgpOworICAgICAgY29uc3QgZyA9IGFub24udHJhdmVyc2FsKCkud2l0aEdyYXBoKG5ldyBncmFwaC5HcmFwaCgpKTsKICAgICAgIGNvbnN0IGJ5dGVjb2RlID0gZy5WKCkub3V0KCdjcmVhdGVkJykuZ2V0Qnl0ZWNvZGUoKTsKICAgICAgIGFzc2VydC5vayhieXRlY29kZSk7CiAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZWNvZGUuc291cmNlSW5zdHJ1Y3Rpb25zLmxlbmd0aCwgMCk7CkBAIC00NCw3ICs0Nyw3IEBACiAgICAgfSk7CiAKICAgICBpdCgnc2hvdWxkIGFkZCBzdGVwcyB3aXRoIGFuIGVudW0gdmFsdWUnLCBmdW5jdGlvbiAoKSB7Ci0gICAgICBjb25zdCBnID0gbmV3IGdyYXBoLkdyYXBoKCkudHJhdmVyc2FsKCk7CisgICAgICBjb25zdCBnID0gYW5vbi50cmF2ZXJzYWwoKS53aXRoR3JhcGgobmV3IGdyYXBoLkdyYXBoKCkpOwogICAgICAgY29uc3QgYnl0ZWNvZGUgPSBnLlYoKS5vcmRlcigpLmJ5KCdhZ2UnLCB0Lm9yZGVyLmRlc2MpLmdldEJ5dGVjb2RlKCk7CiAgICAgICBhc3NlcnQub2soYnl0ZWNvZGUpOwogICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ5dGVjb2RlLnNvdXJjZUluc3RydWN0aW9ucy5sZW5ndGgsIDApOwpAQCAtMjM3LDQgKzI0MCwxNyBAQAogICAgICAgfSk7CiAgICAgfSk7CiAgIH0pOworCisgIGRlc2NyaWJlKCJidWlsZCIsIGZ1bmN0aW9uKCkgeworICAgIGl0KCdzaG91bGQgb25seSBhbGxvdyBhbm9ueW1vdXMgY2hpbGQgdHJhdmVyc2FscycsIGZ1bmN0aW9uKCkgeworICAgICAgY29uc3QgZyA9IGFub24udHJhdmVyc2FsKCkud2l0aEdyYXBoKG5ldyBncmFwaC5HcmFwaCgpKTsKKyAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coZnVuY3Rpb24oKSB7CisgICAgICAgIGcuVigwKS5hZGRFKCJzZWxmIikudG8oVigxKSkKKyAgICAgIH0pOworCisgICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uKCkgeworICAgICAgICBnLlYoMCkuYWRkRSgic2VsZiIpLnRvKGcuVigxKSkKKyAgICAgIH0pOworICAgIH0pCisgIH0pOwogfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vZ2x2L0dyYXBoVHJhdmVyc2FsU291cmNlLnRlbXBsYXRlIGIvZ3JlbWxpbi1weXRob24vZ2x2L0dyYXBoVHJhdmVyc2FsU291cmNlLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Q5ZTE1Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL2dsdi9HcmFwaFRyYXZlcnNhbFNvdXJjZS50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1pbXBvcnQgc3lzCi1pbXBvcnQgY29weQotZnJvbSAudHJhdmVyc2FsIGltcG9ydCBUcmF2ZXJzYWwKLWZyb20gLnRyYXZlcnNhbCBpbXBvcnQgVHJhdmVyc2FsU3RyYXRlZ2llcwotZnJvbSAuc3RyYXRlZ2llcyBpbXBvcnQgVmVydGV4UHJvZ3JhbVN0cmF0ZWd5Ci1mcm9tIC50cmF2ZXJzYWwgaW1wb3J0IEJ5dGVjb2RlCi1mcm9tIC4uZHJpdmVyLnJlbW90ZV9jb25uZWN0aW9uIGltcG9ydCBSZW1vdGVTdHJhdGVneQotZnJvbSAuLiBpbXBvcnQgc3RhdGljcwotZnJvbSAuLnN0YXRpY3MgaW1wb3J0IGxvbmcKLQotCi1jbGFzcyBHcmFwaFRyYXZlcnNhbFNvdXJjZShvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmFwaCwgdHJhdmVyc2FsX3N0cmF0ZWdpZXMsIGJ5dGVjb2RlPU5vbmUpOgotICAgICAgICBzZWxmLmdyYXBoID0gZ3JhcGgKLSAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcyA9IHRyYXZlcnNhbF9zdHJhdGVnaWVzCi0gICAgICAgIGlmIGJ5dGVjb2RlIGlzIE5vbmU6Ci0gICAgICAgICAgYnl0ZWNvZGUgPSBCeXRlY29kZSgpCi0gICAgICAgIHNlbGYuYnl0ZWNvZGUgPSBieXRlY29kZQotICAgICAgICBzZWxmLmdyYXBoX3RyYXZlcnNhbCA9IEdyYXBoVHJhdmVyc2FsCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiZ3JhcGh0cmF2ZXJzYWxzb3VyY2VbIiArIHN0cihzZWxmLmdyYXBoKSArICJdIgotCi0gICAgZGVmIGdldF9ncmFwaF90cmF2ZXJzYWxfc291cmNlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5ncmFwaCwgVHJhdmVyc2FsU3RyYXRlZ2llcyhzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzKSwgQnl0ZWNvZGUoc2VsZi5ieXRlY29kZSkpCi0KLSAgICBkZWYgZ2V0X2dyYXBoX3RyYXZlcnNhbChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZ3JhcGhfdHJhdmVyc2FsKHNlbGYuZ3JhcGgsIHNlbGYudHJhdmVyc2FsX3N0cmF0ZWdpZXMsIEJ5dGVjb2RlKHNlbGYuYnl0ZWNvZGUpKQotPCUgc291cmNlU3RlcE1ldGhvZHMuZWFjaHsgbWV0aG9kIC0+ICU+Ci0gICAgZGVmIDwlPSBtZXRob2QgJT4oc2VsZiwgKmFyZ3MpOgotICAgICAgICBzb3VyY2UgPSBzZWxmLmdldF9ncmFwaF90cmF2ZXJzYWxfc291cmNlKCkKLSAgICAgICAgc291cmNlLmJ5dGVjb2RlLmFkZF9zb3VyY2UoIjwlPSB0b0phdmEuY2FsbChtZXRob2QpICU+IiwgKmFyZ3MpCi0gICAgICAgIHJldHVybiBzb3VyY2UKLTwlIH0gJT4KLSAgICBkZWYgd2l0aFJlbW90ZShzZWxmLCByZW1vdGVfY29ubmVjdGlvbik6Ci0gICAgICAgIHNvdXJjZSA9IHNlbGYuZ2V0X2dyYXBoX3RyYXZlcnNhbF9zb3VyY2UoKQotICAgICAgICBzb3VyY2UudHJhdmVyc2FsX3N0cmF0ZWdpZXMuYWRkX3N0cmF0ZWdpZXMoW1JlbW90ZVN0cmF0ZWd5KHJlbW90ZV9jb25uZWN0aW9uKV0pCi0gICAgICAgIHJldHVybiBzb3VyY2UKLQotICAgIGRlZiB3aXRoQ29tcHV0ZXIoc2VsZiwgZ3JhcGhfY29tcHV0ZXI9Tm9uZSwgd29ya2Vycz1Ob25lLCByZXN1bHQ9Tm9uZSwgcGVyc2lzdD1Ob25lLCB2ZXJ0aWNlcz1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgZWRnZXM9Tm9uZSwgY29uZmlndXJhdGlvbj1Ob25lKToKLSAgICAgICAgcmV0dXJuIHNlbGYud2l0aFN0cmF0ZWdpZXMoVmVydGV4UHJvZ3JhbVN0cmF0ZWd5KGdyYXBoX2NvbXB1dGVyLCB3b3JrZXJzLCByZXN1bHQsIHBlcnNpc3QsIHZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlcywgY29uZmlndXJhdGlvbikpCi08JSBzb3VyY2VTcGF3bk1ldGhvZHMuZWFjaCB7IG1ldGhvZCAtPiAlPgotICAgIGRlZiA8JT0gbWV0aG9kICU+KHNlbGYsICphcmdzKToKLSAgICAgICAgdHJhdmVyc2FsID0gc2VsZi5nZXRfZ3JhcGhfdHJhdmVyc2FsKCkKLSAgICAgICAgdHJhdmVyc2FsLmJ5dGVjb2RlLmFkZF9zdGVwKCI8JT0gdG9KYXZhLmNhbGwobWV0aG9kKSAlPiIsICphcmdzKQotICAgICAgICByZXR1cm4gdHJhdmVyc2FsCi08JSB9ICU+Ci0KLWNsYXNzIEdyYXBoVHJhdmVyc2FsKFRyYXZlcnNhbCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGdyYXBoLCB0cmF2ZXJzYWxfc3RyYXRlZ2llcywgYnl0ZWNvZGUpOgotICAgICAgICBzdXBlcihHcmFwaFRyYXZlcnNhbCwgc2VsZikuX19pbml0X18oZ3JhcGgsIHRyYXZlcnNhbF9zdHJhdGVnaWVzLCBieXRlY29kZSkKLQotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsIGludCk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5yYW5nZShsb25nKGluZGV4KSwgbG9uZyhpbmRleCArIDEpKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5kZXgsIHNsaWNlKToKLSAgICAgICAgICAgIGxvdyA9IGxvbmcoMCkgaWYgaW5kZXguc3RhcnQgaXMgTm9uZSBlbHNlIGxvbmcoaW5kZXguc3RhcnQpCi0gICAgICAgICAgICBoaWdoID0gbG9uZyhzeXMubWF4c2l6ZSkgaWYgaW5kZXguc3RvcCBpcyBOb25lIGVsc2UgbG9uZyhpbmRleC5zdG9wKQotICAgICAgICAgICAgaWYgbG93ID09IGxvbmcoMCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubGltaXQoaGlnaCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmFuZ2UobG93LGhpZ2gpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkluZGV4IG11c3QgYmUgaW50IG9yIHNsaWNlIikKLQotICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBrZXkpOgotICAgICAgICByZXR1cm4gc2VsZi52YWx1ZXMoa2V5KQotCi0gICAgZGVmIGNsb25lKHNlbGYpOgotICAgICAgICByZXR1cm4gR3JhcGhUcmF2ZXJzYWwoc2VsZi5ncmFwaCwgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcywgY29weS5kZWVwY29weShzZWxmLmJ5dGVjb2RlKSkKLTwlIGdyYXBoU3RlcE1ldGhvZHMuZWFjaCB7IG1ldGhvZCAtPiAlPgotICAgIGRlZiA8JT0gbWV0aG9kICU+KHNlbGYsICphcmdzKToKLSAgICAgICAgc2VsZi5ieXRlY29kZS5hZGRfc3RlcCgiPCU9IHRvSmF2YS5jYWxsKG1ldGhvZCkgJT4iLCAqYXJncykKLSAgICAgICAgcmV0dXJuIHNlbGYKLTwlIH0gJT4KLSAgICAjIERlcHJlY2F0ZWQgLSBwcmVmZXIgdGhlIHVuZGVyc2NvcmUgc3VmZml4ZWQgdmVyc2lvbnMgZS5nIGZpbHRlcl8oKQotCi0gICAgZGVmIGZpbHRlcihzZWxmLCAqYXJncyk6Ci0gICAgICAgIHNlbGYuYnl0ZWNvZGUuYWRkX3N0ZXAoImZpbHRlciIsICphcmdzKQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIGlkKHNlbGYsICphcmdzKToKLSAgICAgICAgc2VsZi5ieXRlY29kZS5hZGRfc3RlcCgiaWQiLCAqYXJncykKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBtYXgoc2VsZiwgKmFyZ3MpOgotICAgICAgICBzZWxmLmJ5dGVjb2RlLmFkZF9zdGVwKCJtYXgiLCAqYXJncykKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBtaW4oc2VsZiwgKmFyZ3MpOgotICAgICAgICBzZWxmLmJ5dGVjb2RlLmFkZF9zdGVwKCJtaW4iLCAqYXJncykKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiByYW5nZShzZWxmLCAqYXJncyk6Ci0gICAgICAgIHNlbGYuYnl0ZWNvZGUuYWRkX3N0ZXAoInJhbmdlIiwgKmFyZ3MpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgc3VtKHNlbGYsICphcmdzKToKLSAgICAgICAgc2VsZi5ieXRlY29kZS5hZGRfc3RlcCgic3VtIiwgKmFyZ3MpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLQotY2xhc3MgX18ob2JqZWN0KToKLSAgICBncmFwaF90cmF2ZXJzYWwgPSBHcmFwaFRyYXZlcnNhbAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHN0YXJ0KGNscyk6Ci0gICAgICAgIHJldHVybiBHcmFwaFRyYXZlcnNhbChOb25lLCBOb25lLCBCeXRlY29kZSgpKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9fKGNscywgKmFyZ3MpOgotICAgICAgICByZXR1cm4gX18uaW5qZWN0KCphcmdzKQotPCUgYW5vblN0ZXBNZXRob2RzLmVhY2h7IG1ldGhvZCAtPiAlPgotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiA8JT0gbWV0aG9kICU+KGNscywgKmFyZ3MpOgotICAgICAgICByZXR1cm4gY2xzLmdyYXBoX3RyYXZlcnNhbChOb25lLCBOb25lLCBCeXRlY29kZSgpKS48JT0gbWV0aG9kICU+KCphcmdzKQotPCUgfSAlPgotICAgICMgRGVwcmVjYXRlZCAtIHByZWZlciB0aGUgdW5kZXJzY29yZSBzdWZmaXhlZCB2ZXJzaW9ucyBlLmcgZmlsdGVyXygpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZmlsdGVyKGNscywgKmFyZ3MpOgotICAgICAgICByZXR1cm4gY2xzLmdyYXBoX3RyYXZlcnNhbChOb25lLCBOb25lLCBCeXRlY29kZSgpKS5maWx0ZXJfKCphcmdzKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGlkKGNscywgKmFyZ3MpOgotICAgICAgICByZXR1cm4gY2xzLmdyYXBoX3RyYXZlcnNhbChOb25lLCBOb25lLCBCeXRlY29kZSgpKS5pZF8oKmFyZ3MpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgbWF4KGNscywgKmFyZ3MpOgotICAgICAgICByZXR1cm4gY2xzLmdyYXBoX3RyYXZlcnNhbChOb25lLCBOb25lLCBCeXRlY29kZSgpKS5tYXhfKCphcmdzKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG1pbihjbHMsICphcmdzKToKLSAgICAgICAgcmV0dXJuIGNscy5ncmFwaF90cmF2ZXJzYWwoTm9uZSwgTm9uZSwgQnl0ZWNvZGUoKSkubWluXygqYXJncykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiByYW5nZShjbHMsICphcmdzKToKLSAgICAgICAgcmV0dXJuIGNscy5ncmFwaF90cmF2ZXJzYWwoTm9uZSwgTm9uZSwgQnl0ZWNvZGUoKSkucmFuZ2VfKCphcmdzKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHN1bShjbHMsICphcmdzKToKLSAgICAgICAgcmV0dXJuIGNscy5ncmFwaF90cmF2ZXJzYWwoTm9uZSwgTm9uZSwgQnl0ZWNvZGUoKSkuc3VtXygqYXJncykKLQotPCUgYW5vblN0ZXBNZXRob2RzLmVhY2h7IG1ldGhvZCAtPiAlPgotZGVmIDwlPSBtZXRob2QgJT4oKmFyZ3MpOgotICAgIHJldHVybiBfXy48JT0gbWV0aG9kICU+KCphcmdzKQotCi08JSB9ICU+Ci0jIERlcHJlY2F0ZWQgLSBwcmVmZXIgdGhlIHVuZGVyc2NvcmUgc3VmZml4ZWQgdmVyc2lvbnMgZS5nIGZpbHRlcl8oKQotCi1kZWYgZmlsdGVyKCphcmdzKToKLSAgICByZXR1cm4gX18uZmlsdGVyXygqYXJncykKLQotCi1kZWYgaWQoKmFyZ3MpOgotICAgIHJldHVybiBfXy5pZF8oKmFyZ3MpCi0KLQotZGVmIG1heCgqYXJncyk6Ci0gICAgcmV0dXJuIF9fLm1heF8oKmFyZ3MpCi0KLQotZGVmIG1pbigqYXJncyk6Ci0gICAgcmV0dXJuIF9fLm1pbl8oKmFyZ3MpCi0KLQotZGVmIHJhbmdlKCphcmdzKToKLSAgICByZXR1cm4gX18ucmFuZ2VfKCphcmdzKQotCi0KLWRlZiBzdW0oKmFyZ3MpOgotICAgIHJldHVybiBfXy5zdW1fKCphcmdzKQotCi0KLTwlIGFub25TdGVwTWV0aG9kcy5lYWNoeyBtZXRob2QgLT4gJT5zdGF0aWNzLmFkZF9zdGF0aWMoJzwlPSBtZXRob2QgJT4nLCA8JT0gbWV0aG9kICU+KQotCi08JSB9ICU+Ci0jIERlcHJlY2F0ZWQgLSBwcmVmZXIgdGhlIHVuZGVyc2NvcmUgc3VmZml4ZWQgdmVyc2lvbnMgZS5nIGZpbHRlcl8oKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2ZpbHRlcicsIGZpbHRlcikKLXN0YXRpY3MuYWRkX3N0YXRpYygnaWQnLCBpZCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnbWF4JywgbWF4KQotc3RhdGljcy5hZGRfc3RhdGljKCdtaW4nLCBtaW4pCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3JhbmdlJywgcmFuZ2UpCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3N1bScsIHN1bSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL2dsdi9UcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUgYi9ncmVtbGluLXB5dGhvbi9nbHYvVHJhdmVyc2FsU291cmNlLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjdlZTcyLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL2dsdi9UcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaW1wb3J0IGNvcHkKLWZyb20gYWVudW0gaW1wb3J0IEVudW0KLWZyb20gLi4gaW1wb3J0IHN0YXRpY3MKLWZyb20gLi5zdGF0aWNzIGltcG9ydCBsb25nCi0KLWNsYXNzIFRyYXZlcnNhbChvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmFwaCwgdHJhdmVyc2FsX3N0cmF0ZWdpZXMsIGJ5dGVjb2RlKToKLSAgICAgICAgc2VsZi5ncmFwaCA9IGdyYXBoCi0gICAgICAgIHNlbGYudHJhdmVyc2FsX3N0cmF0ZWdpZXMgPSB0cmF2ZXJzYWxfc3RyYXRlZ2llcwotICAgICAgICBzZWxmLmJ5dGVjb2RlID0gYnl0ZWNvZGUKLSAgICAgICAgc2VsZi5zaWRlX2VmZmVjdHMgPSBUcmF2ZXJzYWxTaWRlRWZmZWN0cygpCi0gICAgICAgIHNlbGYudHJhdmVyc2VycyA9IE5vbmUKLSAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IE5vbmUKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHN0cihzZWxmLmJ5dGVjb2RlKQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmJ5dGVjb2RlID09IG90aGVyLmJ5dGVjb2RlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi50cmF2ZXJzZXJzIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzLmFwcGx5X3N0cmF0ZWdpZXMoc2VsZikKLSAgICAgICAgaWYgc2VsZi5sYXN0X3RyYXZlcnNlciBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IG5leHQoc2VsZi50cmF2ZXJzZXJzKQotICAgICAgICBvYmplY3QgPSBzZWxmLmxhc3RfdHJhdmVyc2VyLm9iamVjdAotICAgICAgICBzZWxmLmxhc3RfdHJhdmVyc2VyLmJ1bGsgPSBzZWxmLmxhc3RfdHJhdmVyc2VyLmJ1bGsgLSAxCi0gICAgICAgIGlmIHNlbGYubGFzdF90cmF2ZXJzZXIuYnVsayA8PSAwOgotICAgICAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IE5vbmUKLSAgICAgICAgcmV0dXJuIG9iamVjdAotCi0gICAgZGVmIHRvTGlzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIGxpc3QoaXRlcihzZWxmKSkKLQotICAgIGRlZiB0b1NldChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNldChpdGVyKHNlbGYpKQotCi0gICAgZGVmIGl0ZXJhdGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYnl0ZWNvZGUuYWRkX3N0ZXAoIm5vbmUiKQotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgdHJ5OiBzZWxmLm5leHRUcmF2ZXJzZXIoKQotICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiBzZWxmCi0KLSAgICBkZWYgbmV4dFRyYXZlcnNlcihzZWxmKToKLSAgICAgICAgaWYgc2VsZi50cmF2ZXJzZXJzIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzLmFwcGx5X3N0cmF0ZWdpZXMoc2VsZikKLSAgICAgICAgaWYgc2VsZi5sYXN0X3RyYXZlcnNlciBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIG5leHQoc2VsZi50cmF2ZXJzZXJzKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGVtcCA9IHNlbGYubGFzdF90cmF2ZXJzZXIKLSAgICAgICAgICAgIHNlbGYubGFzdF90cmF2ZXJzZXIgPSBOb25lCi0gICAgICAgICAgICByZXR1cm4gdGVtcAotCi0gICAgZGVmIGhhc05leHQoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYudHJhdmVyc2VycyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcy5hcHBseV9zdHJhdGVnaWVzKHNlbGYpCi0gICAgICAgIGlmIHNlbGYubGFzdF90cmF2ZXJzZXIgaXMgTm9uZToKLSAgICAgICAgICAgIHRyeTogc2VsZi5sYXN0X3RyYXZlcnNlciA9IG5leHQoc2VsZi50cmF2ZXJzZXJzKQotICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gbm90KHNlbGYubGFzdF90cmF2ZXJzZXIgaXMgTm9uZSkgYW5kIHNlbGYubGFzdF90cmF2ZXJzZXIuYnVsayA+IDAKLQotICAgIGRlZiBuZXh0KHNlbGYsIGFtb3VudD1Ob25lKToKLSAgICAgICAgaWYgYW1vdW50IGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX25leHRfXygpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjb3VudCA9IDAKLSAgICAgICAgICAgIHRlbXBMaXN0ID0gW10KLSAgICAgICAgICAgIHdoaWxlIGNvdW50IDwgYW1vdW50OgotICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCi0gICAgICAgICAgICAgICAgdHJ5OiB0ZW1wID0gc2VsZi5fX25leHRfXygpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiB0ZW1wTGlzdAotICAgICAgICAgICAgICAgIHRlbXBMaXN0LmFwcGVuZCh0ZW1wKQotICAgICAgICAgICAgcmV0dXJuIHRlbXBMaXN0Ci0KLSAgICBkZWYgcHJvbWlzZShzZWxmLCBjYj1Ob25lKToKLSAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcy5hcHBseV9hc3luY19zdHJhdGVnaWVzKHNlbGYpCi0gICAgICAgIGZ1dHVyZV90cmF2ZXJzYWwgPSBzZWxmLnJlbW90ZV9yZXN1bHRzCi0gICAgICAgIGZ1dHVyZSA9IHR5cGUoZnV0dXJlX3RyYXZlcnNhbCkoKQotICAgICAgICBkZWYgcHJvY2VzcyhmKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB0cmF2ZXJzYWwgPSBmLnJlc3VsdCgpCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi50cmF2ZXJzZXJzID0gaXRlcih0cmF2ZXJzYWwudHJhdmVyc2VycykKLSAgICAgICAgICAgICAgICBzZWxmLnNpZGVfZWZmZWN0cyA9IHRyYXZlcnNhbC5zaWRlX2VmZmVjdHMKLSAgICAgICAgICAgICAgICBpZiBjYjoKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2Ioc2VsZikKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZS5zZXRfcmVzdWx0KHJlc3VsdCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBmdXR1cmUuc2V0X3Jlc3VsdChzZWxmKQotICAgICAgICBmdXR1cmVfdHJhdmVyc2FsLmFkZF9kb25lX2NhbGxiYWNrKHByb2Nlc3MpCi0gICAgICAgIHJldHVybiBmdXR1cmUKLQotPCUgZW51bXMuZWFjaCB7IGUgLT4gJT4KLTwlPSBlLmdldFNpbXBsZU5hbWUoKSAlPiA9IEVudW0oJzwlPSBlLmdldFNpbXBsZU5hbWUoKSAlPicsICcgPCU9IGUuZ2V0RW51bUNvbnN0YW50cygpLnNvcnR7YSwgYiAtPiBhLm5hbWUoKSA8PT4gYi5uYW1lKCl9LmNvbGxlY3R7diAtPiB0b1B5dGhvbi5jYWxsKHYubmFtZSgpKX0uam9pbigiICIpICU+JykKLTwlIGUuZ2V0RW51bUNvbnN0YW50cygpLmVhY2gge3YgLT4gJT4KLXN0YXRpY3MuYWRkX3N0YXRpYygnPCU9IHRvUHl0aG9uLmNhbGwodi5uYW1lKCkpICU+JywgPCU9IHYuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgJT4uPCU9IHRvUHl0aG9uLmNhbGwodi5uYW1lKCkpICU+KTwlIH0gJT4KLTwlIH0gJT4KLQotVCA9IEVudW0oJ1QnLCAnIGlkIGlkXyBrZXkgbGFiZWwgdmFsdWUnKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2lkJywgVC5pZCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnbGFiZWwnLCBULmxhYmVsKQotc3RhdGljcy5hZGRfc3RhdGljKCdpZF8nLCBULmlkXykKLXN0YXRpY3MuYWRkX3N0YXRpYygna2V5JywgVC5rZXkpCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3ZhbHVlJywgVC52YWx1ZSkKLQotCi1PcGVyYXRvciA9IEVudW0oJ09wZXJhdG9yJywgJyBhZGRBbGwgYW5kXyBhc3NpZ24gZGl2IG1heCBtYXhfIG1pbiBtaW5fIG1pbnVzIG11bHQgb3JfIHN1bSBzdW1fIHN1bUxvbmcnKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3N1bV8nLCBPcGVyYXRvci5zdW1fKQotc3RhdGljcy5hZGRfc3RhdGljKCdzdW0nLCBPcGVyYXRvci5zdW1fKQotc3RhdGljcy5hZGRfc3RhdGljKCdtaW51cycsIE9wZXJhdG9yLm1pbnVzKQotc3RhdGljcy5hZGRfc3RhdGljKCdtdWx0JywgT3BlcmF0b3IubXVsdCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnZGl2JywgT3BlcmF0b3IuZGl2KQotc3RhdGljcy5hZGRfc3RhdGljKCdtaW4nLCBPcGVyYXRvci5taW5fKQotc3RhdGljcy5hZGRfc3RhdGljKCdtaW5fJywgT3BlcmF0b3IubWluXykKLXN0YXRpY3MuYWRkX3N0YXRpYygnbWF4XycsIE9wZXJhdG9yLm1heF8pCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2Fzc2lnbicsIE9wZXJhdG9yLmFzc2lnbikKLXN0YXRpY3MuYWRkX3N0YXRpYygnYW5kXycsIE9wZXJhdG9yLmFuZF8pCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ29yXycsIE9wZXJhdG9yLm9yXykKLXN0YXRpY3MuYWRkX3N0YXRpYygnYWRkQWxsJywgT3BlcmF0b3IuYWRkQWxsKQotc3RhdGljcy5hZGRfc3RhdGljKCdzdW1Mb25nJywgT3BlcmF0b3Iuc3VtTG9uZykKLQotCi1jbGFzcyBQKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wZXJhdG9yLCB2YWx1ZSwgb3RoZXI9Tm9uZSk6Ci0gICAgICAgIHNlbGYub3BlcmF0b3IgPSBvcGVyYXRvcgotICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKLSAgICAgICAgc2VsZi5vdGhlciA9IG90aGVyCi08JSBwbWV0aG9kcy5maW5kQWxseyEoaXQgaW4gWyJ3aXRoaW4iLCJ3aXRob3V0Il0pfS5lYWNoIHsgbWV0aG9kIC0+ICU+Ci0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiA8JT0gbWV0aG9kICU+KCphcmdzKToKLSAgICAgICAgcmV0dXJuIFAoIjwlPSB0b0phdmEuY2FsbChtZXRob2QpICU+IiwgKmFyZ3MpCi08JSB9ICU+Ci0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiB3aXRoaW4oKmFyZ3MpOgotICAgICAgICBpZiBsZW4oYXJncykgPT0gMSBhbmQgdHlwZShhcmdzWzBdKSA9PSBsaXN0OgotICAgICAgICAgICAgcmV0dXJuIFAoIndpdGhpbiIsIGFyZ3NbMF0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gUCgid2l0aGluIiwgbGlzdChhcmdzKSkKLSAgICAgICAgCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiB3aXRob3V0KCphcmdzKToKLSAgICAgICAgaWYgbGVuKGFyZ3MpID09IDEgYW5kIHR5cGUoYXJnc1swXSkgPT0gbGlzdDoKLSAgICAgICAgICAgIHJldHVybiBQKCJ3aXRob3V0IiwgYXJnc1swXSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBQKCJ3aXRob3V0IiwgbGlzdChhcmdzKSkKLQotICAgIGRlZiBhbmRfKHNlbGYsIGFyZyk6Ci0gICAgICAgIHJldHVybiBQKCJhbmQiLCBzZWxmLCBhcmcpCi0KLSAgICBkZWYgb3JfKHNlbGYsIGFyZyk6Ci0gICAgICAgIHJldHVybiBQKCJvciIsIHNlbGYsIGFyZykKLQotICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLm9wZXJhdG9yID09IG90aGVyLm9wZXJhdG9yIGFuZCBzZWxmLnZhbHVlID09IG90aGVyLnZhbHVlIGFuZCBzZWxmLm90aGVyID09IG90aGVyLm90aGVyCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLm9wZXJhdG9yICsgIigiICsgc3RyKHNlbGYudmFsdWUpICsgIikiIGlmIHNlbGYub3RoZXIgaXMgTm9uZSBlbHNlIHNlbGYub3BlcmF0b3IgKyAiKCIgKyBzdHIoc2VsZi52YWx1ZSkgKyAiLCIgKyBzdHIoc2VsZi5vdGhlcikgKyAiKSIKLQotPCUgcG1ldGhvZHMuZmluZEFsbHshaXQuZXF1YWxzKCJjbG9uZSIpfS5lYWNoIHsgbWV0aG9kIC0+ICU+Ci1kZWYgPCU9IG1ldGhvZCAlPigqYXJncyk6Ci0gICAgcmV0dXJuIFAuPCU9IG1ldGhvZCAlPigqYXJncykKLQotPCUgfSAlPgotPCUgcG1ldGhvZHMuZmluZEFsbHshaXQuZXF1YWxzKCJjbG9uZSIpfS5lYWNoIHsgbWV0aG9kIC0+ICU+c3RhdGljcy5hZGRfc3RhdGljKCc8JT0gbWV0aG9kICU+JywgPCU9IG1ldGhvZCAlPikKLQotPCUgfSAlPgotY2xhc3MgVGV4dFAoUCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wZXJhdG9yLCB2YWx1ZSwgb3RoZXI9Tm9uZSk6Ci0gICAgICAgIFAuX19pbml0X18oc2VsZiwgb3BlcmF0b3IsIHZhbHVlLCBvdGhlcikKLTwlIHRwbWV0aG9kcy5lYWNoIHsgbWV0aG9kIC0+ICU+Ci0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiA8JT0gbWV0aG9kICU+KCphcmdzKToKLSAgICAgICAgcmV0dXJuIFRleHRQKCI8JT0gdG9KYXZhLmNhbGwobWV0aG9kKSAlPiIsICphcmdzKQotPCUgfSAlPgotICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLm9wZXJhdG9yID09IG90aGVyLm9wZXJhdG9yIGFuZCBzZWxmLnZhbHVlID09IG90aGVyLnZhbHVlIGFuZCBzZWxmLm90aGVyID09IG90aGVyLm90aGVyCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLm9wZXJhdG9yICsgIigiICsgc3RyKHNlbGYudmFsdWUpICsgIikiIGlmIHNlbGYub3RoZXIgaXMgTm9uZSBlbHNlIHNlbGYub3BlcmF0b3IgKyAiKCIgKyBzdHIoc2VsZi52YWx1ZSkgKyAiLCIgKyBzdHIoc2VsZi5vdGhlcikgKyAiKSIKLQotPCUgdHBtZXRob2RzLmZpbmRBbGx7IWl0LmVxdWFscygiY2xvbmUiKX0uZWFjaCB7IG1ldGhvZCAtPiAlPgotZGVmIDwlPSBtZXRob2QgJT4oKmFyZ3MpOgotICAgIHJldHVybiBUZXh0UC48JT0gbWV0aG9kICU+KCphcmdzKQotCi08JSB9ICU+Ci08JSB0cG1ldGhvZHMuZmluZEFsbHshaXQuZXF1YWxzKCJjbG9uZSIpfS5lYWNoIHsgbWV0aG9kIC0+ICU+c3RhdGljcy5hZGRfc3RhdGljKCc8JT0gbWV0aG9kICU+JywgPCU9IG1ldGhvZCAlPikKLQotPCUgfSAlPgotPCUgdG9rZW5zLmVhY2ggeyBrLHYgLT4gJT4KLQotJycnCi08JT0gayAlPgotJycnCi0KLQotY2xhc3MgPCU9IGsgJT4ob2JqZWN0KToKLTwlIHYuZWFjaCB7YSxiIC0+ICU+Ci0gICAgPCU9IGEgJT4gPSAiPCU9IGIgJT4iCi08JSB9fSAlPgotCi0nJycKLVRSQVZFUlNFUgotJycnCi0KLQotY2xhc3MgVHJhdmVyc2VyKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iamVjdCwgYnVsaz1Ob25lKToKLSAgICAgICAgaWYgYnVsayBpcyBOb25lOgotICAgICAgICAgICAgYnVsayA9IGxvbmcoMSkKLSAgICAgICAgc2VsZi5vYmplY3QgPSBvYmplY3QKLSAgICAgICAgc2VsZi5idWxrID0gYnVsawotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc3RyKHNlbGYub2JqZWN0KQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYub2JqZWN0ID09IG90aGVyLm9iamVjdAotCi0KLScnJwotVFJBVkVSU0FMIFNJREUtRUZGRUNUUwotJycnCi0KLQotY2xhc3MgVHJhdmVyc2FsU2lkZUVmZmVjdHMob2JqZWN0KToKLSAgICBkZWYga2V5cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNldCgpCi0KLSAgICBkZWYgZ2V0KHNlbGYsIGtleSk6Ci0gICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKLQotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5KQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gInNpZGVFZmZlY3RzW3NpemU6IiArIHN0cihsZW4oc2VsZi5rZXlzKCkpKSArICJdIgotCi0KLScnJwotVFJBVkVSU0FMIFNUUkFURUdJRVMKLScnJwotCi0KLWNsYXNzIFRyYXZlcnNhbFN0cmF0ZWdpZXMob2JqZWN0KToKLSAgICBnbG9iYWxfY2FjaGUgPSB7fQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYXZlcnNhbF9zdHJhdGVnaWVzPU5vbmUpOgotICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzID0gXAotICAgICAgICAgICAgdHJhdmVyc2FsX3N0cmF0ZWdpZXMudHJhdmVyc2FsX3N0cmF0ZWdpZXMgaWYgdHJhdmVyc2FsX3N0cmF0ZWdpZXMgaXMgbm90IE5vbmUgZWxzZSBbXQotCi0gICAgZGVmIGFkZF9zdHJhdGVnaWVzKHNlbGYsIHRyYXZlcnNhbF9zdHJhdGVnaWVzKToKLSAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcyA9IHNlbGYudHJhdmVyc2FsX3N0cmF0ZWdpZXMgKyB0cmF2ZXJzYWxfc3RyYXRlZ2llcwotCi0gICAgZGVmIGFwcGx5X3N0cmF0ZWdpZXMoc2VsZiwgdHJhdmVyc2FsKToKLSAgICAgICAgZm9yIHRyYXZlcnNhbF9zdHJhdGVneSBpbiBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzOgotICAgICAgICAgICAgdHJhdmVyc2FsX3N0cmF0ZWd5LmFwcGx5KHRyYXZlcnNhbCkKLQotICAgIGRlZiBhcHBseV9hc3luY19zdHJhdGVnaWVzKHNlbGYsIHRyYXZlcnNhbCk6Ci0gICAgICAgIGZvciB0cmF2ZXJzYWxfc3RyYXRlZ3kgaW4gc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llczoKLSAgICAgICAgICAgIHRyYXZlcnNhbF9zdHJhdGVneS5hcHBseV9hc3luYyh0cmF2ZXJzYWwpCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzdHIoc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcykKLQotCi1jbGFzcyBUcmF2ZXJzYWxTdHJhdGVneShvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJhdGVneV9uYW1lPU5vbmUsIGNvbmZpZ3VyYXRpb249Tm9uZSwgZnFjbj1Ob25lKToKLSAgICAgICAgc2VsZi5mcWNuID0gZnFjbgotICAgICAgICBzZWxmLnN0cmF0ZWd5X25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fIGlmIHN0cmF0ZWd5X25hbWUgaXMgTm9uZSBlbHNlIHN0cmF0ZWd5X25hbWUKLSAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0ge30gaWYgY29uZmlndXJhdGlvbiBpcyBOb25lIGVsc2UgY29uZmlndXJhdGlvbgotCi0gICAgZGVmIGFwcGx5KHNlbGYsIHRyYXZlcnNhbCk6Ci0gICAgICAgIHJldHVybgotCi0gICAgZGVmIGFwcGx5X2FzeW5jKHNlbGYsIHRyYXZlcnNhbCk6Ci0gICAgICAgIHJldHVybgotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKLQotICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5zdHJhdGVneV9uYW1lKQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5zdHJhdGVneV9uYW1lCi0KLQotJycnCi1CWVRFQ09ERQotJycnCi0KLQotY2xhc3MgQnl0ZWNvZGUob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZWNvZGU9Tm9uZSk6Ci0gICAgICAgIHNlbGYuc291cmNlX2luc3RydWN0aW9ucyA9IFtdCi0gICAgICAgIHNlbGYuc3RlcF9pbnN0cnVjdGlvbnMgPSBbXQotICAgICAgICBzZWxmLmJpbmRpbmdzID0ge30KLSAgICAgICAgaWYgYnl0ZWNvZGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMgPSBsaXN0KGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMpCi0gICAgICAgICAgICBzZWxmLnN0ZXBfaW5zdHJ1Y3Rpb25zID0gbGlzdChieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKLQotICAgIGRlZiBhZGRfc291cmNlKHNlbGYsIHNvdXJjZV9uYW1lLCAqYXJncyk6Ci0gICAgICAgIGluc3RydWN0aW9uID0gW3NvdXJjZV9uYW1lXQotICAgICAgICBmb3IgYXJnIGluIGFyZ3M6Ci0gICAgICAgICAgICBpbnN0cnVjdGlvbi5hcHBlbmQoc2VsZi5fX2NvbnZlcnRBcmd1bWVudChhcmcpKQotICAgICAgICBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3RydWN0aW9uKQotCi0gICAgZGVmIGFkZF9zdGVwKHNlbGYsIHN0ZXBfbmFtZSwgKmFyZ3MpOgotICAgICAgICBpbnN0cnVjdGlvbiA9IFtzdGVwX25hbWVdCi0gICAgICAgIGZvciBhcmcgaW4gYXJnczoKLSAgICAgICAgICAgIGluc3RydWN0aW9uLmFwcGVuZChzZWxmLl9fY29udmVydEFyZ3VtZW50KGFyZykpCi0gICAgICAgIHNlbGYuc3RlcF9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3RydWN0aW9uKQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMgPT0gb3RoZXIuc291cmNlX2luc3RydWN0aW9ucyBhbmQgc2VsZi5zdGVwX2luc3RydWN0aW9ucyA9PSBvdGhlci5zdGVwX2luc3RydWN0aW9ucwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgX19jb3B5X18oc2VsZik6Ci0gICAgICAgIGJiID0gQnl0ZWNvZGUoKQotICAgICAgICBiYi5zb3VyY2VfaW5zdHJ1Y3Rpb25zID0gc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zCi0gICAgICAgIGJiLnN0ZXBfaW5zdHJ1Y3Rpb25zID0gc2VsZi5zdGVwX2luc3RydWN0aW9ucwotICAgICAgICBiYi5iaW5kaW5ncyA9IHNlbGYuYmluZGluZ3MKLSAgICAgICAgcmV0dXJuIGJiCi0KLSAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW89e30pOgotICAgICAgICBiYiA9IEJ5dGVjb2RlKCkKLSAgICAgICAgYmIuc291cmNlX2luc3RydWN0aW9ucyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zLCBtZW1vKQotICAgICAgICBiYi5zdGVwX2luc3RydWN0aW9ucyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zdGVwX2luc3RydWN0aW9ucywgbWVtbykKLSAgICAgICAgYmIuYmluZGluZ3MgPSBjb3B5LmRlZXBjb3B5KHNlbGYuYmluZGluZ3MsIG1lbW8pCi0gICAgICAgIHJldHVybiBiYgotCi0gICAgZGVmIF9fY29udmVydEFyZ3VtZW50KHNlbGYsYXJnKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIFRyYXZlcnNhbCk6Ci0gICAgICAgICAgICBzZWxmLmJpbmRpbmdzLnVwZGF0ZShhcmcuYnl0ZWNvZGUuYmluZGluZ3MpCi0gICAgICAgICAgICByZXR1cm4gYXJnLmJ5dGVjb2RlCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmcsIGRpY3QpOgotICAgICAgICAgICAgbmV3RGljdCA9IHt9Ci0gICAgICAgICAgICBmb3Iga2V5IGluIGFyZzoKLSAgICAgICAgICAgICAgICBuZXdEaWN0W3NlbGYuX19jb252ZXJ0QXJndW1lbnQoa2V5KV0gPSBzZWxmLl9fY29udmVydEFyZ3VtZW50KGFyZ1trZXldKQotICAgICAgICAgICAgcmV0dXJuIG5ld0RpY3QKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZywgbGlzdCk6Ci0gICAgICAgICAgICBuZXdMaXN0ID0gW10KLSAgICAgICAgICAgIGZvciBpdGVtIGluIGFyZzoKLSAgICAgICAgICAgICAgICBuZXdMaXN0LmFwcGVuZChzZWxmLl9fY29udmVydEFyZ3VtZW50KGl0ZW0pKQotICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3QKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZywgc2V0KToKLSAgICAgICAgICAgIG5ld1NldCA9IHNldCgpCi0gICAgICAgICAgICBmb3IgaXRlbSBpbiBhcmc6Ci0gICAgICAgICAgICAgICAgbmV3U2V0LmFkZChzZWxmLl9fY29udmVydEFyZ3VtZW50KGl0ZW0pKQotICAgICAgICAgICAgcmV0dXJuIG5ld1NldAotICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYXJnLCBCaW5kaW5nKToKLSAgICAgICAgICAgIHNlbGYuYmluZGluZ3NbYXJnLmtleV0gPSBhcmcudmFsdWUKLSAgICAgICAgICAgIHJldHVybiBCaW5kaW5nKGFyZy5rZXksIHNlbGYuX19jb252ZXJ0QXJndW1lbnQoYXJnLnZhbHVlKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBhcmcKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChzdHIoc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zKSBpZiBsZW4oc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zKSA+IDAgZWxzZSAiIikgKyBcXAotICAgICAgICAgICAgICAgKHN0cihzZWxmLnN0ZXBfaW5zdHJ1Y3Rpb25zKSBpZiBsZW4oc2VsZi5zdGVwX2luc3RydWN0aW9ucykgPiAwIGVsc2UgIiIpCi0KLQotJycnCi1CSU5ESU5HUwotJycnCi0KLQotY2xhc3MgQmluZGluZ3Mob2JqZWN0KToKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgb2Yoa2V5LCB2YWx1ZSk6Ci0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgc3RyKToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiS2V5IG11c3QgYmUgc3RyIikKLSAgICAgICAgcmV0dXJuIEJpbmRpbmcoa2V5LCB2YWx1ZSkKLQotCi1jbGFzcyBCaW5kaW5nKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUpOgotICAgICAgICBzZWxmLmtleSA9IGtleQotICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKLQotICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLmtleSA9PSBvdGhlci5rZXkgYW5kIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUKLQotICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5rZXkpICsgaGFzaChzZWxmLnZhbHVlKQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gImJpbmRpbmdbIiArIHNlbGYua2V5ICsgIj0iICsgc3RyKHNlbGYudmFsdWUpICsgIl0iCi0KLQotJycnCi1XSVRIIE9QVElPTlMKLScnJwotCi0KLWNsYXNzIFdpdGhPcHRpb25zKG9iamVjdCk6Ci08JSB3aXRoT3B0aW9ucy5lYWNoIHsgJT4KLSAgICA8JT0gaXQubmFtZSAlPiA9IDwlPSBpdC52YWx1ZSAlPgotPCUgfSAlPgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vZ2x2L2dlbmVyYXRlLmdyb292eSBiL2dyZW1saW4tcHl0aG9uL2dsdi9nZW5lcmF0ZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTFhNDAuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vZ2x2L2dlbmVyYXRlLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkNvcmVJbXBvcnRzCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5Db25uZWN0ZWRDb21wb25lbnQKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlBhZ2VSYW5rCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5QZWVyUHJlc3N1cmUKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlNob3J0ZXN0UGF0aAotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU291cmNlCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWwKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbFNvdXJjZQotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUAotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVGV4dFAKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLklPCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5PcGVyYXRvcgotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuV2l0aE9wdGlvbnMKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIKLQotLy8gdGhpcyBpcyBhIGJpdCBvZiBhIGNvcHkgb2Ygd2hhdCdzIGluIFN5bWJvbEhlbHBlciAtIG5vIHdheSBhcm91bmQgaXQgYmVjYXVzZSB0aGlzIGNvZGUgZ2VuZXJhdGlvbiB0YXNrIG9jY3VycwotLy8gYmVmb3JlIHRoZSBTeW1ib2xIZWxwZXIgaXMgYXZhaWxhYmxlIHRvIHRoZSBwbHVnaW4uCi1kZWYgdG9QeXRob25NYXAgPSBbImFuZCI6ICJhbmRfIiwKLSAgICAgICAgICAgICAgICAgICAiYWxsIjogImFsbF8iLAotICAgICAgICAgICAgICAgICAgICJhcyI6ICJhc18iLAotICAgICAgICAgICAgICAgICAgICJmaWx0ZXIiOiAiZmlsdGVyXyIsCi0gICAgICAgICAgICAgICAgICAgImZyb20iOiAiZnJvbV8iLAotICAgICAgICAgICAgICAgICAgICJnbG9iYWwiOiAiZ2xvYmFsXyIsCi0gICAgICAgICAgICAgICAgICAgImlkIjogImlkXyIsCi0gICAgICAgICAgICAgICAgICAgImluIjogImluXyIsCi0gICAgICAgICAgICAgICAgICAgImlzIjogImlzXyIsCi0gICAgICAgICAgICAgICAgICAgImxpc3QiOiAibGlzdF8iLAotICAgICAgICAgICAgICAgICAgICJtYXgiOiAibWF4XyIsCi0gICAgICAgICAgICAgICAgICAgIm1pbiI6ICJtaW5fIiwKLSAgICAgICAgICAgICAgICAgICAibm90IjogIm5vdF8iLAotICAgICAgICAgICAgICAgICAgICJyYW5nZSI6ICJyYW5nZV8iLAotICAgICAgICAgICAgICAgICAgICJvciI6ICJvcl8iLAotICAgICAgICAgICAgICAgICAgICJzZXQiOiAic2V0XyIsCi0gICAgICAgICAgICAgICAgICAgInN1bSI6ICJzdW1fIiwKLSAgICAgICAgICAgICAgICAgICAid2l0aCI6ICJ3aXRoXyJdCi0KLWRlZiBnYXRoZXJUb2tlbnNGcm9tID0geyB0b2tlbkNsYXNzZXMgLT4KLSAgICBkZWYgbSA9IFs6XQotICAgIHRva2VuQ2xhc3Nlcy5lYWNoIHsgdGMgLT4gbSA8PCBbKHRjLnNpbXBsZU5hbWUpIDogdGMuZ2V0RmllbGRzKCkuc29ydHsgYSwgYiAtPiBhLm5hbWUgPD0+IGIubmFtZSB9LmNvbGxlY3RFbnRyaWVzeyBmIC0+IFsoZi5uYW1lKSA6IGYuZ2V0KG51bGwpXX1dfQotICAgIHJldHVybiBtCi19Ci0KLWRlZiB0b1B5dGhvblZhbHVlID0geyB0eXBlLCB2YWx1ZSAtPgotICB0eXBlID09IFN0cmluZy5jbGFzcyAmJiB2YWx1ZSAhPSBudWxsID8gKCciJyArIHZhbHVlICsgJyInKSA6IHZhbHVlCi19Ci0KLWRlZiB0b0phdmFNYXAgPSB0b1B5dGhvbk1hcC5jb2xsZWN0RW50cmllc3trLHYgLT4gWyh2KTprXX0KLWRlZiB0b1B5dGhvbiA9IHsgc3ltYm9sIC0+IHRvUHl0aG9uTWFwLmdldE9yRGVmYXVsdChzeW1ib2wsIHN5bWJvbCkgfQotZGVmIHRvSmF2YSA9IHsgc3ltYm9sIC0+IHRvSmF2YU1hcC5nZXRPckRlZmF1bHQoc3ltYm9sLCBzeW1ib2wpIH0KLQotLy8gZm9yIGVudW1zIHdlIGlnbm9yZSBUIGFuZCBoYW5kbGUgaXQgbWFudWFsbHkgYmVjYXVzZSBvZiBjb25mbGljdCB3aXRoIFQuaWQgd2hpY2ggaXMgdHJpY2tpZXIgdG8gZGVhbCB3aXRoCi0vLyBpbiB0aGUgdGVtcGxhdGluZyBsYW5ndWFnZQotZGVmIGJpbmRpbmcgPSBbImVudW1zIjogQ29yZUltcG9ydHMuZ2V0Q2xhc3NJbXBvcnRzKCkKLSAgICAgICAgLmZpbmRBbGwgeyBFbnVtLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaXQpICYmICEoaXQgaW4gW1QsIE9wZXJhdG9yXSkgfQotICAgICAgICAuc29ydCB7IGEsIGIgLT4gYS5nZXRTaW1wbGVOYW1lKCkgPD0+IGIuZ2V0U2ltcGxlTmFtZSgpIH0sCi0gICAgICAgICAgICAgICAicG1ldGhvZHMiOiBQLmNsYXNzLmdldE1ldGhvZHMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IE1vZGlmaWVyLmlzU3RhdGljKGl0LmdldE1vZGlmaWVycygpKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgUC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgeyB0b1B5dGhvbihpdC5uYW1lKSB9LgotICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYSA8PT4gYiB9LAotICAgICAgICAgICAgICAgInRwbWV0aG9kcyI6IFRleHRQLmNsYXNzLmdldE1ldGhvZHMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IE1vZGlmaWVyLmlzU3RhdGljKGl0LmdldE1vZGlmaWVycygpKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgVGV4dFAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgdG9QeXRob24oaXQubmFtZSkgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKCkuCi0gICAgICAgICAgICAgICAgICAgICAgIHNvcnQgeyBhLCBiIC0+IGEgPD0+IGIgfSwKLSAgICAgICAgICAgICAgICJzb3VyY2VTdGVwTWV0aG9kcyI6IEdyYXBoVHJhdmVyc2FsU291cmNlLmdldE1ldGhvZHMoKS4gLy8gU09VUkNFIFNURVBTCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyBHcmFwaFRyYXZlcnNhbFNvdXJjZS5jbGFzcy5lcXVhbHMoaXQucmV0dXJuVHlwZSkgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAhaXQubmFtZS5lcXVhbHMoImNsb25lIikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0Lm5hbWUuZXF1YWxzKFRyYXZlcnNhbFNvdXJjZS5TeW1ib2xzLndpdGhSZW1vdGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdC5uYW1lLmVxdWFscyhUcmF2ZXJzYWxTb3VyY2UuU3ltYm9scy53aXRoQ29tcHV0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgeyB0b1B5dGhvbihpdC5uYW1lKSB9LgotICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7IGEsIGIgLT4gYSA8PT4gYiB9LAotICAgICAgICAgICAgICAgInNvdXJjZVNwYXduTWV0aG9kcyI6IEdyYXBoVHJhdmVyc2FsU291cmNlLmdldE1ldGhvZHMoKS4gLy8gU1BBV04gU1RFUFMKLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7IEdyYXBoVHJhdmVyc2FsLmNsYXNzLmVxdWFscyhpdC5yZXR1cm5UeXBlKSB9LgotICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IHsgdG9QeXRob24oaXQubmFtZSkgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKCkuCi0gICAgICAgICAgICAgICAgICAgICAgIHNvcnQgeyBhLCBiIC0+IGEgPD0+IGIgfSwKLSAgICAgICAgICAgICAgICJncmFwaFN0ZXBNZXRob2RzIjogR3JhcGhUcmF2ZXJzYWwuZ2V0TWV0aG9kcygpLgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgR3JhcGhUcmF2ZXJzYWwuY2xhc3MuZXF1YWxzKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyAhaXQubmFtZS5lcXVhbHMoImNsb25lIikgJiYgIWl0Lm5hbWUuZXF1YWxzKCJpdGVyYXRlIikgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCB7IHRvUHl0aG9uKGl0Lm5hbWUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSgpLgotICAgICAgICAgICAgICAgICAgICAgICBzb3J0IHsgYSwgYiAtPiBhIDw9PiBiIH0sCi0gICAgICAgICAgICAgICAiYW5vblN0ZXBNZXRob2RzIjogX18uY2xhc3MuZ2V0TWV0aG9kcygpLgotICAgICAgICAgICAgICAgICAgICAgICBmaW5kQWxsIHsgR3JhcGhUcmF2ZXJzYWwuY2xhc3MuZXF1YWxzKGl0LnJldHVyblR5cGUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwgeyBNb2RpZmllci5pc1N0YXRpYyhpdC5nZXRNb2RpZmllcnMoKSkgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbCB7ICFpdC5uYW1lLmVxdWFscygiX18iKSAmJiAhaXQubmFtZS5lcXVhbHMoInN0YXJ0IikgfS4KLSAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCB7IHRvUHl0aG9uKGl0Lm5hbWUpIH0uCi0gICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSgpLgotICAgICAgICAgICAgICAgICAgICAgICBzb3J0IHsgYSwgYiAtPiBhIDw9PiBiIH0sCi0gICAgICAgICAgICAgICAidG9rZW5zIjogZ2F0aGVyVG9rZW5zRnJvbShbSU8sIENvbm5lY3RlZENvbXBvbmVudCwgU2hvcnRlc3RQYXRoLCBQYWdlUmFuaywgUGVlclByZXNzdXJlXSksCi0gICAgICAgICAgICAgICAidG9QeXRob24iOiB0b1B5dGhvbiwKLSAgICAgICAgICAgICAgICJ0b0phdmEiOiB0b0phdmEsCi0gICAgICAgICAgICAgICAid2l0aE9wdGlvbnMiOiBXaXRoT3B0aW9ucy5nZXREZWNsYXJlZEZpZWxkcygpLgotICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCB7WyJuYW1lIjogaXQubmFtZSwgInZhbHVlIjogdG9QeXRob25WYWx1ZShpdC50eXBlLCBpdC5nZXQobnVsbCkpXX1dCi0KLWRlZiBlbmdpbmUgPSBuZXcgZ3Jvb3Z5LnRleHQuR1N0cmluZ1RlbXBsYXRlRW5naW5lKCkKLWRlZiB0cmF2ZXJzYWxUZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vZ2x2L1RyYXZlcnNhbFNvdXJjZS50ZW1wbGF0ZSIpKS5tYWtlKGJpbmRpbmcpCi1kZWYgdHJhdmVyc2FsRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy90cmF2ZXJzYWwucHkiKQotdHJhdmVyc2FsRmlsZS5uZXdXcml0ZXIoKS53aXRoV3JpdGVyeyBpdCA8PCB0cmF2ZXJzYWxUZW1wbGF0ZSB9Ci0KLWRlZiBncmFwaFRyYXZlcnNhbFRlbXBsYXRlID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9nbHYvR3JhcGhUcmF2ZXJzYWxTb3VyY2UudGVtcGxhdGUiKSkubWFrZShiaW5kaW5nKQotZGVmIGdyYXBoVHJhdmVyc2FsRmlsZSA9IG5ldyBGaWxlKCIke3Byb2plY3RCYXNlRGlyfS9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9ncmFwaF90cmF2ZXJzYWwucHkiKQotZ3JhcGhUcmF2ZXJzYWxGaWxlLm5ld1dyaXRlcigpLndpdGhXcml0ZXJ7IGl0IDw8IGdyYXBoVHJhdmVyc2FsVGVtcGxhdGUgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vcG9tLnhtbCBiL2dyZW1saW4tcHl0aG9uL3BvbS54bWwKaW5kZXggMmJiYzI3OS4uN2Y3OTU0ZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1weXRob24vcG9tLnhtbAorKysgYi9ncmVtbGluLXB5dGhvbi9wb20ueG1sCkBAIC0yMSw0NiArMjEsMTAgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VycG9wPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1weXRob248L2FydGlmYWN0SWQ+CiAgICAgPG5hbWU+QXBhY2hlIFRpbmtlclBvcCA6OiBHcmVtbGluIFB5dGhvbjwvbmFtZT4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnB5dGhvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp5dGhvbi1zdGFuZGFsb25lPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi43LjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPCEtLSBURVNUSU5HIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VyZ3JhcGgtZ3JlbWxpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi10ZXN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLXNlcnZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KICAgICA8cHJvcGVydGllcz4KICAgICAgICAgPCEtLSBwcm92aWRlcyBhIHdheSB0byBjb252ZXJ0IG1hdmVuLnRlc3Quc2tpcCB2YWx1ZSB0byBza2lwVGVzdHMgZm9yIHVzZSBpbiBza2lwcGluZyBweXRob24gdGVzdHMgLS0+CiAgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+ZmFsc2U8L21hdmVuLnRlc3Quc2tpcD4KQEAgLTcwLDE3NyArMzQsNDIgQEAKICAgICA8YnVpbGQ+CiAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQ8L2RpcmVjdG9yeT4KICAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMKLSAgICAgICAgICAgICAgICA8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcwotICAgICAgICAgICAgICAgIDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICB0aGVyZSBpcyBubyBwb2ludCB0byBidWlsZGluZy9kZXBsb3lpbmcgdGhlIGp2bSBzdHVmZiAtIHRoZXJlIGlzIG5vIGphdmEgc291cmNlIHJlYWxseSAtIGp1c3QgcG9tcworICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2xlYW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU09VUkNFIERJUkVDVE9SSUVTIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5weWM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyouY2xhc3M8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHk8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9sbG93U3ltbGlua3M+ZmFsc2U8L2ZvbGxvd1N5bWxpbmtzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXI8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHljPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmNsYXNzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnB5PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbGxvd1N5bWxpbmtzPmZhbHNlPC9mb2xsb3dTeW1saW5rcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2VzczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5weWM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyouY2xhc3M8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHk8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9sbG93U3ltbGlua3M+ZmFsc2U8L2ZvbGxvd1N5bWxpbmtzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmU8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHljPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmNsYXNzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnB5PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbGxvd1N5bWxpbmtzPmZhbHNlPC9mb2xsb3dTeW1saW5rcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnB5YzwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5jbGFzczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5weTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb2xsb3dTeW1saW5rcz5mYWxzZTwvZm9sbG93U3ltbGlua3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRFU1QgRElSRUNUT1JJRVMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vanl0aG9uL3Rlc3RzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnB5YzwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5jbGFzczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5weTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb2xsb3dTeW1saW5rcz5mYWxzZTwvZm9sbG93U3ltbGlua3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vanl0aG9uL3Rlc3RzL2RyaXZlcjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5weWM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyouY2xhc3M8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHk8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9sbG93U3ltbGlua3M+ZmFsc2U8L2ZvbGxvd1N5bWxpbmtzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2p5dGhvbi90ZXN0cy9wcm9jZXNzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnB5YzwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5jbGFzczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5weTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb2xsb3dTeW1saW5rcz5mYWxzZTwvZm9sbG93U3ltbGlua3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vanl0aG9uL3Rlc3RzL3N0cnVjdHVyZTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5weWM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyouY2xhc3M8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHk8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9sbG93U3ltbGlua3M+ZmFsc2U8L2ZvbGxvd1N5bWxpbmtzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW88L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHljPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmNsYXNzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnB5PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbGxvd1N5bWxpbmtzPmZhbHNlPC9mb2xsb3dTeW1saW5rcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0cz4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwU291cmNlPnRydWU8L3NraXBTb3VyY2U+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnN0YWxsLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CiAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgIDwvcGx1Z2lucz4KICAgICA8L2J1aWxkPgogCiAgICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgZGVmYXVsdCBwcm9maWxlIHdvcmtzIGFyb3VuZCB0aGUgaXNzdWUgd2hlcmUgdGhlIGdsdi1weXRob24gcHJvZmlsZSB3aGljaCBpcyBleHBlY3RlZCB0byBydW4gYWxsIHRlc3RzCi0gICAgICAgICAgICAgY2FuJ3Qgb3ZlcnJpZGUgdGhlIGV4Y2x1c2lvbnMgZGVmaW5lZCBiZWxvdy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdsdi1weXRob24tc3RhbmRhcmQ8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gZXhjbHVkZXMgcHl0aG9uIHJlbGF0ZWQgdGVzdHMgdGhhdCByZXF1aXJlIHB5dGhvbiBpdHNlbGYgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gLSBydW4gd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBweXRob24gcHJvZmlsZSBpZiBnbFZQeXRob24gaXMgcHJlc2VudCAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHB5dGhvbi5ob21lPiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9PC9weXRob24uaG9tZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovanNyMjIzL1B5dGhvbipUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL2dyYXBoc29uL0dyYXBoU09OKlRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+CiAgICAgICAgIDwhLS0gYWN0aXZhdGVzIHRoZSBidWlsZGluZyBvZiBweXRob24gY29tcG9uZW50cyBhbmQgcmVxdWlyZXMgdGhhdCBweXRob24gYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gLS0+CiAgICAgICAgIDxwcm9maWxlPgogICAgICAgICAgICAgPGlkPmdsdi1weXRob248L2lkPgpAQCAtMjUxLDE4ICs4MCw3IEBACiAgICAgICAgICAgICAgICAgPC9maWxlPgogICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgogICAgICAgICAgICAgPGJ1aWxkPgotCi0gICAgICAgICAgICAgICAgPCEtLSBkb24ndCBleGNsdWRlIGFueSB0ZXN0cyBhcyBweXRob24gaXMgYXNzdW1lZCB0byBiZSBpbnN0YWxsZWQgb24gdGhpcyBzeXN0ZW0gLS0+CiAgICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxweXRob24uaG9tZT4ke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fTwvcHl0aG9uLmhvbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgICAgICAgICAgICAgIDwhLS0gbmVlZCB0byBjcmVhdGUgcHl0aG9uLXJlcG9ydHMgZGlyZWN0b3J5IGF0IHRoaXMgcG9pbnQgb3IgZWxzZSBweXRlc3QgY2FuJ3Qgd3JpdGUgdGhlIHJlcG9ydCB0byBpdCAtLT4KICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KQEAgLTI4MSw3ICs5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhcmdldD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29weSBmaWxlcyBpbiBqeXRob24gZGlyZWN0b3J5IHRvIHRhcmdldC9weSBhbmQgcnVuIHZpcnR1YWwgZW52IHRvIHNhbmRib3ggcHl0aG9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29weSBmaWxlcyBpbiBweXRob24gZGlyZWN0b3J5IHRvIHRhcmdldC9weSBhbmQgcnVuIHZpcnR1YWwgZW52IHRvIHNhbmRib3ggcHl0aG9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbmVlZCB0byAiYWN0aXZhdGUiIHRoZSB2aXJ0dWFsZW52IGJlY2F1c2UgYWxsIGNhbGxzIHRvIHB5dGhvbiBvY2N1cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgZnJvbSBiaW4vIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CkBAIC0yOTMsNTcgKzExMSwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNlZW1zIGxpa2Ugd2UgbmVlZCBhIGZldyBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSBzYW1lIHNvdXJjZS4gYWxsIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IHB5dGhvbi9qeXRob24gc3R1ZmYgZG9lc24ndCBzZWVtIHRvIHdhbnQgdG8gc2hhcmUuIHdlIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3B5dGhvbiBmb3IgYmFzaWMgdGVzdHMgYW5kIHN0dWZmLCAvanl0aG9uIGZvciBqeXRob24gY29tcGlsYXRpb24gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGp5dGhvbiBwbHVnaW4sIC9weXRob24tcGFja2FnZWQgZm9yIGRpc3RyaWJ1dGlvbiB0YXNrcy4gc29tZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0gc2VlbXMgdG8gc3RlbSBmcm9tIHRoZSBweXRob24gbGlmZWN5Y2xlIG5vdCBiaW5kaW5nIHBlcmZlY3RseSB3ZWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgbWF2ZW4gbGlmZWN5Y2xlIChpbnRlZ3JhdGlvbiB0ZXN0cyBzZWVtcyB0byBjYXVzZSB0cm91YmxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhbGx5KS4gbm90ZSB0aGF0IHRoZSBjb21tYW5kcyB0byBpbnN0YWxsIHdoZWVsIGFyZSBsYXJnZWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZXR5IGluIGNhc2Ugc29tZW9uZSBpcyB1c2luZyBhbiBvbGRlciB2ZXJzaW9uIG9mIHZpcnR1YWxlbnYgKHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2Vzbid0IGluc3RhbGwgd2hlZWwgYnkgZGVmYXVsdCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgcHl0aG9uIHN0dWZmIGRvZXNuJ3Qgc2VlbSB0byB3YW50IHRvIHNoYXJlLiB3ZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9weXRob24zIGZvciBiYXNpYyB0ZXN0cyBhbmQgc3R1ZmYgYW5kIC9weXRob24tcGFja2FnZWQgZm9yIGRpc3RyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza3MuIHNvbWUgb2YgdGhlIHByb2JsZW0gc2VlbXMgdG8gc3RlbSBmcm9tIHRoZSBweXRob24gbGlmZWN5Y2xlIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZyBwZXJmZWN0bHkgd2VsbCB0byB0aGUgbWF2ZW4gbGlmZWN5Y2xlIChpbnRlZ3JhdGlvbiB0ZXN0cyBzZWVtcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgdHJvdWJsZXMgc3BlY2lmaWNhbGx5KS4gbm90ZSB0aGF0IHRoZSBjb21tYW5kcyB0byBpbnN0YWxsIHdoZWVsIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VseSBmb3Igc2FmZXR5IGluIGNhc2Ugc29tZW9uZSBpcyB1c2luZyBhbiBvbGRlciB2ZXJzaW9uIG9mIHZpcnR1YWxlbnYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaCBkb2Vzbid0IGluc3RhbGwgd2hlZWwgYnkgZGVmYXVsdCkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9tYWluL2p5dGhvbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9tYWluL3B5dGhvbiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL21haW4vanl0aG9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9weXRob24tcGFja2FnZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9tYWluL2p5dGhvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHByaW50IHZlcnNpb25zIG9mIHB5dGhvbiBhbmQgdmlydHVhbGVudiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlYyBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjIiIGV4ZWN1dGFibGU9InB5dGhvbjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9weXRob24zIiBleGVjdXRhYmxlPSJweXRob24zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItLXZlcnNpb24iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9weXRob24yIiBleGVjdXRhYmxlPSJweXRob24zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMyIgZXhlY3V0YWJsZT0idmlydHVhbGVudiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLS12ZXJzaW9uIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMiIgZXhlY3V0YWJsZT0idmlydHVhbGVudiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLS12ZXJzaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMiIgZXhlY3V0YWJsZT0idmlydHVhbGVudiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLS1weXRob249cHl0aG9uMiBlbnYiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBwaXAgMjAgZG9lc24ndCB3b3JrIHdpdGggcHl0aG9uIDIgaXQgc2VlbXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9weXRob24yIiBleGVjdXRhYmxlPSJlbnYvYmluL3B5dGhvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLW0gcGlwIGluc3RhbGwgcGlwJmd0Oz0xOS4zLjEsJmx0OzIwLjAuMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlYyBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjIiIGV4ZWN1dGFibGU9ImVudi9iaW4vcGlwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSJpbnN0YWxsIHdoZWVsIHJhZGlzaC1iZGQgUHlIYW1jcmVzdCBhZW51bSBpc29kYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMyIgZXhlY3V0YWJsZT0idmlydHVhbGVudiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLS1weXRob249cHl0aG9uMyBlbnYiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9weXRob24zIiBleGVjdXRhYmxlPSJlbnYvYmluL3BpcCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iaW5zdGFsbCB3aGVlbCByYWRpc2gtYmRkIFB5SGFtY3Jlc3QgYWVudW0gaXNvZGF0ZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Imluc3RhbGwgd2hlZWwgcmFkaXNoLWJkZCBQeUhhbWNyZXN0IGFlbnVtIGlzb2RhdGUga2VyYmVyb3Mgc2l4Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9weXRob24tcGFja2FnZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9tYWluL3B5dGhvbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlYyBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbi1wYWNrYWdlZCIgZXhlY3V0YWJsZT0idmlydHVhbGVudiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLS1weXRob249cHl0aG9uMyBlbnYiLz4KQEAgLTM1NiwyMyArMTUyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5uYXRpdmUtcHl0aG9uMi1idWlsZDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZW52L2Jpbi9weXRob24iIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnYga2V5PSJQWVRIT05QQVRIIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gb2RkbHkgdGhlICJidWlsZC1saWIiIG5lZWRzIHRvIGJlIGluIHBsYWNlIG9yIGVsc2UgZG9jcyB3b24ndCBnZW5lcmF0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSJzZXR1cC5weSBidWlsZCAtLWJ1aWxkLWxpYiAke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fS9MaWIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhcmdldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5uYXRpdmUtcHl0aG9uMy1idWlsZDwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgpAQCAtNDE4LDQ4ICsxOTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgcGhhc2UgZG9lc24ndCBoYXZlIGEgcHJlL3Bvc3QgZXZlbnQgbGlrZSBpbnRlZ3JhdGlvbi10ZXN0IGRvZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm5hdGl2ZS1weXRob24yLXRlc3Q8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+aW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD4ke3NraXBUZXN0c308L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2V0dXAucHkgc2VlbXMgdG8gaGF2ZSB0cm91YmxlcyB3aXRoIHRoZSByZWNlbnRseSBwdWJsaXNoZWQgemlwcCAxLjAuMCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlYyBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjIiIGV4ZWN1dGFibGU9ImVudi9iaW4vcHl0aG9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItbSBwaXAgaW5zdGFsbCB6aXBwJmd0Oz0wLjUuMCwmbHQ7MS4wLjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZW52L2Jpbi9weXRob24iIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnYga2V5PSJQWVRIT05QQVRIIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0ic2V0dXAucHkgdGVzdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJhZGlzaCBzZWVtcyB0byBsaWtlIGFsbCBkZXBlbmRlbmNpZXMgaW4gcGxhY2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZW52L2Jpbi9weXRob24iIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnYga2V5PSJQWVRIT05QQVRIIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0ic2V0dXAucHkgaW5zdGFsbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJ1biBmb3IgZ3JhcGhzb24gMy4wIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImVudi9iaW4vcmFkaXNoIiBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OUEFUSCIgdmFsdWU9IiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OSU9FTkNPRElORyIgdmFsdWU9InV0Zi04OnN1cnJvZ2F0ZWVzY2FwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1mIGRvdHMgLWUgLXQgLWIgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMi9yYWRpc2ggJHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL2dyZW1saW4tdGVzdC9mZWF0dXJlcy8gLS11c2VyLWRhdGE9JnF1b3Q7c2VyaWFsaXplcj1hcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2pzb24mcXVvdDsiLz4gPCEtLSAtbm8tbGluZS1qdW1wIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJ1biBmb3IgZ3JhcGhiaW5hcnkgMS4wIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImVudi9iaW4vcmFkaXNoIiBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OUEFUSCIgdmFsdWU9IiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OSU9FTkNPRElORyIgdmFsdWU9InV0Zi04OnN1cnJvZ2F0ZWVzY2FwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1mIGRvdHMgLWUgLXQgLWIgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMi9yYWRpc2ggJHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL2dyZW1saW4tdGVzdC9mZWF0dXJlcy8gLS11c2VyLWRhdGE9JnF1b3Q7c2VyaWFsaXplcj1hcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMCZxdW90OyIvPiA8IS0tIC1uby1saW5lLWp1bXAgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bmF0aXZlLXB5dGhvbjMtdGVzdDwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgpAQCAtNDcxLDggKzIwOCwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImVudi9iaW4vcHl0aG9uIiBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OUEFUSCIgdmFsdWU9IiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iS1JCNV9DT05GSUciIHZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9rZGMva3JiNS5jb25mIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnYga2V5PSJLUkI1Q0NOQU1FIiB2YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0va2RjL3Rlc3QtdGt0LmNjIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0ic2V0dXAucHkgdGVzdCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJhZGlzaCBzZWVtcyB0byBsaWtlIGFsbCBkZXBlbmRlbmNpZXMgaW4gcGxhY2UgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZW52L2Jpbi9weXRob24iIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnYga2V5PSJQWVRIT05QQVRIIiB2YWx1ZT0iIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0ic2V0dXAucHkgaW5zdGFsbCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJ1biBmb3IgZ3JhcGhzb24gMy4wIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImVudi9iaW4vcmFkaXNoIiBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OUEFUSCIgdmFsdWU9IiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OSU9FTkNPRElORyIgdmFsdWU9InV0Zi04OnN1cnJvZ2F0ZWVzY2FwZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1mIGRvdHMgLWUgLXQgLWIgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMy9yYWRpc2ggJHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL2dyZW1saW4tdGVzdC9mZWF0dXJlcy8gLS11c2VyLWRhdGE9JnF1b3Q7c2VyaWFsaXplcj1hcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2pzb24mcXVvdDsiLz4gPCEtLSAtbm8tbGluZS1qdW1wIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJ1biBmb3IgZ3JhcGhiaW5hcnkgMS4wIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImVudi9iaW4vcmFkaXNoIiBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3B5dGhvbjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OUEFUSCIgdmFsdWU9IiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52IGtleT0iUFlUSE9OSU9FTkNPRElORyIgdmFsdWU9InV0Zi04OnN1cnJvZ2F0ZWVzY2FwZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1mIGRvdHMgLWUgLXQgLWIgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcHl0aG9uMy9yYWRpc2ggJHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL2dyZW1saW4tdGVzdC9mZWF0dXJlcy8gLS11c2VyLWRhdGE9JnF1b3Q7c2VyaWFsaXplcj1hcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMCZxdW90OyIvPiA8IS0tIC1uby1saW5lLWp1bXAgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KQEAgLTQ4Myw2ICsyNDIsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdtYXZlbnBsdXMtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyZW1saW4tc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi10ZXN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5PC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncm9vdnktYWxsPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dyb292eS52ZXJzaW9ufTwvdmVyc2lvbj4KQEAgLTQ5OCwyNCArMjY3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWRzbDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZXhlY3V0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByb2plY3RCYXNlRGlyPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtwcm9qZWN0LmJhc2VkaXJ9PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD4ke3Byb2plY3QuYmFzZWRpcn0vZ2x2L2dlbmVyYXRlLmdyb292eTwvc2NyaXB0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdyZW1saW4tc2VydmVyLXN0YXJ0PC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgpAQCAtNTI4LDEwICsyNzksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtza2lwVGVzdHN9PC92YWx1ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHl0aG9uPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmdyZW1saW5TZXJ2ZXJEaXI8L25hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke2dyZW1saW4uc2VydmVyLmRpcn08L3ZhbHVlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CkBAIC01OTYsMTkgKzM0Myw2IEBACiAgICAgICAgICAgICA8L2FjdGl2YXRpb24+CiAgICAgICAgICAgICA8YnVpbGQ+CiAgICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgcHlwaSBkb2Vzbid0IGhhdmUgYSBzdGFnaW5nIGFyZWEgbGlrZSBzb25hdHlwZSBzbyB0aGUgZGVwbG95IHRvIHB5cGkgaXMgZG9uZSBvdXQgb2YgdGhlIG5vcm1hbAotICAgICAgICAgICAgICAgICAgICByZWxlYXNlIGJhbmQuIGl0IGlzIHBlcmZvcm1lZCBhZnRlciBzdWNjZXNzZnVsIFZPVEUgaW4gd2hpY2ggY2FzZSwgdGhlIG1hdmVuIGFydGlmYWN0cyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgbm90IGJlIGRlcGxveWVkIGFnYWluIC0gaGVuY2UgdGhlIHBsdWdpbiBpcyBkaXNhYmxlZC4gZGVwbG95bWVudCB0byBweXBpIHVzZXMgdGhlIGFudHJ1biBwbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgYmVsb3cgd2l0aCB0d2luZSBzbyBkaXNhYmxpbmcgdGhlIHBsdWdpbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBweXBpIGRlcGxveW1lbnQuCi0gICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL0dyZW1saW5KeXRob25TY3JpcHRFbmdpbmUuamF2YSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL0dyZW1saW5KeXRob25TY3JpcHRFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0NzNjNC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9HcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5qc3IyMjM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5Db3JlR3JlbWxpblBsdWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5Db3JlSW1wb3J0czsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5DdXN0b21pemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkdyZW1saW5TY3JpcHRFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuR3JlbWxpblNjcmlwdEVuZ2luZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuSW1wb3J0Q3VzdG9taXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkJ5dGVjb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5weXRob24uanNyMjIzLlB5U2NyaXB0RW5naW5lOwotaW1wb3J0IG9yZy5weXRob24uanNyMjIzLlB5U2NyaXB0RW5naW5lRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnNjcmlwdC5CaW5kaW5nczsKLWltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNjcmlwdC5TaW1wbGVCaW5kaW5nczsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy4xMCwgbm90IHJlcGxhY2VkIC0gc2VlIFRJTktFUlBPUC0yMzE3Ci0gKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgR3JlbWxpbkp5dGhvblNjcmlwdEVuZ2luZSBpbXBsZW1lbnRzIEdyZW1saW5TY3JpcHRFbmdpbmUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBQeVNjcmlwdEVuZ2luZSBweVNjcmlwdEVuZ2luZTsKLQotICAgIHB1YmxpYyBHcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lKGZpbmFsIEN1c3RvbWl6ZXIuLi4gY3VzdG9taXplcnMpIHsKLSAgICAgICAgdGhpcy5weVNjcmlwdEVuZ2luZSA9IChQeVNjcmlwdEVuZ2luZSkgbmV3IFB5U2NyaXB0RW5naW5lRmFjdG9yeSgpLmdldFNjcmlwdEVuZ2luZSgpOwotICAgICAgICBmaW5hbCBMaXN0PEN1c3RvbWl6ZXI+IGxpc3RPZkN1c3RvbWl6ZXJzID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoY3VzdG9taXplcnMpKTsKLQotICAgICAgICAvLyBhbHdheXMgbmVlZCB0aGlzIHBsdWdpbiBmb3IgYSBzY3JpcHRlbmdpbmUgdG8gYmUgIkdyZW1saW4tZW5hYmxlZCIKLSAgICAgICAgQ29yZUdyZW1saW5QbHVnaW4uaW5zdGFuY2UoKS5nZXRDdXN0b21pemVycygiZ3JlbWxpbi1qeXRob24iKS5pZlByZXNlbnQoYyAtPiBsaXN0T2ZDdXN0b21pemVycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjKSkpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8SW1wb3J0Q3VzdG9taXplcj4gaW1wb3J0Q3VzdG9taXplcnMgPSBsaXN0T2ZDdXN0b21pemVycy5zdHJlYW0oKQotICAgICAgICAgICAgICAgIC5maWx0ZXIocCAtPiBwIGluc3RhbmNlb2YgSW1wb3J0Q3VzdG9taXplcikKLSAgICAgICAgICAgICAgICAubWFwKHAgLT4gKEltcG9ydEN1c3RvbWl6ZXIpIHApCi0gICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoSW1wb3J0Q3VzdG9taXplciBpYyA6IGltcG9ydEN1c3RvbWl6ZXJzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDbGFzczw/PiBjIDogaWMuZ2V0Q2xhc3NJbXBvcnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYy5nZXREZWNsYXJpbmdDbGFzcygpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5weVNjcmlwdEVuZ2luZS5ldmFsKCJmcm9tICIgKyBjLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiIGltcG9ydCAiICsgYy5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB5U2NyaXB0RW5naW5lLmV2YWwoImZyb20gIiArIGMuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiArIGMuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGltcG9ydCAiICsgYy5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBpYy5nZXRNZXRob2RJbXBvcnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5weVNjcmlwdEVuZ2luZS5ldmFsKFN5bWJvbEhlbHBlci50b1B5dGhvbihtLmdldE5hbWUoKSkgKyAiID0gIiArIG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiLiIgKyBtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZW51bXMgbmVlZCB0byBpbXBvcnQgYWZ0ZXIgbWV0aG9kcyBmb3Igc29tZSByZWFzb24gb3IgZWxzZSBsYWJlbCBjb21lcyBpbiBhcyBhIFB5UmVmbGVjdGVkRnVuY3Rpb24KLSAgICAgICAgICAgICAgICBmb3IgKEVudW0gZSA6IGljLmdldEVudW1JbXBvcnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5weVNjcmlwdEVuZ2luZS5ldmFsKFN5bWJvbEhlbHBlci50b1B5dGhvbihlLm5hbWUoKSkgKyAiID0gIiArIGUuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiLiIgKyBlLm5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2FkU3VnYXIoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRyYXZlcnNhbC5BZG1pbiBldmFsKGZpbmFsIEJ5dGVjb2RlIGJ5dGVjb2RlLCBmaW5hbCBCaW5kaW5ncyBiaW5kaW5ncywgZmluYWwgU3RyaW5nIHRyYXZlcnNhbFNvdXJjZSkgdGhyb3dzIFNjcmlwdEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRoZXNlIHZhbGlkYXRpb25zIG9jY3VyIGJlZm9yZSBtZXJnaW5nIGluIGJ5dGVjb2RlIGJpbmRpbmdzIHdoaWNoIHdpbGwgb3ZlcnJpZGUgZXhpc3Rpbmcgb25lcy4gbmVlZCB0bwotICAgICAgICAvLyBleHRyYWN0IHRoZSBuYW1lZCB0cmF2ZXJzYWxzb3VyY2UgcHJpb3IgdG8gdGhhdCBoYXBwZW5pbmcgc28gdGhhdCBieXRlY29kZSBiaW5kaW5ncyBjYW4gc2hhcmUgdGhlIHNhbWUKLSAgICAgICAgLy8gbmFtZXNwYWNlIGFzIGdsb2JhbCBiaW5kaW5ncyAoZS5nLiB0cmF2ZXJzYWxzb3VyY2VzIGFuZCBncmFwaHMpLgotICAgICAgICBpZiAodHJhdmVyc2FsU291cmNlLmVxdWFscyhISURERU5fRykpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdHJhdmVyc2FsU291cmNlIGNhbm5vdCBoYXZlIHRoZSBuYW1lICIgKyBISURERU5fRyArICIgLSBpdCBpcyByZXNlcnZlZCIpOwotCi0gICAgICAgIGlmICghYmluZGluZ3MuY29udGFpbnNLZXkodHJhdmVyc2FsU291cmNlKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBiaW5kaW5ncyBhdmFpbGFibGUgdG8gdGhlIFNjcmlwdEVuZ2luZSBkbyBub3QgY29udGFpbiBhIHRyYXZlcnNhbFNvdXJjZSBuYW1lZDogIiArIHRyYXZlcnNhbFNvdXJjZSk7Ci0KLSAgICAgICAgZmluYWwgT2JqZWN0IGIgPSBiaW5kaW5ncy5nZXQodHJhdmVyc2FsU291cmNlKTsKLSAgICAgICAgaWYgKCEoYiBpbnN0YW5jZW9mIFRyYXZlcnNhbFNvdXJjZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRyYXZlcnNhbFNvdXJjZSArICIgaXMgb2YgdHlwZSAiICsgYi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgYW5kIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUcmF2ZXJzYWxTb3VyY2UiKTsKLQotICAgICAgICBmaW5hbCBCaW5kaW5ncyBpbm5lciA9IG5ldyBTaW1wbGVCaW5kaW5ncygpOwotICAgICAgICBpbm5lci5wdXRBbGwoYmluZGluZ3MpOwotICAgICAgICBpbm5lci5wdXRBbGwoYnl0ZWNvZGUuZ2V0QmluZGluZ3MoKSk7Ci0gICAgICAgIGlubmVyLnB1dChISURERU5fRywgYik7Ci0KLSAgICAgICAgcmV0dXJuIChUcmF2ZXJzYWwuQWRtaW4pIHRoaXMuZXZhbChKeXRob25UcmFuc2xhdG9yLm9mKEhJRERFTl9HKS50cmFuc2xhdGUoYnl0ZWNvZGUpLCBpbm5lcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBldmFsKGZpbmFsIFN0cmluZyBzY3JpcHQsIGZpbmFsIFNjcmlwdENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNjcmlwdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLnB5U2NyaXB0RW5naW5lLmV2YWwoc2NyaXB0LCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV2YWwoZmluYWwgUmVhZGVyIHJlYWRlciwgZmluYWwgU2NyaXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHlTY3JpcHRFbmdpbmUuZXZhbChyZWFkZXIsIGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXZhbChmaW5hbCBTdHJpbmcgc2NyaXB0KSB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHlTY3JpcHRFbmdpbmUuZXZhbChzY3JpcHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXZhbChmaW5hbCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHlTY3JpcHRFbmdpbmUuZXZhbChyZWFkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXZhbChmaW5hbCBTdHJpbmcgc2NyaXB0LCBmaW5hbCBCaW5kaW5ncyBuKSB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5weVNjcmlwdEVuZ2luZS5nZXRCaW5kaW5ncyhTY3JpcHRDb250ZXh0LkVOR0lORV9TQ09QRSkucHV0QWxsKG4pOyAvLyBUT0RPOiBncm9vdnkgYW5kIGp5dGhvbiBhY3QgZGlmZmVyZW50Ci0gICAgICAgIHJldHVybiB0aGlzLnB5U2NyaXB0RW5naW5lLmV2YWwoc2NyaXB0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV2YWwoZmluYWwgUmVhZGVyIHJlYWRlciwgZmluYWwgQmluZGluZ3MgbikgdGhyb3dzIFNjcmlwdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucHlTY3JpcHRFbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dEFsbChuKTsgLy8gVE9ETzogZ3Jvb3Z5IGFuZCBqeXRob24gYWN0IGRpZmZlcmVudAotICAgICAgICByZXR1cm4gdGhpcy5weVNjcmlwdEVuZ2luZS5ldmFsKHJlYWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLnB5U2NyaXB0RW5naW5lLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnB5U2NyaXB0RW5naW5lLmdldChrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCaW5kaW5ncyBnZXRCaW5kaW5ncyhmaW5hbCBpbnQgc2NvcGUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHlTY3JpcHRFbmdpbmUuZ2V0QmluZGluZ3Moc2NvcGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdzKGZpbmFsIEJpbmRpbmdzIGJpbmRpbmdzLCBmaW5hbCBpbnQgc2NvcGUpIHsKLSAgICAgICAgdGhpcy5weVNjcmlwdEVuZ2luZS5zZXRCaW5kaW5ncyhiaW5kaW5ncywgc2NvcGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCaW5kaW5ncyBjcmVhdGVCaW5kaW5ncygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHlTY3JpcHRFbmdpbmUuY3JlYXRlQmluZGluZ3MoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2NyaXB0Q29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5weVNjcmlwdEVuZ2luZS5nZXRDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChmaW5hbCBTY3JpcHRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5weVNjcmlwdEVuZ2luZS5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHcmVtbGluU2NyaXB0RW5naW5lRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbmV3IEdyZW1saW5KeXRob25TY3JpcHRFbmdpbmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRTdWdhcigpIHRocm93cyBTY3JpcHRFeGNlcHRpb24gewotICAgICAgICAvLyBhZGQgc3VnYXIgbWV0aG9kcwotICAgICAgICB0aGlzLnB5U2NyaXB0RW5naW5lLmV2YWwoImRlZiBnZXRpdGVtX2J5cGFzcyhzZWxmLCBpbmRleCk6XG4iICsKLSAgICAgICAgICAgICAgICAiICBpZiBpc2luc3RhbmNlKGluZGV4LGludCk6XG4gICAgcmV0dXJuIHNlbGYucmFuZ2UoaW5kZXgsaW5kZXgrMSlcbiIgKwotICAgICAgICAgICAgICAgICIgIGVsaWYgaXNpbnN0YW5jZShpbmRleCxzbGljZSk6XG4gICAgcmV0dXJuIHNlbGYucmFuZ2UoaW5kZXguc3RhcnQsaW5kZXguc3RvcClcbiIgKwotICAgICAgICAgICAgICAgICIgIGVsc2U6XG4gICAgcmV0dXJuIFR5cGVFcnJvcignSW5kZXggbXVzdCBiZSBpbnQgb3Igc2xpY2UnKSIpOwotICAgICAgICB0aGlzLnB5U2NyaXB0RW5naW5lLmV2YWwoR3JhcGhUcmF2ZXJzYWwuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5fX2dldGl0ZW1fXyA9IGdldGl0ZW1fYnlwYXNzIik7Ci0gICAgICAgIHRoaXMucHlTY3JpcHRFbmdpbmUuZXZhbChHcmFwaFRyYXZlcnNhbC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLl9fZ2V0YXR0cl9fID0gbGFtYmRhIHNlbGYsIGtleTogc2VsZi52YWx1ZXMoa2V5KVxuIik7Ci0gICAgICAgIHRoaXMucHlTY3JpcHRFbmdpbmUuZXZhbCgiXG4iICsKLSAgICAgICAgICAgICAgICAiZnJvbSBqYXZhLmxhbmcgaW1wb3J0IExvbmdcbiIgKwotICAgICAgICAgICAgICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkxhbWJkYVxuIiArIC8vIHRvZG86IHJlbW92ZSBvciByZW1vdmUgaW1wb3J0ZWQgc3ViY2xhc3MgbmFtZXM/IChjaG9vc2UpCi0gICAgICAgICAgICAgICAgImZyb20gb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkxhbWJkYSBpbXBvcnQgQWJzdHJhY3RMYW1iZGFcbiIgKwotICAgICAgICAgICAgICAgICJmcm9tIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5mdW5jdGlvbi5MYW1iZGEgaW1wb3J0IFVua25vd25BcmdMYW1iZGFcbiIgKwotICAgICAgICAgICAgICAgICJmcm9tIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5mdW5jdGlvbi5MYW1iZGEgaW1wb3J0IFplcm9BcmdMYW1iZGFcbiIgKwotICAgICAgICAgICAgICAgICJmcm9tIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5mdW5jdGlvbi5MYW1iZGEgaW1wb3J0IE9uZUFyZ0xhbWJkYVxuIiArCi0gICAgICAgICAgICAgICAgImZyb20gb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkxhbWJkYSBpbXBvcnQgVHdvQXJnTGFtYmRhXG5cbiIgKwotCi0gICAgICAgICAgICAgICAgImNsYXNzIEp5dGhvblVua25vd25BcmdMYW1iZGEoVW5rbm93bkFyZ0xhbWJkYSk6XG4iICsKLSAgICAgICAgICAgICAgICAiICBkZWYgX19pbml0X18oc2VsZixmdW5jLHNjcmlwdD0nbm9uZScsbGFuZz0nZ3JlbWxpbi1qeXRob24nKTpcbiIgKwotICAgICAgICAgICAgICAgICIgICAgVW5rbm93bkFyZ0xhbWJkYS5fX2luaXRfXyhzZWxmLCBzY3JpcHQsIGxhbmcsIC0xKVxuIiArCi0gICAgICAgICAgICAgICAgIiAgICBzZWxmLmZ1bmMgPSBmdW5jXG4iICsKLSAgICAgICAgICAgICAgICAiICBkZWYgX19yZXByX18oc2VsZik6XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHJldHVybiBzZWxmLmdldExhbWJkYVNjcmlwdCgpXG5cbiIgKwotCi0gICAgICAgICAgICAgICAgImNsYXNzIEp5dGhvblplcm9BcmdMYW1iZGEoWmVyb0FyZ0xhbWJkYSk6XG4iICsKLSAgICAgICAgICAgICAgICAiICBkZWYgX19pbml0X18oc2VsZixmdW5jLHNjcmlwdD0nbm9uZScsbGFuZz0nZ3JlbWxpbi1qeXRob24nKTpcbiIgKwotICAgICAgICAgICAgICAgICIgICAgWmVyb0FyZ0xhbWJkYS5fX2luaXRfXyhzZWxmLCBzY3JpcHQsIGxhbmcpXG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHNlbGYuZnVuYyA9IGZ1bmNcbiIgKwotICAgICAgICAgICAgICAgICIgIGRlZiBfX3JlcHJfXyhzZWxmKTpcbiIgKwotICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHNlbGYuZ2V0TGFtYmRhU2NyaXB0KClcbiIgKwotICAgICAgICAgICAgICAgICIgIGRlZiBnZXQoc2VsZik6XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHJldHVybiBzZWxmLmZ1bmMoKVxuXG4iICsKLQotICAgICAgICAgICAgICAgICJjbGFzcyBKeXRob25PbmVBcmdMYW1iZGEoT25lQXJnTGFtYmRhKTpcbiIgKwotICAgICAgICAgICAgICAgICIgIGRlZiBfX2luaXRfXyhzZWxmLGZ1bmMsc2NyaXB0PSdub25lJyxsYW5nPSdncmVtbGluLWp5dGhvbicpOlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICBPbmVBcmdMYW1iZGEuX19pbml0X18oc2VsZiwgc2NyaXB0LCBsYW5nKVxuIiArCi0gICAgICAgICAgICAgICAgIiAgICBzZWxmLmZ1bmMgPSBmdW5jXG4iICsKLSAgICAgICAgICAgICAgICAiICBkZWYgX19yZXByX18oc2VsZik6XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHJldHVybiBzZWxmLmdldExhbWJkYVNjcmlwdCgpXG4iICsKLSAgICAgICAgICAgICAgICAiICBkZWYgdGVzdChzZWxmLGEpOlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICByZXR1cm4gc2VsZi5mdW5jKGEpXG4iICsKLSAgICAgICAgICAgICAgICAiICBkZWYgYXBwbHkoc2VsZixhKTpcbiIgKwotICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHNlbGYuZnVuYyhhKVxuIiArCi0gICAgICAgICAgICAgICAgIiAgZGVmIGFjY2VwdChzZWxmLGEpOlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICBzZWxmLmZ1bmMoYSlcbiIgKwotICAgICAgICAgICAgICAgICIgIGRlZiBjb21wYXJlKHNlbGYsYSxiKTpcbiIgKwotICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHNlbGYuZnVuYyhhLGIpXG5cbiIgKwotCi0gICAgICAgICAgICAgICAgImNsYXNzIEp5dGhvblR3b0FyZ0xhbWJkYShUd29BcmdMYW1iZGEpOlxuIiArCi0gICAgICAgICAgICAgICAgIiAgZGVmIF9faW5pdF9fKHNlbGYsZnVuYyxzY3JpcHQ9J25vbmUnLGxhbmc9J2dyZW1saW4tanl0aG9uJyk6XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIFR3b0FyZ0xhbWJkYS5fX2luaXRfXyhzZWxmLCBzY3JpcHQsIGxhbmcpXG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHNlbGYuZnVuYyA9IGZ1bmNcbiIgKwotICAgICAgICAgICAgICAgICIgIGRlZiBfX3JlcHJfXyhzZWxmKTpcbiIgKwotICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHNlbGYuZ2V0TGFtYmRhU2NyaXB0KClcbiIgKwotICAgICAgICAgICAgICAgICIgIGRlZiBhcHBseShzZWxmLGEsYik6XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHJldHVybiBzZWxmLmZ1bmMoYSxiKVxuIiArCi0gICAgICAgICAgICAgICAgIiAgZGVmIGNvbXBhcmUoc2VsZixhLGIpOlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICByZXR1cm4gc2VsZi5mdW5jKGEsYilcbiIKLSAgICAgICAgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9HcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lRmFjdG9yeS5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvR3JlbWxpbkp5dGhvblNjcmlwdEVuZ2luZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjYWZjMS4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9HcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5HcmVtbGluU2NyaXB0RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkdyZW1saW5TY3JpcHRFbmdpbmVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkdyZW1saW5TY3JpcHRFbmdpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5HcmVtbGluOwotaW1wb3J0IG9yZy5weXRob24uanNyMjIzLlB5U2NyaXB0RW5naW5lRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy4xMCwgbm90IHJlcGxhY2VkIC0gc2VlIFRJTktFUlBPUC0yMzE3Ci0gKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgR3JlbWxpbkp5dGhvblNjcmlwdEVuZ2luZUZhY3RvcnkgZXh0ZW5kcyBQeVNjcmlwdEVuZ2luZUZhY3RvcnkgaW1wbGVtZW50cyBHcmVtbGluU2NyaXB0RW5naW5lRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFTUxJTl9KWVRIT04gPSAiZ3JlbWxpbi1qeXRob24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVNTElOX1BZVEhPTiA9ICJncmVtbGluLXB5dGhvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQUlOID0gInBsYWluIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRVhURU5TSU9OUyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInB5Iik7Ci0KLSAgICBwcml2YXRlIEdyZW1saW5TY3JpcHRFbmdpbmVNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVyTWFuYWdlcihmaW5hbCBHcmVtbGluU2NyaXB0RW5naW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmdpbmVOYW1lKCkgewotICAgICAgICByZXR1cm4gR1JFTUxJTl9KWVRIT047Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmdpbmVWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gR3JlbWxpbi52ZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeHRlbnNpb25zKCkgewotICAgICAgICByZXR1cm4gRVhURU5TSU9OUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdSRU1MSU5fSllUSE9OOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2VWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gR3JlbWxpbi52ZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNaW1lVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFBMQUlOKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVzKCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChHUkVNTElOX0pZVEhPTiwgR1JFTUxJTl9QWVRIT04pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyKGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleS5lcXVhbHMoU2NyaXB0RW5naW5lLkVOR0lORSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKFNjcmlwdEVuZ2luZS5FTkdJTkVfVkVSU0lPTikpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEVuZ2luZVZlcnNpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKFNjcmlwdEVuZ2luZS5OQU1FKSkgewotICAgICAgICAgICAgcmV0dXJuIEdSRU1MSU5fSllUSE9OOwotICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoU2NyaXB0RW5naW5lLkxBTkdVQUdFKSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFuZ3VhZ2VOYW1lKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhTY3JpcHRFbmdpbmUuTEFOR1VBR0VfVkVSU0lPTikpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExhbmd1YWdlVmVyc2lvbigpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJhbWV0ZXIoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR3JlbWxpblNjcmlwdEVuZ2luZSBnZXRTY3JpcHRFbmdpbmUoKSB7Ci0gICAgICAgIGZpbmFsIFNldDxDdXN0b21pemVyPiBjdXN0b21pemVycyA9IG5ldyBIYXNoU2V0PD4obWFuYWdlci5nZXRDdXN0b21pemVycyhHUkVNTElOX0pZVEhPTikpOwotICAgICAgICBjdXN0b21pemVycy5hZGRBbGwobWFuYWdlci5nZXRDdXN0b21pemVycyhHUkVNTElOX1BZVEhPTikpOwotCi0gICAgICAgIHJldHVybiAoY3VzdG9taXplcnMuaXNFbXB0eSgpKSA/IG5ldyBHcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lKCkgOgotICAgICAgICAgICAgICAgIG5ldyBHcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lKGN1c3RvbWl6ZXJzLnRvQXJyYXkobmV3IEN1c3RvbWl6ZXJbY3VzdG9taXplcnMuc2l6ZSgpXSkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9KeXRob25UcmFuc2xhdG9yLmphdmEgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9KeXRob25UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzc1MjYuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvSnl0aG9uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5qc3IyMjM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuVHJhdmVyc2FsU3RyYXRlZ3lQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uTGFtYmRhOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjEwLCBub3QgcmVwbGFjZWQgLSBzZWUgVElOS0VSUE9QLTIzMTcKLSAqCi0gKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBmaW5hbCBjbGFzcyBKeXRob25UcmFuc2xhdG9yIGV4dGVuZHMgUHl0aG9uVHJhbnNsYXRvciB7Ci0KLSAgICBwcml2YXRlIEp5dGhvblRyYW5zbGF0b3IoZmluYWwgU3RyaW5nIHRyYXZlcnNhbFNvdXJjZSwgZmluYWwgYm9vbGVhbiBpbXBvcnRTdGF0aWNzKSB7Ci0gICAgICAgIHN1cGVyKHRyYXZlcnNhbFNvdXJjZSwgaW1wb3J0U3RhdGljcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBKeXRob25UcmFuc2xhdG9yIG9mKGZpbmFsIFN0cmluZyB0cmF2ZXJzYWxTb3VyY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKeXRob25UcmFuc2xhdG9yKHRyYXZlcnNhbFNvdXJjZSwgZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAiZ3JlbWxpbi1qeXRob24iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydExhbWJkYVRvU3RyaW5nKGZpbmFsIExhbWJkYSBsYW1iZGEpIHsKLSAgICAgICAgU3RyaW5nIGxhbWJkYVN0cmluZyA9IGxhbWJkYS5nZXRMYW1iZGFTY3JpcHQoKS50cmltKCk7Ci0gICAgICAgIGxhbWJkYVN0cmluZyA9IGxhbWJkYVN0cmluZy5zdGFydHNXaXRoKCJsYW1iZGEiKSA/Ci0gICAgICAgICAgICAgICAgbGFtYmRhU3RyaW5nIDoKLSAgICAgICAgICAgICAgICAibGFtYmRhICIgKyBsYW1iZGFTdHJpbmc7Ci0gICAgICAgIGlmICgwID09IGxhbWJkYS5nZXRMYW1iZGFBcmd1bWVudHMoKSkKLSAgICAgICAgICAgIHJldHVybiAiSnl0aG9uWmVyb0FyZ0xhbWJkYSgiICsgbGFtYmRhU3RyaW5nICsgIikiOwotICAgICAgICBlbHNlIGlmICgxID09IGxhbWJkYS5nZXRMYW1iZGFBcmd1bWVudHMoKSkKLSAgICAgICAgICAgIHJldHVybiAiSnl0aG9uT25lQXJnTGFtYmRhKCIgKyBsYW1iZGFTdHJpbmcgKyAiKSI7Ci0gICAgICAgIGVsc2UgaWYgKDIgPT0gbGFtYmRhLmdldExhbWJkYUFyZ3VtZW50cygpKQotICAgICAgICAgICAgcmV0dXJuICJKeXRob25Ud29BcmdMYW1iZGEoIiArIGxhbWJkYVN0cmluZyArICIpIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuICJKeXRob25Vbmtub3duQXJnTGFtYmRhKCIgKyBsYW1iZGFTdHJpbmcgKyAiKSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlU3ltYm9sKGZpbmFsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgSnl0aG9uIHdlIHNob3VsZCBleHBlY3QgdGhlIEdyZW1saW4gdG8gY29uZm9ybSB0byB0aGUgamF2YSBjbGFzc2VzIHRvIHdoaWNoIHRoZSBlbmdpbmUgaXMKLSAgICAgICAgLy8gYm91bmQgLSB0aGVyZWZvcmUsIHVubGlrZSB0aGUgcHl0aG9uIGVuZ2luZSB3aGljaCBjb252ZXJ0cyBqYXZhIG5hbWVzIHRvIHB5dGhvbiBmcmllbmRseSBvbmVzLCB0aGlzCi0gICAgICAgIC8vIGp5dGhvbiBvbmUgY2FuIGp1c3QgcGFzcyB0aGVtIHRocm91Z2guCi0gICAgICAgIHJldHVybiBtZXRob2ROYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZVRyYXZlcnNhbFN0cmF0ZWd5UHJveHkoZmluYWwgVHJhdmVyc2FsU3RyYXRlZ3lQcm94eSBwcm94eSkgewotICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGp5dGhvbiB3ZSBkb24ndCBuZWVkIGEgdHJhdmVyc2FsIHByb3h5IGhlcmUgLSB3ZSBuZWVkIHRoZSBhY3R1YWwgSlZNIHZlcnNpb24gb2YgdGhlIHN0cmF0ZWd5Ci0gICAgICAgIC8vIHNpbmNlIHRoaXMgc2NyaXB0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gSnl0aG9uLiAKLSAgICAgICAgaWYgKHByb3h5LmdldENvbmZpZ3VyYXRpb24oKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0U3RyYXRlZ3lDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIuaW5zdGFuY2UoKSI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRTdHJhdGVneUNsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIi5jcmVhdGUob3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbigiICsgY29udmVydFRvU3RyaW5nKENvbmZpZ3VyYXRpb25Db252ZXJ0ZXIuZ2V0TWFwKHByb3h5LmdldENvbmZpZ3VyYXRpb24oKSkpICsgIikpIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9QeXRob25UcmFuc2xhdG9yLmphdmEgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9QeXRob25UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGUwZTUuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkJ5dGVjb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuT3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5QOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuU2Fja0Z1bmN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRleHRQOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5UcmF2ZXJzYWxPcHRpb25QYXJlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5UcmF2ZXJzYWxTdHJhdGVneVByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5Db25uZWN0aXZlUDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuT3JQOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXhQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLlN0cmluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLmZ1bmN0aW9uLkxhbWJkYTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuaXRlcmF0b3IuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuaXRlcmF0b3IuSXRlcmF0b3JVdGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjEwLCBub3QgcmVwbGFjZWQgLSBzZWUgVElOS0VSUE9QLTIzMTcKLSAqCi0gKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBQeXRob25UcmFuc2xhdG9yIGltcGxlbWVudHMgVHJhbnNsYXRvci5TY3JpcHRUcmFuc2xhdG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFNURVBfTkFNRVMgPSBTdHJlYW0ub2YoR3JhcGhUcmF2ZXJzYWwuY2xhc3MuZ2V0TWV0aG9kcygpKS5maWx0ZXIobWV0aG9kIC0+IFRyYXZlcnNhbC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKS5tYXAoTWV0aG9kOjpnZXROYW1lKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gTk9fU1RBVElDID0gU3RyZWFtLm9mKFQudmFsdWVzKCksIE9wZXJhdG9yLnZhbHVlcygpKQotICAgICAgICAgICAgLmZsYXRNYXAoYXJnIC0+IEl0ZXJhdG9yVXRpbHMuc3RyZWFtKG5ldyBBcnJheUl0ZXJhdG9yPD4oYXJnKSkpCi0gICAgICAgICAgICAubWFwKGFyZyAtPiAoKEVudW0pIGFyZykubmFtZSgpKQotICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gbmV3IEhhc2hTZXQ8PihDb2xsZWN0aW9ucy5zaW5nbGV0b24oIm5vdCIpKSkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHJhdmVyc2FsU291cmNlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpbXBvcnRTdGF0aWNzOwotCi0gICAgUHl0aG9uVHJhbnNsYXRvcihmaW5hbCBTdHJpbmcgdHJhdmVyc2FsU291cmNlLCBmaW5hbCBib29sZWFuIGltcG9ydFN0YXRpY3MpIHsKLSAgICAgICAgdGhpcy50cmF2ZXJzYWxTb3VyY2UgPSB0cmF2ZXJzYWxTb3VyY2U7Ci0gICAgICAgIHRoaXMuaW1wb3J0U3RhdGljcyA9IGltcG9ydFN0YXRpY3M7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQeXRob25UcmFuc2xhdG9yIG9mKGZpbmFsIFN0cmluZyB0cmF2ZXJzYWxTb3VyY2UsIGZpbmFsIGJvb2xlYW4gaW1wb3J0U3RhdGljcykgewotICAgICAgICByZXR1cm4gbmV3IFB5dGhvblRyYW5zbGF0b3IodHJhdmVyc2FsU291cmNlLCBpbXBvcnRTdGF0aWNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFB5dGhvblRyYW5zbGF0b3Igb2YoZmluYWwgU3RyaW5nIHRyYXZlcnNhbFNvdXJjZSkgewotICAgICAgICByZXR1cm4gbmV3IFB5dGhvblRyYW5zbGF0b3IodHJhdmVyc2FsU291cmNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUcmF2ZXJzYWxTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRyYXZlcnNhbFNvdXJjZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRyYW5zbGF0ZShmaW5hbCBCeXRlY29kZSBieXRlY29kZSkgewotICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFRyYW5zbGF0ZSh0aGlzLnRyYXZlcnNhbFNvdXJjZSwgYnl0ZWNvZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAiZ3JlbWxpbi1weXRob24iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmdGYWN0b3J5LnRyYW5zbGF0b3JTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxUcmFuc2xhdGUoZmluYWwgU3RyaW5nIHN0YXJ0LCBmaW5hbCBCeXRlY29kZSBieXRlY29kZSkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRyYXZlcnNhbFNjcmlwdCA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0YXJ0KTsKLSAgICAgICAgZm9yIChmaW5hbCBCeXRlY29kZS5JbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA6IGJ5dGVjb2RlLmdldEluc3RydWN0aW9ucygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSA9IGluc3RydWN0aW9uLmdldE9wZXJhdG9yKCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBhcmd1bWVudHMgPSBpbnN0cnVjdGlvbi5nZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgdHJhdmVyc2FsU2NyaXB0LmFwcGVuZCgiLiIpLmFwcGVuZChyZXNvbHZlU3ltYm9sKG1ldGhvZE5hbWUpKS5hcHBlbmQoIigpIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChtZXRob2ROYW1lLmVxdWFscygicmFuZ2UiKSAmJiAyID09IGFyZ3VtZW50cy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgaWYgKCgoTnVtYmVyKSBhcmd1bWVudHNbMF0pLmxvbmdWYWx1ZSgpICsgMSA9PSAoKE51bWJlcikgYXJndW1lbnRzWzFdKS5sb25nVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsU2NyaXB0LmFwcGVuZCgiWyIpLmFwcGVuZChhcmd1bWVudHNbMF0pLmFwcGVuZCgiXSIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsU2NyaXB0LmFwcGVuZCgiWyIpLmFwcGVuZChhcmd1bWVudHNbMF0pLmFwcGVuZCgiOiIpLmFwcGVuZChhcmd1bWVudHNbMV0pLmFwcGVuZCgiXSIpOwotICAgICAgICAgICAgZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoImxpbWl0IikgJiYgMSA9PSBhcmd1bWVudHMubGVuZ3RoKQotICAgICAgICAgICAgICAgIHRyYXZlcnNhbFNjcmlwdC5hcHBlbmQoIlswOiIpLmFwcGVuZChhcmd1bWVudHNbMF0pLmFwcGVuZCgiXSIpOwotICAgICAgICAgICAgZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoInZhbHVlcyIpICYmIDEgPT0gYXJndW1lbnRzLmxlbmd0aCAmJiB0cmF2ZXJzYWxTY3JpcHQubGVuZ3RoKCkgPiAzICYmICFTVEVQX05BTUVTLmNvbnRhaW5zKGFyZ3VtZW50c1swXS50b1N0cmluZygpKSkKLSAgICAgICAgICAgICAgICB0cmF2ZXJzYWxTY3JpcHQuYXBwZW5kKCIuIikuYXBwZW5kKGFyZ3VtZW50c1swXSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmF2ZXJzYWxTY3JpcHQuYXBwZW5kKCIuIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSByZXNvbHZlU3ltYm9sKG1ldGhvZE5hbWUpICsgIigiOwotCi0gICAgICAgICAgICAgICAgLy8ganl0aG9uIGhhcyB0cm91YmxlIHdpdGggamF2YSB2YXJhcmdzLi4ud3JhcHBpbmcgaW4gY29sbGVjdGlvbiBzZWVtcyB0byBzb2x2ZSB0aGUgcHJvYmxlbQotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmFyYXJnc0Jld2FyZSA9IGluc3RydWN0aW9uLmdldE9wZXJhdG9yKCkuZXF1YWxzKFRyYXZlcnNhbFNvdXJjZS5TeW1ib2xzLndpdGhTdHJhdGVnaWVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGluc3RydWN0aW9uLmdldE9wZXJhdG9yKCkuZXF1YWxzKFRyYXZlcnNhbFNvdXJjZS5TeW1ib2xzLndpdGhvdXRTdHJhdGVnaWVzKTsKLSAgICAgICAgICAgICAgICBpZiAodmFyYXJnc0Jld2FyZSkgdGVtcCA9IHRlbXAgKyAiWyI7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBvYmplY3QgOiBhcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyBjb252ZXJ0VG9TdHJpbmcob2JqZWN0KSArICIsIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoKCkgLSAxKTsKLQotICAgICAgICAgICAgICAgIGlmICh2YXJhcmdzQmV3YXJlKSB0ZW1wID0gdGVtcCArICJdIjsKLQotICAgICAgICAgICAgICAgIHRyYXZlcnNhbFNjcmlwdC5hcHBlbmQodGVtcCkuYXBwZW5kKCIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGlwIG9mZiBfXy4KLSAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydFN0YXRpY3MgJiYgdHJhdmVyc2FsU2NyaXB0LnN1YnN0cmluZygwLCAzKS5zdGFydHNXaXRoKCJfXy4iKQotICAgICAgICAgICAgICAgICAgICAmJiAhTk9fU1RBVElDLnN0cmVhbSgpLmZpbHRlcihuYW1lIC0+IHRyYXZlcnNhbFNjcmlwdC5zdWJzdHJpbmcoMykuc3RhcnRzV2l0aChyZXNvbHZlU3ltYm9sKG5hbWUpKSkuZmluZEFueSgpLmlzUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJhdmVyc2FsU2NyaXB0LmRlbGV0ZSgwLCAzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhdmVyc2FsU2NyaXB0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoZmluYWwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnl0ZWNvZGUuQmluZGluZykKLSAgICAgICAgICAgIHJldHVybiAoKEJ5dGVjb2RlLkJpbmRpbmcpIG9iamVjdCkudmFyaWFibGUoKTsKLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnl0ZWNvZGUpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFRyYW5zbGF0ZSgiX18iLCAoQnl0ZWNvZGUpIG9iamVjdCk7Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRyYXZlcnNhbCkKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdHJpbmcoKChUcmF2ZXJzYWwpIG9iamVjdCkuYXNBZG1pbigpLmdldEJ5dGVjb2RlKCkpOwotICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIG9iamVjdCkuY29udGFpbnMoIlwiIikgPyAiXCJcIlwiIiArIG9iamVjdCArICJcIlwiXCIiIDogIlwiIiArIG9iamVjdCArICJcIiI7Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNldCkgewotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2V0ID0gbmV3IExpbmtlZEhhc2hTZXQ8PigoKFNldCkgb2JqZWN0KS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgaXRlbSA6IChTZXQpIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHNldC5hZGQoY29udmVydFRvU3RyaW5nKGl0ZW0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAic2V0KCIgKyBzZXQudG9TdHJpbmcoKSArICIpIjsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigoKExpc3QpIG9iamVjdCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGl0ZW0gOiAoTGlzdCkgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoY29udmVydFRvU3RyaW5nKGl0ZW0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsaXN0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1hcCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJ7Iik7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTw/LCA/PiBlbnRyeSA6ICgoTWFwPD8sID8+KSBvYmplY3QpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtYXAuYXBwZW5kKGNvbnZlcnRUb1N0cmluZyhlbnRyeS5nZXRLZXkoKSkpLgotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCI6IikuCi0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQoY29udmVydFRvU3RyaW5nKGVudHJ5LmdldFZhbHVlKCkpKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1hcC5sZW5ndGgoKSA+IDEgPyBtYXAuc3Vic3RyaW5nKDAsIG1hcC5sZW5ndGgoKSAtIDEpICsgIn0iIDogbWFwLmFwcGVuZCgifSIpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHJldHVybiBvYmplY3QgKyAiTCI7Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRyYXZlcnNhbFN0cmF0ZWd5UHJveHkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvbHZlVHJhdmVyc2FsU3RyYXRlZ3lQcm94eSgoVHJhdmVyc2FsU3RyYXRlZ3lQcm94eSkgb2JqZWN0KTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUcmF2ZXJzYWxTdHJhdGVneSkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0cmluZyhuZXcgVHJhdmVyc2FsU3RyYXRlZ3lQcm94eSgoVHJhdmVyc2FsU3RyYXRlZ3kpIG9iamVjdCkpOwotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4pCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0LmVxdWFscyhCb29sZWFuLlRSVUUpID8gIlRydWUiIDogIkZhbHNlIjsKLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gKChDbGFzcykgb2JqZWN0KS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5KQotICAgICAgICAgICAgcmV0dXJuICJDYXJkaW5hbGl0eS4iICsgcmVzb2x2ZVN5bWJvbChvYmplY3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNhY2tGdW5jdGlvbnMuQmFycmllcikKLSAgICAgICAgICAgIHJldHVybiAiQmFycmllci4iICsgcmVzb2x2ZVN5bWJvbChvYmplY3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRyYXZlcnNhbE9wdGlvblBhcmVudC5QaWNrKQotICAgICAgICAgICAgcmV0dXJuICJQaWNrLiIgKyByZXNvbHZlU3ltYm9sKG9iamVjdC50b1N0cmluZygpKTsKLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRW51bSkKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0U3RhdGljKCgoRW51bSkgb2JqZWN0KS5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIuIikgKyByZXNvbHZlU3ltYm9sKG9iamVjdC50b1N0cmluZygpKTsKLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUCkKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0UFRvU3RyaW5nKChQKSBvYmplY3QsIG5ldyBTdHJpbmdCdWlsZGVyKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBWZXJ0ZXgpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdmVydGV4ID0gKFZlcnRleCkgb2JqZWN0OwotICAgICAgICAgICAgICAgIHJldHVybiAiVmVydGV4KCIgKyBjb252ZXJ0VG9TdHJpbmcodmVydGV4LmlkKCkpICsgIiwiICsgY29udmVydFRvU3RyaW5nKHZlcnRleC5sYWJlbCgpKSArICIpIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRnZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEVkZ2UgZWRnZSA9IChFZGdlKSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFZGdlKCIgKyBjb252ZXJ0VG9TdHJpbmcoZWRnZS5pZCgpKSArICIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcoZWRnZS5vdXRWZXJ0ZXgoKSkgKyAiLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKGVkZ2UubGFiZWwoKSkgKyAiLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU3RyaW5nKGVkZ2UuaW5WZXJ0ZXgoKSkgKyAiKSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIFZlcnRleFByb3BlcnR5IHZlcnRleFByb3BlcnR5ID0gKFZlcnRleFByb3BlcnR5KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJWZXJ0ZXhQcm9wZXJ0eSgiICsgY29udmVydFRvU3RyaW5nKHZlcnRleFByb3BlcnR5LmlkKCkpICsgIiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1N0cmluZyh2ZXJ0ZXhQcm9wZXJ0eS5sYWJlbCgpKSArICIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9TdHJpbmcodmVydGV4UHJvcGVydHkudmFsdWUoKSkgKyAiKSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTGFtYmRhKQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRMYW1iZGFUb1N0cmluZygoTGFtYmRhKSBvYmplY3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBvYmplY3QgPyAiTm9uZSIgOiBvYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0U3RhdGljKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmltcG9ydFN0YXRpY3MgPyAiIiA6IG5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGNvbnZlcnRQVG9TdHJpbmcoZmluYWwgUCBwLCBmaW5hbCBTdHJpbmdCdWlsZGVyIGN1cnJlbnQpIHsKLSAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBUZXh0UCkgcmV0dXJuIGNvbnZlcnRUZXh0UFRvU3RyaW5nKChUZXh0UCkgcCwgY3VycmVudCk7Ci0gICAgICAgIGlmIChwIGluc3RhbmNlb2YgQ29ubmVjdGl2ZVApIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8UDw/Pj4gbGlzdCA9ICgoQ29ubmVjdGl2ZVApIHApLmdldFByZWRpY2F0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnZlcnRQVG9TdHJpbmcobGlzdC5nZXQoaSksIGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGlmIChpIDwgbGlzdC5zaXplKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFwcGVuZChwIGluc3RhbmNlb2YgT3JQID8gIi5vcl8oIiA6ICIuYW5kXygiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnQuYXBwZW5kKCIpIik7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgY3VycmVudC5hcHBlbmQoY29udmVydFN0YXRpYygiUC4iKSkuYXBwZW5kKHAuZ2V0QmlQcmVkaWNhdGUoKS50b1N0cmluZygpKS5hcHBlbmQoIigiKS5hcHBlbmQoY29udmVydFRvU3RyaW5nKHAuZ2V0VmFsdWUoKSkpLmFwcGVuZCgiKSIpOwotICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgY29udmVydFRleHRQVG9TdHJpbmcoZmluYWwgVGV4dFAgcCwgZmluYWwgU3RyaW5nQnVpbGRlciBjdXJyZW50KSB7Ci0gICAgICAgIGN1cnJlbnQuYXBwZW5kKGNvbnZlcnRTdGF0aWMoIlRleHRQLiIpKS5hcHBlbmQocC5nZXRCaVByZWRpY2F0ZSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgiKCIpLmFwcGVuZChjb252ZXJ0VG9TdHJpbmcocC5nZXRWYWx1ZSgpKSkuYXBwZW5kKCIpIik7Ci0gICAgICAgIHJldHVybiBjdXJyZW50OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydExhbWJkYVRvU3RyaW5nKGZpbmFsIExhbWJkYSBsYW1iZGEpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhbWJkYVN0cmluZyA9IGxhbWJkYS5nZXRMYW1iZGFTY3JpcHQoKS50cmltKCk7Ci0gICAgICAgIHJldHVybiBsYW1iZGFTdHJpbmcuc3RhcnRzV2l0aCgibGFtYmRhIikgPyBsYW1iZGFTdHJpbmcgOiAibGFtYmRhICIgKyBsYW1iZGFTdHJpbmc7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlU3ltYm9sKGZpbmFsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBTeW1ib2xIZWxwZXIudG9QeXRob24obWV0aG9kTmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlVHJhdmVyc2FsU3RyYXRlZ3lQcm94eShmaW5hbCBUcmF2ZXJzYWxTdHJhdGVneVByb3h5IHByb3h5KSB7Ci0gICAgICAgIGlmIChwcm94eS5nZXRDb25maWd1cmF0aW9uKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuICJUcmF2ZXJzYWxTdHJhdGVneShcIiIgKyBwcm94eS5nZXRTdHJhdGVneUNsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIlwiKSI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAiVHJhdmVyc2FsU3RyYXRlZ3koXCIiICsgcHJveHkuZ2V0U3RyYXRlZ3lDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICJcIiwiICsgY29udmVydFRvU3RyaW5nKENvbmZpZ3VyYXRpb25Db252ZXJ0ZXIuZ2V0TWFwKHByb3h5LmdldENvbmZpZ3VyYXRpb24oKSkpICsgIikiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL1N5bWJvbEhlbHBlci5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvU3ltYm9sSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Y2Q1YjMuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvU3ltYm9sSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHl0aG9uLmpzcjIyMzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuMTAsIG5vdCByZXBsYWNlZCAtIHNlZSBUSU5LRVJQT1AtMjMxNwotICoKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGZpbmFsIGNsYXNzIFN5bWJvbEhlbHBlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IFRPX1BZVEhPTl9NQVAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBGUk9NX1BZVEhPTl9NQVAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBUT19QWVRIT05fTUFQLnB1dCgiZ2xvYmFsIiwgImdsb2JhbF8iKTsKLSAgICAgICAgVE9fUFlUSE9OX01BUC5wdXQoImFzIiwgImFzXyIpOwotICAgICAgICBUT19QWVRIT05fTUFQLnB1dCgiaW4iLCAiaW5fIik7Ci0gICAgICAgIFRPX1BZVEhPTl9NQVAucHV0KCJhbmQiLCAiYW5kXyIpOwotICAgICAgICBUT19QWVRIT05fTUFQLnB1dCgib3IiLCAib3JfIik7Ci0gICAgICAgIFRPX1BZVEhPTl9NQVAucHV0KCJpcyIsICJpc18iKTsKLSAgICAgICAgVE9fUFlUSE9OX01BUC5wdXQoIm5vdCIsICJub3RfIik7Ci0gICAgICAgIFRPX1BZVEhPTl9NQVAucHV0KCJmcm9tIiwgImZyb21fIik7Ci0gICAgICAgIFRPX1BZVEhPTl9NQVAucHV0KCJsaXN0IiwgImxpc3RfIik7Ci0gICAgICAgIFRPX1BZVEhPTl9NQVAucHV0KCJzZXQiLCAic2V0XyIpOwotICAgICAgICBUT19QWVRIT05fTUFQLnB1dCgiYWxsIiwgImFsbF8iKTsKLSAgICAgICAgVE9fUFlUSE9OX01BUC5wdXQoIndpdGgiLCAid2l0aF8iKTsKLSAgICAgICAgLy8KLSAgICAgICAgVE9fUFlUSE9OX01BUC5mb3JFYWNoKChrLCB2KSAtPiBGUk9NX1BZVEhPTl9NQVAucHV0KHYsIGspKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN5bWJvbEhlbHBlcigpIHsKLSAgICAgICAgLy8gc3RhdGljIG1ldGhvZHMgb25seSwgZG8gbm90IGluc3RhbnRpYXRlCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9QeXRob24oZmluYWwgU3RyaW5nIHN5bWJvbCkgewotICAgICAgICByZXR1cm4gVE9fUFlUSE9OX01BUC5nZXRPckRlZmF1bHQoc3ltYm9sLCBzeW1ib2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YShmaW5hbCBTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgIHJldHVybiBGUk9NX1BZVEhPTl9NQVAuZ2V0T3JEZWZhdWx0KHN5bWJvbCwgc3ltYm9sKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvY2xpZW50LnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9jbGllbnQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0M2EwNTQuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9jbGllbnQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLWZyb20gY29uY3VycmVudC5mdXR1cmVzIGltcG9ydCBUaHJlYWRQb29sRXhlY3V0b3IKLQotZnJvbSBzaXgubW92ZXMgaW1wb3J0IHF1ZXVlCi0KLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyIGltcG9ydCBjb25uZWN0aW9uLCBwcm90b2NvbCwgcmVxdWVzdCwgc2VyaWFsaXplcgotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzIGltcG9ydCB0cmF2ZXJzYWwKLQotIyBUaGlzIGlzIHVudGlsIGNvbmN1cnJlbnQuZnV0dXJlcyBiYWNrcG9ydCAzLjEuMCByZWxlYXNlCi10cnk6Ci0gICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IGNwdV9jb3VudAotZXhjZXB0IEltcG9ydEVycm9yOgotICAgICMgc29tZSBwbGF0Zm9ybXMgZG9uJ3QgaGF2ZSBtdWx0aXByb2Nlc3NpbmcKLSAgICBkZWYgY3B1X2NvdW50KCk6Ci0gICAgICAgIHJldHVybiBOb25lCi0KLV9fYXV0aG9yX18gPSAnRGF2aWQgTS4gQnJvd24gKGRhdmVic2hvd0BnbWFpbC5jb20pJwotCi0KLWNsYXNzIENsaWVudDoKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIHRyYXZlcnNhbF9zb3VyY2UsIHByb3RvY29sX2ZhY3Rvcnk9Tm9uZSwKLSAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X2ZhY3Rvcnk9Tm9uZSwgcG9vbF9zaXplPU5vbmUsIG1heF93b3JrZXJzPU5vbmUsCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplcj1Ob25lLCB1c2VybmFtZT0iIiwgcGFzc3dvcmQ9IiIsCi0gICAgICAgICAgICAgICAgIGhlYWRlcnM9Tm9uZSwgc2Vzc2lvbj0iIik6Ci0gICAgICAgIHNlbGYuX3VybCA9IHVybAotICAgICAgICBzZWxmLl9oZWFkZXJzID0gaGVhZGVycwotICAgICAgICBzZWxmLl90cmF2ZXJzYWxfc291cmNlID0gdHJhdmVyc2FsX3NvdXJjZQotICAgICAgICBpZiBtZXNzYWdlX3NlcmlhbGl6ZXIgaXMgTm9uZToKLSAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplciA9IHNlcmlhbGl6ZXIuR3JhcGhTT05TZXJpYWxpemVyc1YzZDAoKQotICAgICAgICBzZWxmLl9tZXNzYWdlX3NlcmlhbGl6ZXIgPSBtZXNzYWdlX3NlcmlhbGl6ZXIKLSAgICAgICAgc2VsZi5fdXNlcm5hbWUgPSB1c2VybmFtZQotICAgICAgICBzZWxmLl9wYXNzd29yZCA9IHBhc3N3b3JkCi0gICAgICAgIHNlbGYuX3Nlc3Npb24gPSBzZXNzaW9uCi0gICAgICAgIHNlbGYuX3Nlc3Npb25FbmFibGVkID0gKHNlc3Npb24gIT0gIiIpCi0gICAgICAgIGlmIHRyYW5zcG9ydF9mYWN0b3J5IGlzIE5vbmU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIudG9ybmFkby50cmFuc3BvcnQgaW1wb3J0ICgKLSAgICAgICAgICAgICAgICAgICAgVG9ybmFkb1RyYW5zcG9ydCkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlBsZWFzZSBpbnN0YWxsIFRvcm5hZG8gb3IgcGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1c3RvbSB0cmFuc3BvcnQgZmFjdG9yeSIpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gbGFtYmRhOiBUb3JuYWRvVHJhbnNwb3J0KCkKLSAgICAgICAgc2VsZi5fdHJhbnNwb3J0X2ZhY3RvcnkgPSB0cmFuc3BvcnRfZmFjdG9yeQotICAgICAgICBpZiBwcm90b2NvbF9mYWN0b3J5IGlzIE5vbmU6Ci0gICAgICAgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gbGFtYmRhOiBwcm90b2NvbC5HcmVtbGluU2VydmVyV1NQcm90b2NvbCgKLSAgICAgICAgICAgICAgICBzZWxmLl9tZXNzYWdlX3NlcmlhbGl6ZXIsCi0gICAgICAgICAgICAgICAgdXNlcm5hbWU9c2VsZi5fdXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgcGFzc3dvcmQ9c2VsZi5fcGFzc3dvcmQpCi0gICAgICAgIHNlbGYuX3Byb3RvY29sX2ZhY3RvcnkgPSBwcm90b2NvbF9mYWN0b3J5Ci0gICAgICAgIGlmIHNlbGYuX3Nlc3Npb25FbmFibGVkOgotICAgICAgICAgICAgaWYgcG9vbF9zaXplIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcG9vbF9zaXplID0gMQotICAgICAgICAgICAgZWxpZiBwb29sX3NpemUgIT0gMToKLSAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlBvb2xTaXplIG11c3QgYmUgMSBvbiBzZXNzaW9uIG1vZGUhIikKLSAgICAgICAgaWYgcG9vbF9zaXplIGlzIE5vbmU6Ci0gICAgICAgICAgICBwb29sX3NpemUgPSA0Ci0gICAgICAgIHNlbGYuX3Bvb2xfc2l6ZSA9IHBvb2xfc2l6ZQotICAgICAgICAjIFRoaXMgaXMgdW50aWwgY29uY3VycmVudC5mdXR1cmVzIGJhY2twb3J0IDMuMS4wIHJlbGVhc2UKLSAgICAgICAgaWYgbWF4X3dvcmtlcnMgaXMgTm9uZToKLSAgICAgICAgICAgICMgSWYgeW91ciBhcHBsaWNhdGlvbiBpcyBvdmVybGFwcGluZyBHcmVtbGluIEkvTyBvbiBtdWx0aXBsZSB0aHJlYWRzCi0gICAgICAgICAgICAjIGNvbnNpZGVyIHBhc3Npbmcga3dhcmcgbWF4X3dvcmtlcnMgPSAoY3B1X2NvdW50KCkgb3IgMSkgKiA1Ci0gICAgICAgICAgICBtYXhfd29ya2VycyA9IHBvb2xfc2l6ZQotICAgICAgICBzZWxmLl9leGVjdXRvciA9IFRocmVhZFBvb2xFeGVjdXRvcihtYXhfd29ya2Vycz1tYXhfd29ya2VycykKLSAgICAgICAgIyBUaHJlYWRzYWZlIHF1ZXVlCi0gICAgICAgIHNlbGYuX3Bvb2wgPSBxdWV1ZS5RdWV1ZSgpCi0gICAgICAgIHNlbGYuX2ZpbGxfcG9vbCgpCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgYXZhaWxhYmxlX3Bvb2xfc2l6ZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX3Bvb2wucXNpemUoKQotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGV4ZWN1dG9yKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fZXhlY3V0b3IKLQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiB0cmF2ZXJzYWxfc291cmNlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fdHJhdmVyc2FsX3NvdXJjZQotCi0gICAgZGVmIF9maWxsX3Bvb2woc2VsZik6Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuX3Bvb2xfc2l6ZSk6Ci0gICAgICAgICAgICBjb25uID0gc2VsZi5fZ2V0X2Nvbm5lY3Rpb24oKQotICAgICAgICAgICAgc2VsZi5fcG9vbC5wdXRfbm93YWl0KGNvbm4pCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuX3Nlc3Npb25FbmFibGVkOgotICAgICAgICAgICAgc2VsZi5fY2xvc2Vfc2Vzc2lvbigpCi0gICAgICAgIHdoaWxlIG5vdCBzZWxmLl9wb29sLmVtcHR5KCk6Ci0gICAgICAgICAgICBjb25uID0gc2VsZi5fcG9vbC5nZXQoVHJ1ZSkKLSAgICAgICAgICAgIGNvbm4uY2xvc2UoKQotICAgICAgICBzZWxmLl9leGVjdXRvci5zaHV0ZG93bigpCi0KLSAgICBkZWYgX2Nsb3NlX3Nlc3Npb24oc2VsZik6Ci0gICAgICAgIG1lc3NhZ2UgPSByZXF1ZXN0LlJlcXVlc3RNZXNzYWdlKAotICAgICAgICAgICAgcHJvY2Vzc29yPSdzZXNzaW9uJywgb3A9J2Nsb3NlJywKLSAgICAgICAgICAgIGFyZ3M9eydzZXNzaW9uJzogc2VsZi5fc2Vzc2lvbn0pCi0gICAgICAgIGNvbm4gPSBzZWxmLl9wb29sLmdldChUcnVlKQotICAgICAgICByZXR1cm4gY29ubi53cml0ZShtZXNzYWdlKS5yZXN1bHQoKQotCi0gICAgZGVmIF9nZXRfY29ubmVjdGlvbihzZWxmKToKLSAgICAgICAgcHJvdG9jb2wgPSBzZWxmLl9wcm90b2NvbF9mYWN0b3J5KCkKLSAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uQ29ubmVjdGlvbigKLSAgICAgICAgICAgIHNlbGYuX3VybCwgc2VsZi5fdHJhdmVyc2FsX3NvdXJjZSwgcHJvdG9jb2wsCi0gICAgICAgICAgICBzZWxmLl90cmFuc3BvcnRfZmFjdG9yeSwgc2VsZi5fZXhlY3V0b3IsIHNlbGYuX3Bvb2wsCi0gICAgICAgICAgICBoZWFkZXJzPXNlbGYuX2hlYWRlcnMpCi0KLSAgICBkZWYgc3VibWl0KHNlbGYsIG1lc3NhZ2UsIGJpbmRpbmdzPU5vbmUpOgotICAgICAgICByZXR1cm4gc2VsZi5zdWJtaXRBc3luYyhtZXNzYWdlLCBiaW5kaW5ncz1iaW5kaW5ncykucmVzdWx0KCkKLQotICAgIGRlZiBzdWJtaXRBc3luYyhzZWxmLCBtZXNzYWdlLCBiaW5kaW5ncz1Ob25lKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCB0cmF2ZXJzYWwuQnl0ZWNvZGUpOgotICAgICAgICAgICAgbWVzc2FnZSA9IHJlcXVlc3QuUmVxdWVzdE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgcHJvY2Vzc29yPSd0cmF2ZXJzYWwnLCBvcD0nYnl0ZWNvZGUnLAotICAgICAgICAgICAgICAgIGFyZ3M9eydncmVtbGluJzogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAnYWxpYXNlcyc6IHsnZyc6IHNlbGYuX3RyYXZlcnNhbF9zb3VyY2V9fSkKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIHN0cik6Ci0gICAgICAgICAgICBtZXNzYWdlID0gcmVxdWVzdC5SZXF1ZXN0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICBwcm9jZXNzb3I9JycsIG9wPSdldmFsJywKLSAgICAgICAgICAgICAgICBhcmdzPXsnZ3JlbWxpbic6IG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgJ2FsaWFzZXMnOiB7J2cnOiBzZWxmLl90cmF2ZXJzYWxfc291cmNlfX0pCi0gICAgICAgICAgICBpZiBiaW5kaW5nczoKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZ3MudXBkYXRlKHsnYmluZGluZ3MnOiBiaW5kaW5nc30pCi0gICAgICAgICAgICBpZiBzZWxmLl9zZXNzaW9uRW5hYmxlZDoKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5fcmVwbGFjZShwcm9jZXNzb3I9J3Nlc3Npb24nKQotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJncy51cGRhdGUoeydzZXNzaW9uJzogc2VsZi5fc2Vzc2lvbn0pCi0gICAgICAgIGNvbm4gPSBzZWxmLl9wb29sLmdldChUcnVlKQotICAgICAgICByZXR1cm4gY29ubi53cml0ZShtZXNzYWdlKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb24ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL2RyaXZlcl9yZW1vdGVfY29ubmVjdGlvbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2YTc2MC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL2RyaXZlcl9yZW1vdGVfY29ubmVjdGlvbi5weQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1mcm9tIGNvbmN1cnJlbnQuZnV0dXJlcyBpbXBvcnQgRnV0dXJlCi0KLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyIGltcG9ydCBjbGllbnQsIHNlcmlhbGl6ZXIKLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLnJlbW90ZV9jb25uZWN0aW9uIGltcG9ydCAoCi0gICAgUmVtb3RlQ29ubmVjdGlvbiwgUmVtb3RlVHJhdmVyc2FsLCBSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cykKLQotX19hdXRob3JfXyA9ICdEYXZpZCBNLiBCcm93biAoZGF2ZWJzaG93QGdtYWlsLmNvbSknCi0KLQotY2xhc3MgRHJpdmVyUmVtb3RlQ29ubmVjdGlvbihSZW1vdGVDb25uZWN0aW9uKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIHRyYXZlcnNhbF9zb3VyY2UsIHByb3RvY29sX2ZhY3Rvcnk9Tm9uZSwKLSAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X2ZhY3Rvcnk9Tm9uZSwgcG9vbF9zaXplPU5vbmUsIG1heF93b3JrZXJzPU5vbmUsCi0gICAgICAgICAgICAgICAgIHVzZXJuYW1lPSIiLCBwYXNzd29yZD0iIiwgbWVzc2FnZV9zZXJpYWxpemVyPU5vbmUsCi0gICAgICAgICAgICAgICAgIGdyYXBoc29uX3JlYWRlcj1Ob25lLCBncmFwaHNvbl93cml0ZXI9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVhZGVycz1Ob25lKToKLSAgICAgICAgaWYgbWVzc2FnZV9zZXJpYWxpemVyIGlzIE5vbmU6Ci0gICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXIgPSBzZXJpYWxpemVyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXIoCi0gICAgICAgICAgICAgICAgcmVhZGVyPWdyYXBoc29uX3JlYWRlciwKLSAgICAgICAgICAgICAgICB3cml0ZXI9Z3JhcGhzb25fd3JpdGVyKQotICAgICAgICBzZWxmLl9jbGllbnQgPSBjbGllbnQuQ2xpZW50KHVybCwgdHJhdmVyc2FsX3NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9mYWN0b3J5PXByb3RvY29sX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X2ZhY3Rvcnk9dHJhbnNwb3J0X2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbF9zaXplPXBvb2xfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfd29ya2Vycz1tYXhfd29ya2VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9bWVzc2FnZV9zZXJpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPXVzZXJuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPXBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycykKLSAgICAgICAgc2VsZi5fdXJsID0gc2VsZi5fY2xpZW50Ll91cmwKLSAgICAgICAgc2VsZi5fdHJhdmVyc2FsX3NvdXJjZSA9IHNlbGYuX2NsaWVudC5fdHJhdmVyc2FsX3NvdXJjZQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzZWxmLl9jbGllbnQuY2xvc2UoKQotCi0gICAgZGVmIHN1Ym1pdChzZWxmLCBieXRlY29kZSk6Ci0gICAgICAgIHJlc3VsdF9zZXQgPSBzZWxmLl9jbGllbnQuc3VibWl0KGJ5dGVjb2RlKQotICAgICAgICByZXN1bHRzID0gcmVzdWx0X3NldC5hbGwoKS5yZXN1bHQoKQotICAgICAgICBzaWRlX2VmZmVjdHMgPSBSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyhyZXN1bHRfc2V0LnJlcXVlc3RfaWQsIHNlbGYuX2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3NldC5zdGF0dXNfYXR0cmlidXRlcykKLSAgICAgICAgcmV0dXJuIFJlbW90ZVRyYXZlcnNhbChpdGVyKHJlc3VsdHMpLCBzaWRlX2VmZmVjdHMpCi0KLSAgICBkZWYgc3VibWl0QXN5bmMoc2VsZiwgYnl0ZWNvZGUpOgotICAgICAgICBmdXR1cmUgPSBGdXR1cmUoKQotICAgICAgICBmdXR1cmVfcmVzdWx0X3NldCA9IHNlbGYuX2NsaWVudC5zdWJtaXRBc3luYyhieXRlY29kZSkKLQotICAgICAgICBkZWYgY2IoZik6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmVzdWx0X3NldCA9IGYucmVzdWx0KCkKLSAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0X3NldC5hbGwoKS5yZXN1bHQoKQotICAgICAgICAgICAgICAgIHNpZGVfZWZmZWN0cyA9IFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKHJlc3VsdF9zZXQucmVxdWVzdF9pZCwgc2VsZi5fY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9zZXQuc3RhdHVzX2F0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgZnV0dXJlLnNldF9yZXN1bHQoUmVtb3RlVHJhdmVyc2FsKGl0ZXIocmVzdWx0cyksIHNpZGVfZWZmZWN0cykpCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKLQotICAgICAgICBmdXR1cmVfcmVzdWx0X3NldC5hZGRfZG9uZV9jYWxsYmFjayhjYikKLSAgICAgICAgcmV0dXJuIGZ1dHVyZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9wcm90b2NvbC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvcHJvdG9jb2wucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGQ0NjcuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9wcm90b2NvbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1pbXBvcnQgYWJjCi1pbXBvcnQgYmFzZTY0Ci0KLWltcG9ydCBzaXgKLQotdHJ5OgotICAgIGltcG9ydCB1anNvbiBhcyBqc29uCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgaW1wb3J0IGpzb24KLQotZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIgaW1wb3J0IHNlcmlhbGl6ZXIsIHJlcXVlc3QKLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLnJlc3VsdHNldCBpbXBvcnQgUmVzdWx0U2V0Ci0KLV9fYXV0aG9yX18gPSAnRGF2aWQgTS4gQnJvd24gKGRhdmVic2hvd0BnbWFpbC5jb20pJwotCi0KLWNsYXNzIEdyZW1saW5TZXJ2ZXJFcnJvcihFeGNlcHRpb24pOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGF0dXMpOgotICAgICAgICBzdXBlcihHcmVtbGluU2VydmVyRXJyb3IsIHNlbGYpLl9faW5pdF9fKCJ7MH06IHsxfSIuZm9ybWF0KHN0YXR1c1siY29kZSJdLCBzdGF0dXNbIm1lc3NhZ2UiXSkpCi0gICAgICAgIHNlbGYuX3N0YXR1c19hdHRyaWJ1dGVzID0gc3RhdHVzWyJhdHRyaWJ1dGVzIl0KLSAgICAgICAgc2VsZi5zdGF0dXNfY29kZSA9IHN0YXR1c1siY29kZSJdCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgc3RhdHVzX2F0dHJpYnV0ZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9zdGF0dXNfYXR0cmlidXRlcwotCi0KLUBzaXguYWRkX21ldGFjbGFzcyhhYmMuQUJDTWV0YSkKLWNsYXNzIEFic3RyYWN0QmFzZVByb3RvY29sOgotCi0gICAgQGFiYy5hYnN0cmFjdG1ldGhvZAotICAgIGRlZiBjb25uZWN0aW9uX21hZGUoc2VsZiwgdHJhbnNwb3J0KToKLSAgICAgICAgc2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0Ci0KLSAgICBAYWJjLmFic3RyYWN0bWV0aG9kCi0gICAgZGVmIGRhdGFfcmVjZWl2ZWQoc2VsZiwgbWVzc2FnZSk6Ci0gICAgICAgIHBhc3MKLQotICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKLSAgICBkZWYgd3JpdGUoc2VsZiwgcmVxdWVzdF9pZCwgcmVxdWVzdF9tZXNzYWdlKToKLSAgICAgICAgcGFzcwotCi0KLWNsYXNzIEdyZW1saW5TZXJ2ZXJXU1Byb3RvY29sKEFic3RyYWN0QmFzZVByb3RvY29sKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX3NlcmlhbGl6ZXIsIHVzZXJuYW1lPScnLCBwYXNzd29yZD0nJyk6Ci0gICAgICAgIHNlbGYuX21lc3NhZ2Vfc2VyaWFsaXplciA9IG1lc3NhZ2Vfc2VyaWFsaXplcgotICAgICAgICBzZWxmLl91c2VybmFtZSA9IHVzZXJuYW1lCi0gICAgICAgIHNlbGYuX3Bhc3N3b3JkID0gcGFzc3dvcmQKLQotICAgIGRlZiBjb25uZWN0aW9uX21hZGUoc2VsZiwgdHJhbnNwb3J0KToKLSAgICAgICAgc3VwZXIoR3JlbWxpblNlcnZlcldTUHJvdG9jb2wsIHNlbGYpLmNvbm5lY3Rpb25fbWFkZSh0cmFuc3BvcnQpCi0KLSAgICBkZWYgd3JpdGUoc2VsZiwgcmVxdWVzdF9pZCwgcmVxdWVzdF9tZXNzYWdlKToKLSAgICAgICAgbWVzc2FnZSA9IHNlbGYuX21lc3NhZ2Vfc2VyaWFsaXplci5zZXJpYWxpemVfbWVzc2FnZSgKLSAgICAgICAgICAgIHJlcXVlc3RfaWQsIHJlcXVlc3RfbWVzc2FnZSkKLSAgICAgICAgc2VsZi5fdHJhbnNwb3J0LndyaXRlKG1lc3NhZ2UpCi0KLSAgICBkZWYgZGF0YV9yZWNlaXZlZChzZWxmLCBtZXNzYWdlLCByZXN1bHRzX2RpY3QpOgotICAgICAgICAjIGlmIEdyZW1saW4gU2VydmVyIGN1dHMgb2ZmIHRoZW4gd2UgZ2V0IGEgTm9uZSBmb3IgdGhlIG1lc3NhZ2UKLSAgICAgICAgaWYgbWVzc2FnZSBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgR3JlbWxpblNlcnZlckVycm9yKHsnY29kZSc6IDUwMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogJ1NlcnZlciBkaXNjb25uZWN0ZWQgLSBwbGVhc2UgdHJ5IHRvIHJlY29ubmVjdCcsICdhdHRyaWJ1dGVzJzoge319KQotCi0gICAgICAgIG1lc3NhZ2UgPSBzZWxmLl9tZXNzYWdlX3NlcmlhbGl6ZXIuZGVzZXJpYWxpemVfbWVzc2FnZShtZXNzYWdlKQotICAgICAgICByZXF1ZXN0X2lkID0gbWVzc2FnZVsncmVxdWVzdElkJ10KLSAgICAgICAgcmVzdWx0X3NldCA9IHJlc3VsdHNfZGljdFtyZXF1ZXN0X2lkXSBpZiByZXF1ZXN0X2lkIGluIHJlc3VsdHNfZGljdCBlbHNlIFJlc3VsdFNldChOb25lLCBOb25lKQotICAgICAgICBzdGF0dXNfY29kZSA9IG1lc3NhZ2VbJ3N0YXR1cyddWydjb2RlJ10KLSAgICAgICAgYWdncmVnYXRlX3RvID0gbWVzc2FnZVsncmVzdWx0J11bJ21ldGEnXS5nZXQoJ2FnZ3JlZ2F0ZVRvJywgJ2xpc3QnKQotICAgICAgICBkYXRhID0gbWVzc2FnZVsncmVzdWx0J11bJ2RhdGEnXQotICAgICAgICByZXN1bHRfc2V0LmFnZ3JlZ2F0ZV90byA9IGFnZ3JlZ2F0ZV90bwotICAgICAgICBpZiBzdGF0dXNfY29kZSA9PSA0MDc6Ci0gICAgICAgICAgICBhdXRoID0gYicnLmpvaW4oW2InXHgwMCcsIHNlbGYuX3VzZXJuYW1lLmVuY29kZSgndXRmLTgnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYidceDAwJywgc2VsZi5fcGFzc3dvcmQuZW5jb2RlKCd1dGYtOCcpXSkKLSAgICAgICAgICAgIHJlcXVlc3RfbWVzc2FnZSA9IHJlcXVlc3QuUmVxdWVzdE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgJ3RyYXZlcnNhbCcsICdhdXRoZW50aWNhdGlvbicsCi0gICAgICAgICAgICAgICAgeydzYXNsJzogYmFzZTY0LmI2NGVuY29kZShhdXRoKS5kZWNvZGUoKX0pCi0gICAgICAgICAgICBzZWxmLndyaXRlKHJlcXVlc3RfaWQsIHJlcXVlc3RfbWVzc2FnZSkKLSAgICAgICAgICAgIGRhdGEgPSBzZWxmLl90cmFuc3BvcnQucmVhZCgpCi0gICAgICAgICAgICAjIEFsbG93IHJlY3Vyc2l2ZSBjYWxsIGZvciBhdXRoCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhX3JlY2VpdmVkKGRhdGEsIHJlc3VsdHNfZGljdCkKLSAgICAgICAgZWxpZiBzdGF0dXNfY29kZSA9PSAyMDQ6Ci0gICAgICAgICAgICByZXN1bHRfc2V0LnN0cmVhbS5wdXRfbm93YWl0KFtdKQotICAgICAgICAgICAgZGVsIHJlc3VsdHNfZGljdFtyZXF1ZXN0X2lkXQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1c19jb2RlCi0gICAgICAgIGVsaWYgc3RhdHVzX2NvZGUgaW4gWzIwMCwgMjA2XToKLSAgICAgICAgICAgIHJlc3VsdF9zZXQuc3RyZWFtLnB1dF9ub3dhaXQoZGF0YSkKLSAgICAgICAgICAgIGlmIHN0YXR1c19jb2RlID09IDIwMDoKLSAgICAgICAgICAgICAgICByZXN1bHRfc2V0LnN0YXR1c19hdHRyaWJ1dGVzID0gbWVzc2FnZVsnc3RhdHVzJ11bJ2F0dHJpYnV0ZXMnXQotICAgICAgICAgICAgICAgIGRlbCByZXN1bHRzX2RpY3RbcmVxdWVzdF9pZF0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXNfY29kZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGVsIHJlc3VsdHNfZGljdFtyZXF1ZXN0X2lkXQotICAgICAgICAgICAgcmFpc2UgR3JlbWxpblNlcnZlckVycm9yKG1lc3NhZ2VbInN0YXR1cyJdKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9yZW1vdGVfY29ubmVjdGlvbi5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvcmVtb3RlX2Nvbm5lY3Rpb24ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNmRlMTQuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9yZW1vdGVfY29ubmVjdGlvbi5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotaW1wb3J0IGFiYwotaW1wb3J0IHNpeAotCi1mcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlciBpbXBvcnQgcmVxdWVzdAotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzIGltcG9ydCB0cmF2ZXJzYWwKLQotX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJwotCi0KLUBzaXguYWRkX21ldGFjbGFzcyhhYmMuQUJDTWV0YSkKLWNsYXNzIFJlbW90ZUNvbm5lY3Rpb24ob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCB0cmF2ZXJzYWxfc291cmNlKToKLSAgICAgICAgc2VsZi5fdXJsID0gdXJsCi0gICAgICAgIHNlbGYuX3RyYXZlcnNhbF9zb3VyY2UgPSB0cmF2ZXJzYWxfc291cmNlCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgdXJsKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fdXJsCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgdHJhdmVyc2FsX3NvdXJjZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX3RyYXZlcnNhbF9zb3VyY2UKLQotICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKLSAgICBkZWYgc3VibWl0KHNlbGYsIGJ5dGVjb2RlKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gInJlbW90ZWNvbm5lY3Rpb25bIiArIHNlbGYuX3VybCArICIsIiArIHNlbGYuX3RyYXZlcnNhbF9zb3VyY2UgKyAiXSIKLQotCi1jbGFzcyBSZW1vdGVUcmF2ZXJzYWwodHJhdmVyc2FsLlRyYXZlcnNhbCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYXZlcnNlcnMsIHNpZGVfZWZmZWN0cyk6Ci0gICAgICAgIHN1cGVyKFJlbW90ZVRyYXZlcnNhbCwgc2VsZikuX19pbml0X18oTm9uZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi50cmF2ZXJzZXJzID0gdHJhdmVyc2VycwotICAgICAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSBzaWRlX2VmZmVjdHMKLQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiBzaWRlX2VmZmVjdHMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9zaWRlX2VmZmVjdHMKLQotICAgIEBzaWRlX2VmZmVjdHMuc2V0dGVyCi0gICAgZGVmIHNpZGVfZWZmZWN0cyhzZWxmLCB2YWwpOgotICAgICAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSB2YWwKLQotCi1jbGFzcyBSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyh0cmF2ZXJzYWwuVHJhdmVyc2FsU2lkZUVmZmVjdHMpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaWRlX2VmZmVjdCwgY2xpZW50LCBzdGF0dXNfYXR0cmlidXRlcyk6Ci0gICAgICAgIHNlbGYuX3NpZGVfZWZmZWN0ID0gc2lkZV9lZmZlY3QKLSAgICAgICAgc2VsZi5fY2xpZW50ID0gY2xpZW50Ci0gICAgICAgIHNlbGYuX2tleXMgPSBzZXQoKQotICAgICAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSB7fQotICAgICAgICBzZWxmLl9jbG9zZWQgPSBGYWxzZQotICAgICAgICBzZWxmLl9zdGF0dXNfYXR0cmlidXRlcyA9IHN0YXR1c19hdHRyaWJ1dGVzCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgc3RhdHVzX2F0dHJpYnV0ZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9zdGF0dXNfYXR0cmlidXRlcwotCi0gICAgZGVmIGtleXMoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBzZWxmLl9jbG9zZWQ6Ci0gICAgICAgICAgICBtZXNzYWdlID0gcmVxdWVzdC5SZXF1ZXN0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAndHJhdmVyc2FsJywgJ2tleXMnLAotICAgICAgICAgICAgICAgIHsnc2lkZUVmZmVjdCc6IHNlbGYuX3NpZGVfZWZmZWN0LAotICAgICAgICAgICAgICAgICdhbGlhc2VzJzogeydnJzogc2VsZi5fY2xpZW50LnRyYXZlcnNhbF9zb3VyY2V9fSkKLSAgICAgICAgICAgIHNlbGYuX2tleXMgPSBzZXQoc2VsZi5fY2xpZW50LnN1Ym1pdChtZXNzYWdlKS5hbGwoKS5yZXN1bHQoKSkKLSAgICAgICAgcmV0dXJuIHNlbGYuX2tleXMKLQotICAgIGRlZiBnZXQoc2VsZiwga2V5KToKLQotICAgICAgICBpZiBub3Qgc2VsZi5fc2lkZV9lZmZlY3RzLmdldChrZXkpOgotICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Nsb3NlZDoKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gcmVxdWVzdC5SZXF1ZXN0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgJ3RyYXZlcnNhbCcsICdnYXRoZXInLAotICAgICAgICAgICAgICAgICAgICB7J3NpZGVFZmZlY3QnOiBzZWxmLl9zaWRlX2VmZmVjdCwgJ3NpZGVFZmZlY3RLZXknOiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAnYWxpYXNlcyc6IHsnZyc6IHNlbGYuX2NsaWVudC50cmF2ZXJzYWxfc291cmNlfX0pCi0gICAgICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuX2FnZ3JlZ2F0ZV9yZXN1bHRzKHNlbGYuX2NsaWVudC5zdWJtaXQobWVzc2FnZSkpCi0gICAgICAgICAgICAgICAgc2VsZi5fc2lkZV9lZmZlY3RzW2tleV0gPSByZXN1bHRzCi0gICAgICAgICAgICAgICAgc2VsZi5fa2V5cy5hZGQoa2V5KQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gc2VsZi5fc2lkZV9lZmZlY3RzW2tleV0KLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgaWYgbm90IHNlbGYuX2Nsb3NlZDoKLSAgICAgICAgICAgIG1lc3NhZ2UgPSByZXF1ZXN0LlJlcXVlc3RNZXNzYWdlKAotICAgICAgICAgICAgICAgICd0cmF2ZXJzYWwnLCAnY2xvc2UnLAotICAgICAgICAgICAgICAgIHsnc2lkZUVmZmVjdCc6IHNlbGYuX3NpZGVfZWZmZWN0LAotICAgICAgICAgICAgICAgICAnYWxpYXNlcyc6IHsnZyc6IHNlbGYuX2NsaWVudC5fdHJhdmVyc2FsX3NvdXJjZX19KQotICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuX2NsaWVudC5zdWJtaXQobWVzc2FnZSkuYWxsKCkucmVzdWx0KCkKLSAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZQotICAgICAgICByZXR1cm4gcmVzdWx0cwotCi0gICAgZGVmIF9hZ2dyZWdhdGVfcmVzdWx0cyhzZWxmLCByZXN1bHRfc2V0KToKLSAgICAgICAgYWdncmVnYXRlcyA9IHsnbGlzdCc6IFtdLCAnc2V0Jzogc2V0KCksICdtYXAnOiB7fSwgJ2J1bGtzZXQnOiB7fSwKLSAgICAgICAgICAgICAgICAgICAgICAnbm9uZSc6IE5vbmV9Ci0gICAgICAgIHJlc3VsdHMgPSBOb25lCi0gICAgICAgIGZvciBtc2cgaW4gcmVzdWx0X3NldDoKLSAgICAgICAgICAgIGlmIHJlc3VsdHMgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBhZ2dyZWdhdGVfdG8gPSByZXN1bHRfc2V0LmFnZ3JlZ2F0ZV90bwotICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBhZ2dyZWdhdGVzLmdldChhZ2dyZWdhdGVfdG8sIFtdKQotICAgICAgICAgICAgIyBvbiBmaXJzdCBtZXNzYWdlLCBnZXQgdGhlIHJpZ2h0IHJlc3VsdCBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB1cGRhdGUgdG8gYSBzdHJ1Y3R1cmUsIHRoZW4gdGhlIGl0ZW0gaXMgdGhlIHJlc3VsdAotICAgICAgICAgICAgaWYgcmVzdWx0cyBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBtc2dbMF0KLSAgICAgICAgICAgICMgdXBkYXRpbmcgYSBtYXAgaXMgZGlmZmVyZW50IHRoYW4gYSBsaXN0IG9yIGEgc2V0Ci0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UocmVzdWx0cywgZGljdCk6Ci0gICAgICAgICAgICAgICAgaWYgYWdncmVnYXRlX3RvID09ICJtYXAiOgotICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBtc2c6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnVwZGF0ZShpdGVtKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG1zZzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaXRlbS5vYmplY3RdID0gaXRlbS5idWxrCi0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UocmVzdWx0cywgc2V0KToKLSAgICAgICAgICAgICAgICByZXN1bHRzLnVwZGF0ZShtc2cpCi0gICAgICAgICAgICAjIGZsYXQgYWRkIGxpc3QgdG8gcmVzdWx0IGxpc3QKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmVzdWx0cyArPSBtc2cKLSAgICAgICAgaWYgcmVzdWx0cyBpcyBOb25lOgotICAgICAgICAgICAgcmVzdWx0cyA9IFtdCi0gICAgICAgIHJldHVybiByZXN1bHRzCi0KLQotY2xhc3MgUmVtb3RlU3RyYXRlZ3kodHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcmVtb3RlX2Nvbm5lY3Rpb24pOgotICAgICAgICB0cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZikKLSAgICAgICAgc2VsZi5yZW1vdGVfY29ubmVjdGlvbiA9IHJlbW90ZV9jb25uZWN0aW9uCi0KLSAgICBkZWYgYXBwbHkoc2VsZiwgdHJhdmVyc2FsKToKLSAgICAgICAgaWYgdHJhdmVyc2FsLnRyYXZlcnNlcnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJlbW90ZV90cmF2ZXJzYWwgPSBzZWxmLnJlbW90ZV9jb25uZWN0aW9uLnN1Ym1pdCh0cmF2ZXJzYWwuYnl0ZWNvZGUpCi0gICAgICAgICAgICB0cmF2ZXJzYWwucmVtb3RlX3Jlc3VsdHMgPSByZW1vdGVfdHJhdmVyc2FsCi0gICAgICAgICAgICB0cmF2ZXJzYWwuc2lkZV9lZmZlY3RzID0gcmVtb3RlX3RyYXZlcnNhbC5zaWRlX2VmZmVjdHMKLSAgICAgICAgICAgIHRyYXZlcnNhbC50cmF2ZXJzZXJzID0gcmVtb3RlX3RyYXZlcnNhbC50cmF2ZXJzZXJzCi0KLSAgICBkZWYgYXBwbHlfYXN5bmMoc2VsZiwgdHJhdmVyc2FsKToKLSAgICAgICAgaWYgdHJhdmVyc2FsLnRyYXZlcnNlcnMgaXMgTm9uZToKLSAgICAgICAgICAgIHRyYXZlcnNhbC5yZW1vdGVfcmVzdWx0cyA9IHNlbGYucmVtb3RlX2Nvbm5lY3Rpb24uc3VibWl0QXN5bmMoCi0gICAgICAgICAgICAgICAgdHJhdmVyc2FsLmJ5dGVjb2RlKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9zZXJpYWxpemVyLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9zZXJpYWxpemVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2I2YjRkLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvc2VyaWFsaXplci5weQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotdHJ5OgotICAgIGltcG9ydCB1anNvbiBhcyBqc29uCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgaW1wb3J0IGpzb24KLWltcG9ydCBzdHJ1Y3QKLWltcG9ydCB1dWlkCi1pbXBvcnQgaW8KLQotZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8gaW1wb3J0IGdyYXBoYmluYXJ5VjEKLWZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvIGltcG9ydCBncmFwaHNvblYyZDAKLWZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvIGltcG9ydCBncmFwaHNvblYzZDAKLQotX19hdXRob3JfXyA9ICdEYXZpZCBNLiBCcm93biAoZGF2ZWJzaG93QGdtYWlsLmNvbSknCi0KLQotY2xhc3MgUHJvY2Vzc29yOgotICAgICIiIkJhc2UgY2xhc3MgZm9yIE9wUHJvY2Vzc29yIHNlcmlhbGl6YXRpb24gc3lzdGVtLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyaXRlcik6Ci0gICAgICAgIHNlbGYuX3dyaXRlciA9IHdyaXRlcgotCi0gICAgZGVmIGdldF9vcF9hcmdzKHNlbGYsIG9wLCBhcmdzKToKLSAgICAgICAgb3BfbWV0aG9kID0gZ2V0YXR0cihzZWxmLCBvcCwgTm9uZSkKLSAgICAgICAgaWYgbm90IG9wX21ldGhvZDoKLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiUHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgb3A6IHt9Ii5mb3JtYXQob3ApKQotICAgICAgICByZXR1cm4gb3BfbWV0aG9kKGFyZ3MpCi0KLQotY2xhc3MgU3RhbmRhcmQoUHJvY2Vzc29yKToKLQotICAgIGRlZiBhdXRoZW50aWNhdGlvbihzZWxmLCBhcmdzKToKLSAgICAgICAgcmV0dXJuIGFyZ3MKLQotICAgIGRlZiBldmFsKHNlbGYsIGFyZ3MpOgotICAgICAgICByZXR1cm4gYXJncwotCi0KLWNsYXNzIFNlc3Npb24oUHJvY2Vzc29yKToKLQotICAgIGRlZiBhdXRoZW50aWNhdGlvbihzZWxmLCBhcmdzKToKLSAgICAgICAgcmV0dXJuIGFyZ3MKLQotICAgIGRlZiBldmFsKHNlbGYsIGFyZ3MpOgotICAgICAgICByZXR1cm4gYXJncwotCi0gICAgZGVmIGNsb3NlKHNlbGYsIGFyZ3MpOgotICAgICAgICByZXR1cm4gYXJncwotCi1jbGFzcyBUcmF2ZXJzYWwoUHJvY2Vzc29yKToKLQotICAgIGRlZiBhdXRoZW50aWNhdGlvbihzZWxmLCBhcmdzKToKLSAgICAgICAgcmV0dXJuIGFyZ3MKLQotICAgIGRlZiBieXRlY29kZShzZWxmLCBhcmdzKToKLSAgICAgICAgZ3JlbWxpbiA9IGFyZ3NbJ2dyZW1saW4nXQotICAgICAgICBhcmdzWydncmVtbGluJ10gPSBzZWxmLl93cml0ZXIudG9EaWN0KGdyZW1saW4pCi0gICAgICAgIGFsaWFzZXMgPSBhcmdzLmdldCgnYWxpYXNlcycsICcnKQotICAgICAgICBpZiBub3QgYWxpYXNlczoKLSAgICAgICAgICAgIGFsaWFzZXMgPSB7J2cnOiAnZyd9Ci0gICAgICAgIGFyZ3NbJ2FsaWFzZXMnXSA9IGFsaWFzZXMKLSAgICAgICAgcmV0dXJuIGFyZ3MKLQotICAgIGRlZiBjbG9zZShzZWxmLCBhcmdzKToKLSAgICAgICAgcmV0dXJuIHNlbGYua2V5cyhhcmdzKQotCi0gICAgZGVmIGdhdGhlcihzZWxmLCBhcmdzKToKLSAgICAgICAgc2lkZV9lZmZlY3QgPSB1dWlkLlVVSUQoYXJnc1snc2lkZUVmZmVjdCddKQotICAgICAgICBhcmdzWydzaWRlRWZmZWN0J10gPSBzZWxmLl93cml0ZXIudG9EaWN0KHNpZGVfZWZmZWN0KQotICAgICAgICBhbGlhc2VzID0gYXJncy5nZXQoJ2FsaWFzZXMnLCAnJykKLSAgICAgICAgaWYgbm90IGFsaWFzZXM6Ci0gICAgICAgICAgICBhbGlhc2VzID0geydnJzogJ2cnfQotICAgICAgICBhcmdzWydhbGlhc2VzJ10gPSBhbGlhc2VzCi0gICAgICAgIHJldHVybiBhcmdzCi0KLSAgICBkZWYga2V5cyhzZWxmLCBhcmdzKToKLSAgICAgICAgc2lkZV9lZmZlY3QgPSB1dWlkLlVVSUQoYXJnc1snc2lkZUVmZmVjdCddKQotICAgICAgICBhcmdzWydzaWRlRWZmZWN0J10gPSBzZWxmLl93cml0ZXIudG9EaWN0KHNpZGVfZWZmZWN0KQotICAgICAgICByZXR1cm4gYXJncwotCi0KLWNsYXNzIEdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXIob2JqZWN0KToKLSAgICAiIiIKLSAgICBNZXNzYWdlIHNlcmlhbGl6ZXIgZm9yIEdyYXBoU09OLiBBbGxvdyB1c2VycyB0byBwYXNzIGN1c3RvbSByZWFkZXIsCi0gICAgd3JpdGVyLCBhbmQgdmVyc2lvbiBrd2FyZ3MgZm9yIGN1c3RvbSBzZXJpYWxpemF0aW9uLiBPdGhlcndpc2UsCi0gICAgdXNlIGN1cnJlbnQgR3JhcGhTT04gdmVyc2lvbiBhcyBkZWZhdWx0LgotICAgICIiIgotCi0gICAgIyBLRUVQIFRSQUNLIE9GIENVUlJFTlQgREVGQVVMVFMKLSAgICBERUZBVUxUX1JFQURFUl9DTEFTUyA9IGdyYXBoc29uVjNkMC5HcmFwaFNPTlJlYWRlcgotICAgIERFRkFVTFRfV1JJVEVSX0NMQVNTID0gZ3JhcGhzb25WM2QwLkdyYXBoU09OV3JpdGVyCi0gICAgREVGQVVMVF9WRVJTSU9OID0gYiJhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2pzb24iCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgcmVhZGVyPU5vbmUsIHdyaXRlcj1Ob25lLCB2ZXJzaW9uPU5vbmUpOgotICAgICAgICBpZiBub3QgdmVyc2lvbjoKLSAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLkRFRkFVTFRfVkVSU0lPTgotICAgICAgICBzZWxmLl92ZXJzaW9uID0gdmVyc2lvbgotICAgICAgICBpZiBub3QgcmVhZGVyOgotICAgICAgICAgICAgcmVhZGVyID0gc2VsZi5ERUZBVUxUX1JFQURFUl9DTEFTUygpCi0gICAgICAgIHNlbGYuX2dyYXBoc29uX3JlYWRlciA9IHJlYWRlcgotICAgICAgICBpZiBub3Qgd3JpdGVyOgotICAgICAgICAgICAgd3JpdGVyID0gc2VsZi5ERUZBVUxUX1dSSVRFUl9DTEFTUygpCi0gICAgICAgIHNlbGYuc3RhbmRhcmQgPSBTdGFuZGFyZCh3cml0ZXIpCi0gICAgICAgIHNlbGYudHJhdmVyc2FsID0gVHJhdmVyc2FsKHdyaXRlcikKLSAgICAgICAgc2VsZi5zZXNzaW9uID0gU2Vzc2lvbih3cml0ZXIpCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgdmVyc2lvbihzZWxmKToKLSAgICAgICAgIiIiUmVhZCBvbmx5IHByb3BlcnR5IiIiCi0gICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCi0KLSAgICBkZWYgZ2V0X3Byb2Nlc3NvcihzZWxmLCBwcm9jZXNzb3IpOgotICAgICAgICBwcm9jZXNzb3IgPSBnZXRhdHRyKHNlbGYsIHByb2Nlc3NvciwgTm9uZSkKLSAgICAgICAgaWYgbm90IHByb2Nlc3NvcjoKLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVW5rbm93biBwcm9jZXNzb3IiKQotICAgICAgICByZXR1cm4gcHJvY2Vzc29yCi0KLSAgICBkZWYgc2VyaWFsaXplX21lc3NhZ2Uoc2VsZiwgcmVxdWVzdF9pZCwgcmVxdWVzdF9tZXNzYWdlKToKLSAgICAgICAgcHJvY2Vzc29yID0gcmVxdWVzdF9tZXNzYWdlLnByb2Nlc3NvcgotICAgICAgICBvcCA9IHJlcXVlc3RfbWVzc2FnZS5vcAotICAgICAgICBhcmdzID0gcmVxdWVzdF9tZXNzYWdlLmFyZ3MKLSAgICAgICAgaWYgbm90IHByb2Nlc3NvcjoKLSAgICAgICAgICAgIHByb2Nlc3Nvcl9vYmogPSBzZWxmLmdldF9wcm9jZXNzb3IoJ3N0YW5kYXJkJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByb2Nlc3Nvcl9vYmogPSBzZWxmLmdldF9wcm9jZXNzb3IocHJvY2Vzc29yKQotICAgICAgICBhcmdzID0gcHJvY2Vzc29yX29iai5nZXRfb3BfYXJncyhvcCwgYXJncykKLSAgICAgICAgbWVzc2FnZSA9IHNlbGYuYnVpbGRfbWVzc2FnZShyZXF1ZXN0X2lkLCBwcm9jZXNzb3IsIG9wLCBhcmdzKQotICAgICAgICByZXR1cm4gbWVzc2FnZQotCi0gICAgZGVmIGJ1aWxkX21lc3NhZ2Uoc2VsZiwgcmVxdWVzdF9pZCwgcHJvY2Vzc29yLCBvcCwgYXJncyk6Ci0gICAgICAgIG1lc3NhZ2UgPSB7Ci0gICAgICAgICAgICAncmVxdWVzdElkJzogeydAdHlwZSc6ICdnOlVVSUQnLCAnQHZhbHVlJzogcmVxdWVzdF9pZH0sCi0gICAgICAgICAgICAncHJvY2Vzc29yJzogcHJvY2Vzc29yLAotICAgICAgICAgICAgJ29wJzogb3AsCi0gICAgICAgICAgICAnYXJncyc6IGFyZ3MKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VsZi5maW5hbGl6ZV9tZXNzYWdlKG1lc3NhZ2UsIGIiXHgyMSIsIHNlbGYudmVyc2lvbikKLQotICAgIGRlZiBmaW5hbGl6ZV9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UsIG1pbWVfbGVuLCBtaW1lX3R5cGUpOgotICAgICAgICBtZXNzYWdlID0ganNvbi5kdW1wcyhtZXNzYWdlKQotICAgICAgICBtZXNzYWdlID0gYicnLmpvaW4oW21pbWVfbGVuLCBtaW1lX3R5cGUsIG1lc3NhZ2UuZW5jb2RlKCd1dGYtOCcpXSkKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UKLQotICAgIGRlZiBkZXNlcmlhbGl6ZV9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgICBtc2cgPSBqc29uLmxvYWRzKG1lc3NhZ2UuZGVjb2RlKCd1dGYtOCcpKQotICAgICAgICByZXR1cm4gc2VsZi5fZ3JhcGhzb25fcmVhZGVyLnRvT2JqZWN0KG1zZykKLQotCi1jbGFzcyBHcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMChHcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyKToKLSAgICAiIiJNZXNzYWdlIHNlcmlhbGl6ZXIgZm9yIEdyYXBoU09OIDIuMCIiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcmVhZGVyID0gZ3JhcGhzb25WMmQwLkdyYXBoU09OUmVhZGVyKCkKLSAgICAgICAgd3JpdGVyID0gZ3JhcGhzb25WMmQwLkdyYXBoU09OV3JpdGVyKCkKLSAgICAgICAgdmVyc2lvbiA9IGIiYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjIuMCtqc29uIgotICAgICAgICBzdXBlcihHcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCwgc2VsZikuX19pbml0X18ocmVhZGVyLCB3cml0ZXIsIHZlcnNpb24pCi0KLQotY2xhc3MgR3JhcGhTT05TZXJpYWxpemVyc1YzZDAoR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplcik6Ci0gICAgIiIiTWVzc2FnZSBzZXJpYWxpemVyIGZvciBHcmFwaFNPTiAzLjAiIiIKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHJlYWRlciA9IGdyYXBoc29uVjNkMC5HcmFwaFNPTlJlYWRlcigpCi0gICAgICAgIHdyaXRlciA9IGdyYXBoc29uVjNkMC5HcmFwaFNPTldyaXRlcigpCi0gICAgICAgIHZlcnNpb24gPSBiImFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjAranNvbiIKLSAgICAgICAgc3VwZXIoR3JhcGhTT05TZXJpYWxpemVyc1YzZDAsIHNlbGYpLl9faW5pdF9fKHJlYWRlciwgd3JpdGVyLCB2ZXJzaW9uKQotCi0KLWNsYXNzIEdyYXBoQmluYXJ5U2VyaWFsaXplcnNWMShvYmplY3QpOgotICAgIERFRkFVTFRfUkVBREVSX0NMQVNTID0gZ3JhcGhiaW5hcnlWMS5HcmFwaEJpbmFyeVJlYWRlcgotICAgIERFRkFVTFRfV1JJVEVSX0NMQVNTID0gZ3JhcGhiaW5hcnlWMS5HcmFwaEJpbmFyeVdyaXRlcgotICAgIERFRkFVTFRfVkVSU0lPTiA9IGIiYXBwbGljYXRpb24vdm5kLmdyYXBoYmluYXJ5LXYxLjAiCi0KLSAgICBtYXhfaW50NjQgPSAweEZGRkZGRkZGRkZGRkZGRkYKLSAgICBoZWFkZXJfc3RydWN0ID0gc3RydWN0LlN0cnVjdCgnPmIzMnNCUVEnKQotICAgIGhlYWRlcl9wYWNrID0gaGVhZGVyX3N0cnVjdC5wYWNrCi0gICAgaW50X3BhY2sgPSBncmFwaGJpbmFyeVYxLmludDMyX3BhY2sKLSAgICBpbnQzMl91bnBhY2sgPSBzdHJ1Y3QuU3RydWN0KCI+aSIpLnVucGFjawotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlYWRlcj1Ob25lLCB3cml0ZXI9Tm9uZSwgdmVyc2lvbj1Ob25lKToKLSAgICAgICAgaWYgbm90IHZlcnNpb246Ci0gICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi5ERUZBVUxUX1ZFUlNJT04KLSAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHZlcnNpb24KLSAgICAgICAgaWYgbm90IHJlYWRlcjoKLSAgICAgICAgICAgIHJlYWRlciA9IHNlbGYuREVGQVVMVF9SRUFERVJfQ0xBU1MoKQotICAgICAgICBzZWxmLl9ncmFwaGJpbmFyeV9yZWFkZXIgPSByZWFkZXIKLSAgICAgICAgaWYgbm90IHdyaXRlcjoKLSAgICAgICAgICAgIHdyaXRlciA9IHNlbGYuREVGQVVMVF9XUklURVJfQ0xBU1MoKQotICAgICAgICBzZWxmLl9ncmFwaGJpbmFyeV93cml0ZXIgPSB3cml0ZXIKLSAgICAgICAgc2VsZi5zdGFuZGFyZCA9IFN0YW5kYXJkKHdyaXRlcikKLSAgICAgICAgc2VsZi50cmF2ZXJzYWwgPSBUcmF2ZXJzYWwod3JpdGVyKQotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIHZlcnNpb24oc2VsZik6Ci0gICAgICAgICIiIlJlYWQgb25seSBwcm9wZXJ0eSIiIgotICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgotCi0gICAgZGVmIGdldF9wcm9jZXNzb3Ioc2VsZiwgcHJvY2Vzc29yKToKLSAgICAgICAgcHJvY2Vzc29yID0gZ2V0YXR0cihzZWxmLCBwcm9jZXNzb3IsIE5vbmUpCi0gICAgICAgIGlmIG5vdCBwcm9jZXNzb3I6Ci0gICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlVua25vd24gcHJvY2Vzc29yIikKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NvcgotCi0gICAgZGVmIHNlcmlhbGl6ZV9tZXNzYWdlKHNlbGYsIHJlcXVlc3RfaWQsIHJlcXVlc3RfbWVzc2FnZSk6Ci0gICAgICAgIHByb2Nlc3NvciA9IHJlcXVlc3RfbWVzc2FnZS5wcm9jZXNzb3IKLSAgICAgICAgb3AgPSByZXF1ZXN0X21lc3NhZ2Uub3AKLSAgICAgICAgYXJncyA9IHJlcXVlc3RfbWVzc2FnZS5hcmdzCi0gICAgICAgIGlmIG5vdCBwcm9jZXNzb3I6Ci0gICAgICAgICAgICBwcm9jZXNzb3Jfb2JqID0gc2VsZi5nZXRfcHJvY2Vzc29yKCdzdGFuZGFyZCcpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcm9jZXNzb3Jfb2JqID0gc2VsZi5nZXRfcHJvY2Vzc29yKHByb2Nlc3NvcikKLSAgICAgICAgYXJncyA9IHByb2Nlc3Nvcl9vYmouZ2V0X29wX2FyZ3Mob3AsIGFyZ3MpCi0gICAgICAgIG1lc3NhZ2UgPSBzZWxmLmJ1aWxkX21lc3NhZ2UocmVxdWVzdF9pZCwgcHJvY2Vzc29yLCBvcCwgYXJncykKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UKLQotICAgIGRlZiBidWlsZF9tZXNzYWdlKHNlbGYsIHJlcXVlc3RfaWQsIHByb2Nlc3Nvciwgb3AsIGFyZ3MpOgotICAgICAgICBtZXNzYWdlID0gewotICAgICAgICAgICAgJ3JlcXVlc3RJZCc6IHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAncHJvY2Vzc29yJzogcHJvY2Vzc29yLAotICAgICAgICAgICAgJ29wJzogb3AsCi0gICAgICAgICAgICAnYXJncyc6IGFyZ3MKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VsZi5maW5hbGl6ZV9tZXNzYWdlKG1lc3NhZ2UsIDB4MjAsIHNlbGYudmVyc2lvbikKLQotICAgIGRlZiBmaW5hbGl6ZV9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UsIG1pbWVfbGVuLCBtaW1lX3R5cGUpOgotICAgICAgICBiYSA9IGJ5dGVhcnJheSgpCi0KLSAgICAgICAgcmVxdWVzdF9pZCA9IHV1aWQuVVVJRChtZXNzYWdlWydyZXF1ZXN0SWQnXSkKLSAgICAgICAgYmEuZXh0ZW5kKHNlbGYuaGVhZGVyX3BhY2sobWltZV9sZW4sIG1pbWVfdHlwZSwgMHg4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3RfaWQuaW50ID4+IDY0KSAmIHNlbGYubWF4X2ludDY0LCByZXF1ZXN0X2lkLmludCAmIHNlbGYubWF4X2ludDY0KSkKLQotICAgICAgICBvcF9ieXRlcyA9IG1lc3NhZ2VbJ29wJ10uZW5jb2RlKCJ1dGYtOCIpCi0gICAgICAgIGJhLmV4dGVuZChzZWxmLmludF9wYWNrKGxlbihvcF9ieXRlcykpKQotICAgICAgICBiYS5leHRlbmQob3BfYnl0ZXMpCi0KLSAgICAgICAgcHJvY2Vzc29yX2J5dGVzID0gbWVzc2FnZVsncHJvY2Vzc29yJ10uZW5jb2RlKCJ1dGYtOCIpCi0gICAgICAgIGJhLmV4dGVuZChzZWxmLmludF9wYWNrKGxlbihwcm9jZXNzb3JfYnl0ZXMpKSkKLSAgICAgICAgYmEuZXh0ZW5kKHByb2Nlc3Nvcl9ieXRlcykKLQotICAgICAgICBhcmdzID0gbWVzc2FnZVsiYXJncyJdCi0gICAgICAgIGJhLmV4dGVuZChzZWxmLmludF9wYWNrKGxlbihhcmdzKSkpCi0gICAgICAgIGZvciBrLCB2IGluIGFyZ3MuaXRlbXMoKToKLSAgICAgICAgICAgIHNlbGYuX2dyYXBoYmluYXJ5X3dyaXRlci50b0RpY3QoaywgYmEpCi0KLSAgICAgICAgICAgICMgcHJvY2Vzc29yX29iai5nZXRfb3BfYXJncyBpbiBzZXJpYWxpemVfbWVzc2FnZSgpIHNlZW1zIHRvIGFscmVhZHkgaGFuZGxlIGJ5dGVjb2RlLiBpbiBweXRob24gMwotICAgICAgICAgICAgIyBiZWNhdXNlIGJ5dGVhcnJheSBpc24ndCBib3VuZCB0byBhIHR5cGUgaW4gZ3JhcGhiaW5hcnkgaXQgZmFsbHMgdGhyb3VnaCB0aGUgd3JpdGVPYmplY3QoKSBhbmQKLSAgICAgICAgICAgICMganVzdCB3b3JrcyBidXQgcHl0aG9uIDIgYnl0ZWFycmF5IGlzIGJvdW5kIHRvIEJ5dGVCdWZmZXJUeXBlIHNvIGl0IHdyaXRlcyBEYXRhVHlwZS5ieXRlYnVmZmVyCi0gICAgICAgICAgICAjIHJhdGhlciB0aGFuIERhdGFUeXBlLmJ5dGVjb2RlIGFuZCB0aGUgc2VydmVyIGdldHMgY29uZnVzZWQuIHNwZWNpYWwgY2FzaW5nIHRoaXMgZm9yIG5vdyB1bnRpbAotICAgICAgICAgICAgIyBpdCBjYW4gYmUgcmVmYWN0b3JlZAotICAgICAgICAgICAgaWYgayA9PSAiZ3JlbWxpbiIgb3IgayA9PSAic2lkZUVmZmVjdCI6Ci0gICAgICAgICAgICAgICAgYmEuZXh0ZW5kKHYpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuX2dyYXBoYmluYXJ5X3dyaXRlci50b0RpY3QodiwgYmEpCi0KLSAgICAgICAgcmV0dXJuIGJ5dGVzKGJhKQotCi0gICAgZGVmIGRlc2VyaWFsaXplX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6Ci0gICAgICAgIGIgPSBpby5CeXRlc0lPKG1lc3NhZ2UpCi0KLSAgICAgICAgYi5yZWFkKDEpICAjIHZlcnNpb24KLQotICAgICAgICByZXF1ZXN0X2lkID0gc3RyKHNlbGYuX2dyYXBoYmluYXJ5X3JlYWRlci50b09iamVjdChiLCBncmFwaGJpbmFyeVYxLkRhdGFUeXBlLnV1aWQpKQotICAgICAgICBzdGF0dXNfY29kZSA9IHNlbGYuaW50MzJfdW5wYWNrKGIucmVhZCg0KSlbMF0KLSAgICAgICAgc3RhdHVzX21zZyA9IHNlbGYuX2dyYXBoYmluYXJ5X3JlYWRlci50b09iamVjdChiLCBncmFwaGJpbmFyeVYxLkRhdGFUeXBlLnN0cmluZykKLSAgICAgICAgc3RhdHVzX2F0dHJzID0gc2VsZi5fZ3JhcGhiaW5hcnlfcmVhZGVyLnRvT2JqZWN0KGIsIGdyYXBoYmluYXJ5VjEuRGF0YVR5cGUubWFwLCBudWxsYWJsZT1GYWxzZSkKLSAgICAgICAgbWV0YV9hdHRycyA9IHNlbGYuX2dyYXBoYmluYXJ5X3JlYWRlci50b09iamVjdChiLCBncmFwaGJpbmFyeVYxLkRhdGFUeXBlLm1hcCwgbnVsbGFibGU9RmFsc2UpCi0gICAgICAgIHJlc3VsdCA9IHNlbGYuX2dyYXBoYmluYXJ5X3JlYWRlci50b09iamVjdChiKQotCi0gICAgICAgIGIuY2xvc2UoKQotCi0gICAgICAgIG1zZyA9IHsncmVxdWVzdElkJzogcmVxdWVzdF9pZCwKLSAgICAgICAgICAgICAgICdzdGF0dXMnOiB7J2NvZGUnOiBzdGF0dXNfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiBzdGF0dXNfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcyc6IHN0YXR1c19hdHRyc30sCi0gICAgICAgICAgICAgICAncmVzdWx0JzogeydtZXRhJzogbWV0YV9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiByZXN1bHR9fQotCi0gICAgICAgIHJldHVybiBtc2cKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9wcm9jZXNzL3N0cmF0ZWdpZXMucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9zdHJhdGVnaWVzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTg4Yjc5Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9wcm9jZXNzL3N0cmF0ZWdpZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJwotCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBUcmF2ZXJzYWxTdHJhdGVneQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgREVDT1JBVElPTiBTVFJBVEVHSUVTICMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotY2xhc3MgQ29ubmVjdGl2ZVN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5Db25uZWN0aXZlU3RyYXRlZ3kiKQotCi0KLWNsYXNzIEVsZW1lbnRJZFN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5FbGVtZW50SWRTdHJhdGVneSIpCi0KLQotIyBFdmVudFN0cmF0ZWd5IGRvZXNuJ3QgbWFrZSBzZW5zZSBvdXRzaWRlIEpWTSB0cmF2ZXJzYWwgbWFjaGluZQotCi1jbGFzcyBIYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbHRlZF90cmF2ZXJzZXJfZmFjdG9yeT1Ob25lKToKLSAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLkhhbHRlZFRyYXZlcnNlclN0cmF0ZWd5IikKLSAgICAgICAgaWYgaGFsdGVkX3RyYXZlcnNlcl9mYWN0b3J5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJoYWx0ZWRUcmF2ZXJzZXJGYWN0b3J5Il0gPSBoYWx0ZWRfdHJhdmVyc2VyX2ZhY3RvcnkKLQotCi1jbGFzcyBPcHRpb25zU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zPU5vbmUpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBjb25maWd1cmF0aW9uPW9wdGlvbnMsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5PcHRpb25zU3RyYXRlZ3kiKQotCi0KLWNsYXNzIFBhcnRpdGlvblN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcGFydGl0aW9uX2tleT1Ob25lLCB3cml0ZV9wYXJ0aXRpb249Tm9uZSwgcmVhZF9wYXJ0aXRpb25zPU5vbmUsIGluY2x1ZGVfbWV0YV9wcm9wZXJ0aWVzPU5vbmUpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uUGFydGl0aW9uU3RyYXRlZ3kiKQotICAgICAgICBpZiBwYXJ0aXRpb25fa2V5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJwYXJ0aXRpb25LZXkiXSA9IHBhcnRpdGlvbl9rZXkKLSAgICAgICAgaWYgd3JpdGVfcGFydGl0aW9uIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJ3cml0ZVBhcnRpdGlvbiJdID0gd3JpdGVfcGFydGl0aW9uCi0gICAgICAgIGlmIHdyaXRlX3BhcnRpdGlvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsicmVhZFBhcnRpdGlvbnMiXSA9IHJlYWRfcGFydGl0aW9ucwotICAgICAgICBpZiBpbmNsdWRlX21ldGFfcHJvcGVydGllcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsiaW5jbHVkZU1ldGFQcm9wZXJ0aWVzIl0gPSBpbmNsdWRlX21ldGFfcHJvcGVydGllcwotCi0KLWNsYXNzIFN1YmdyYXBoU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnRpY2VzPU5vbmUsIGVkZ2VzPU5vbmUsIHZlcnRleF9wcm9wZXJ0aWVzPU5vbmUpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU3ViZ3JhcGhTdHJhdGVneSIpCi0gICAgICAgIGlmIHZlcnRpY2VzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJ2ZXJ0aWNlcyJdID0gdmVydGljZXMKLSAgICAgICAgaWYgZWRnZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bImVkZ2VzIl0gPSBlZGdlcwotICAgICAgICBpZiB2ZXJ0ZXhfcHJvcGVydGllcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsidmVydGV4UHJvcGVydGllcyJdID0gdmVydGV4X3Byb3BlcnRpZXMKLQotCi1jbGFzcyBWZXJ0ZXhQcm9ncmFtU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmFwaF9jb21wdXRlcj1Ob25lLCB3b3JrZXJzPU5vbmUsIHBlcnNpc3Q9Tm9uZSwgcmVzdWx0PU5vbmUsIHZlcnRpY2VzPU5vbmUsIGVkZ2VzPU5vbmUsCi0gICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249Tm9uZSk6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5WZXJ0ZXhQcm9ncmFtU3RyYXRlZ3kiKQotICAgICAgICBpZiBncmFwaF9jb21wdXRlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsiZ3JhcGhDb21wdXRlciJdID0gZ3JhcGhfY29tcHV0ZXIKLSAgICAgICAgaWYgd29ya2VycyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsid29ya2VycyJdID0gd29ya2VycwotICAgICAgICBpZiBwZXJzaXN0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJwZXJzaXN0Il0gPSBwZXJzaXN0Ci0gICAgICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsicmVzdWx0Il0gPSByZXN1bHQKLSAgICAgICAgaWYgdmVydGljZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bInZlcnRpY2VzIl0gPSB2ZXJ0aWNlcwotICAgICAgICBpZiBlZGdlcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsiZWRnZXMiXSA9IGVkZ2VzCi0gICAgICAgIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24udXBkYXRlKGNvbmZpZ3VyYXRpb24pCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEZJTkFMSVpBVElPTiBTVFJBVEVHSUVTICMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzcyBNYXRjaEFsZ29yaXRobVN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hfYWxnb3JpdGhtPU5vbmUpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmZpbmFsaXphdGlvbi5NYXRjaEFsZ29yaXRobVN0cmF0ZWd5IikKLSAgICAgICAgaWYgbWF0Y2hfYWxnb3JpdGhtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJtYXRjaEFsZ29yaXRobSJdID0gbWF0Y2hfYWxnb3JpdGhtCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE9QVElNSVpBVElPTiBTVFJBVEVHSUVTICMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzcyBBZGphY2VudFRvSW5jaWRlbnRTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5BZGphY2VudFRvSW5jaWRlbnRTdHJhdGVneSIpCi0KLQotY2xhc3MgRmlsdGVyUmFua2luZ1N0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkZpbHRlclJhbmtpbmdTdHJhdGVneSIpCi0KLQotY2xhc3MgSWRlbnRpdHlSZW1vdmFsU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uSWRlbnRpdHlSZW1vdmFsU3RyYXRlZ3kiKQotCi0KLWNsYXNzIEluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5IikKLQotCi1jbGFzcyBJbmxpbmVGaWx0ZXJTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5JbmxpbmVGaWx0ZXJTdHJhdGVneSIpCi0KLQotY2xhc3MgTGF6eUJhcnJpZXJTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5MYXp5QmFycmllclN0cmF0ZWd5IikKLQotCi1jbGFzcyBNYXRjaFByZWRpY2F0ZVN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLk1hdGNoUHJlZGljYXRlU3RyYXRlZ3kiKQotCi0KLWNsYXNzIE9yZGVyTGltaXRTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5PcmRlckxpbWl0U3RyYXRlZ3kiKQotCi0KLWNsYXNzIFBhdGhQcm9jZXNzb3JTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5QYXRoUHJvY2Vzc29yU3RyYXRlZ3kiKQotCi0KLWNsYXNzIFBhdGhSZXRyYWN0aW9uU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uUGF0aFJldHJhY3Rpb25TdHJhdGVneSIpCi0KLQotY2xhc3MgQ291bnRTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5Db3VudFN0cmF0ZWd5IikKLQotCi1jbGFzcyBSZXBlYXRVbnJvbGxTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5SZXBlYXRVbnJvbGxTdHJhdGVneSIpCi0KLQotY2xhc3MgR3JhcGhGaWx0ZXJTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5HcmFwaEZpbHRlclN0cmF0ZWd5IikKLQotCi0KLWNsYXNzIEVhcmx5TGltaXRTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5FYXJseUxpbWl0U3RyYXRlZ3kiKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVkVSSUZJQ0FUSU9OIFNUUkFURUdJRVMgIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotY2xhc3MgTGFtYmRhUmVzdHJpY3Rpb25TdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LnZlcmlmaWNhdGlvbi5MYW1iZGFSZXN0cmljdGlvblN0cmF0ZWd5IikKLQotCi1jbGFzcyBSZWFkT25seVN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kudmVyaWZpY2F0aW9uLlJlYWRPbmx5U3RyYXRlZ3kiKQotCi0KLWNsYXNzIEVkZ2VMYWJlbFZlcmlmaWNhdGlvblN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nX3dhcm5pbmc9RmFsc2UsIHRocm93X2V4Y2VwdGlvbj1GYWxzZSk6Ci0gICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kudmVyaWZpY2F0aW9uLkVkZ2VMYWJlbFZlcmlmaWNhdGlvblN0cmF0ZWd5IikKLSAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJsb2dXYXJuaW5nIl0gPSBsb2dfd2FybmluZwotICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bInRocm93RXhjZXB0aW9uIl0gPSB0aHJvd19leGNlcHRpb24KLQotCi1jbGFzcyBSZXNlcnZlZEtleXNWZXJpZmljYXRpb25TdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ193YXJuaW5nPUZhbHNlLCB0aHJvd19leGNlcHRpb249RmFsc2UsIGtleXM9WyJpZCIsICJsYWJlbCJdKToKLSAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS52ZXJpZmljYXRpb24uUmVzZXJ2ZWRLZXlzVmVyaWZpY2F0aW9uU3RyYXRlZ3kiKQotICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bImxvZ1dhcm5pbmciXSA9IGxvZ193YXJuaW5nCi0gICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsidGhyb3dFeGNlcHRpb24iXSA9IHRocm93X2V4Y2VwdGlvbgotICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bImtleXMiXSA9IGtleXMKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9wcm9jZXNzL3RyYXZlcnNhbC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9wcm9jZXNzL3RyYXZlcnNhbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwZDEyMS4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy90cmF2ZXJzYWwucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaW1wb3J0IGNvcHkKLWZyb20gYWVudW0gaW1wb3J0IEVudW0KLWZyb20gLi4gaW1wb3J0IHN0YXRpY3MKLWZyb20gLi5zdGF0aWNzIGltcG9ydCBsb25nCi0KLWNsYXNzIFRyYXZlcnNhbChvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmFwaCwgdHJhdmVyc2FsX3N0cmF0ZWdpZXMsIGJ5dGVjb2RlKToKLSAgICAgICAgc2VsZi5ncmFwaCA9IGdyYXBoCi0gICAgICAgIHNlbGYudHJhdmVyc2FsX3N0cmF0ZWdpZXMgPSB0cmF2ZXJzYWxfc3RyYXRlZ2llcwotICAgICAgICBzZWxmLmJ5dGVjb2RlID0gYnl0ZWNvZGUKLSAgICAgICAgc2VsZi5zaWRlX2VmZmVjdHMgPSBUcmF2ZXJzYWxTaWRlRWZmZWN0cygpCi0gICAgICAgIHNlbGYudHJhdmVyc2VycyA9IE5vbmUKLSAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IE5vbmUKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHN0cihzZWxmLmJ5dGVjb2RlKQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmJ5dGVjb2RlID09IG90aGVyLmJ5dGVjb2RlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi50cmF2ZXJzZXJzIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzLmFwcGx5X3N0cmF0ZWdpZXMoc2VsZikKLSAgICAgICAgaWYgc2VsZi5sYXN0X3RyYXZlcnNlciBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IG5leHQoc2VsZi50cmF2ZXJzZXJzKQotICAgICAgICBvYmplY3QgPSBzZWxmLmxhc3RfdHJhdmVyc2VyLm9iamVjdAotICAgICAgICBzZWxmLmxhc3RfdHJhdmVyc2VyLmJ1bGsgPSBzZWxmLmxhc3RfdHJhdmVyc2VyLmJ1bGsgLSAxCi0gICAgICAgIGlmIHNlbGYubGFzdF90cmF2ZXJzZXIuYnVsayA8PSAwOgotICAgICAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IE5vbmUKLSAgICAgICAgcmV0dXJuIG9iamVjdAotCi0gICAgZGVmIHRvTGlzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIGxpc3QoaXRlcihzZWxmKSkKLQotICAgIGRlZiB0b1NldChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNldChpdGVyKHNlbGYpKQotCi0gICAgZGVmIGl0ZXJhdGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYnl0ZWNvZGUuYWRkX3N0ZXAoIm5vbmUiKQotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgdHJ5OiBzZWxmLm5leHRUcmF2ZXJzZXIoKQotICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiBzZWxmCi0KLSAgICBkZWYgbmV4dFRyYXZlcnNlcihzZWxmKToKLSAgICAgICAgaWYgc2VsZi50cmF2ZXJzZXJzIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzLmFwcGx5X3N0cmF0ZWdpZXMoc2VsZikKLSAgICAgICAgaWYgc2VsZi5sYXN0X3RyYXZlcnNlciBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIG5leHQoc2VsZi50cmF2ZXJzZXJzKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGVtcCA9IHNlbGYubGFzdF90cmF2ZXJzZXIKLSAgICAgICAgICAgIHNlbGYubGFzdF90cmF2ZXJzZXIgPSBOb25lCi0gICAgICAgICAgICByZXR1cm4gdGVtcAotCi0gICAgZGVmIGhhc05leHQoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYudHJhdmVyc2VycyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcy5hcHBseV9zdHJhdGVnaWVzKHNlbGYpCi0gICAgICAgIGlmIHNlbGYubGFzdF90cmF2ZXJzZXIgaXMgTm9uZToKLSAgICAgICAgICAgIHRyeTogc2VsZi5sYXN0X3RyYXZlcnNlciA9IG5leHQoc2VsZi50cmF2ZXJzZXJzKQotICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gbm90KHNlbGYubGFzdF90cmF2ZXJzZXIgaXMgTm9uZSkgYW5kIHNlbGYubGFzdF90cmF2ZXJzZXIuYnVsayA+IDAKLQotICAgIGRlZiBuZXh0KHNlbGYsIGFtb3VudD1Ob25lKToKLSAgICAgICAgaWYgYW1vdW50IGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX25leHRfXygpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjb3VudCA9IDAKLSAgICAgICAgICAgIHRlbXBMaXN0ID0gW10KLSAgICAgICAgICAgIHdoaWxlIGNvdW50IDwgYW1vdW50OgotICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCi0gICAgICAgICAgICAgICAgdHJ5OiB0ZW1wID0gc2VsZi5fX25leHRfXygpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiB0ZW1wTGlzdAotICAgICAgICAgICAgICAgIHRlbXBMaXN0LmFwcGVuZCh0ZW1wKQotICAgICAgICAgICAgcmV0dXJuIHRlbXBMaXN0Ci0KLSAgICBkZWYgcHJvbWlzZShzZWxmLCBjYj1Ob25lKToKLSAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcy5hcHBseV9hc3luY19zdHJhdGVnaWVzKHNlbGYpCi0gICAgICAgIGZ1dHVyZV90cmF2ZXJzYWwgPSBzZWxmLnJlbW90ZV9yZXN1bHRzCi0gICAgICAgIGZ1dHVyZSA9IHR5cGUoZnV0dXJlX3RyYXZlcnNhbCkoKQotICAgICAgICBkZWYgcHJvY2VzcyhmKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB0cmF2ZXJzYWwgPSBmLnJlc3VsdCgpCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi50cmF2ZXJzZXJzID0gaXRlcih0cmF2ZXJzYWwudHJhdmVyc2VycykKLSAgICAgICAgICAgICAgICBzZWxmLnNpZGVfZWZmZWN0cyA9IHRyYXZlcnNhbC5zaWRlX2VmZmVjdHMKLSAgICAgICAgICAgICAgICBpZiBjYjoKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2Ioc2VsZikKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZS5zZXRfcmVzdWx0KHJlc3VsdCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBmdXR1cmUuc2V0X3Jlc3VsdChzZWxmKQotICAgICAgICBmdXR1cmVfdHJhdmVyc2FsLmFkZF9kb25lX2NhbGxiYWNrKHByb2Nlc3MpCi0gICAgICAgIHJldHVybiBmdXR1cmUKLQotCi1CYXJyaWVyID0gRW51bSgnQmFycmllcicsICcgbm9ybVNhY2snKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ25vcm1TYWNrJywgQmFycmllci5ub3JtU2FjaykKLQotQ2FyZGluYWxpdHkgPSBFbnVtKCdDYXJkaW5hbGl0eScsICcgbGlzdF8gc2V0XyBzaW5nbGUnKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3NpbmdsZScsIENhcmRpbmFsaXR5LnNpbmdsZSkKLXN0YXRpY3MuYWRkX3N0YXRpYygnbGlzdF8nLCBDYXJkaW5hbGl0eS5saXN0XykKLXN0YXRpY3MuYWRkX3N0YXRpYygnc2V0XycsIENhcmRpbmFsaXR5LnNldF8pCi0KLUNvbHVtbiA9IEVudW0oJ0NvbHVtbicsICcga2V5cyB2YWx1ZXMnKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2tleXMnLCBDb2x1bW4ua2V5cykKLXN0YXRpY3MuYWRkX3N0YXRpYygndmFsdWVzJywgQ29sdW1uLnZhbHVlcykKLQotRGlyZWN0aW9uID0gRW51bSgnRGlyZWN0aW9uJywgJyBCT1RIIElOIE9VVCcpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnT1VUJywgRGlyZWN0aW9uLk9VVCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnSU4nLCBEaXJlY3Rpb24uSU4pCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ0JPVEgnLCBEaXJlY3Rpb24uQk9USCkKLQotR3JhcGhTT05WZXJzaW9uID0gRW51bSgnR3JhcGhTT05WZXJzaW9uJywgJyBWMV8wIFYyXzAgVjNfMCcpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnVjFfMCcsIEdyYXBoU09OVmVyc2lvbi5WMV8wKQotc3RhdGljcy5hZGRfc3RhdGljKCdWMl8wJywgR3JhcGhTT05WZXJzaW9uLlYyXzApCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ1YzXzAnLCBHcmFwaFNPTlZlcnNpb24uVjNfMCkKLQotR3J5b1ZlcnNpb24gPSBFbnVtKCdHcnlvVmVyc2lvbicsICcgVjFfMCBWM18wJykKLQotc3RhdGljcy5hZGRfc3RhdGljKCdWMV8wJywgR3J5b1ZlcnNpb24uVjFfMCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnVjNfMCcsIEdyeW9WZXJzaW9uLlYzXzApCi0KLU9yZGVyID0gRW51bSgnT3JkZXInLCAnIGFzYyBkZWNyIGRlc2MgaW5jciBzaHVmZmxlJykKLQotc3RhdGljcy5hZGRfc3RhdGljKCdpbmNyJywgT3JkZXIuaW5jcikKLXN0YXRpY3MuYWRkX3N0YXRpYygnZGVjcicsIE9yZGVyLmRlY3IpCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3NodWZmbGUnLCBPcmRlci5zaHVmZmxlKQotc3RhdGljcy5hZGRfc3RhdGljKCdhc2MnLCBPcmRlci5hc2MpCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2Rlc2MnLCBPcmRlci5kZXNjKQotCi1QaWNrID0gRW51bSgnUGljaycsICcgYW55IG5vbmUnKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2FueScsIFBpY2suYW55KQotc3RhdGljcy5hZGRfc3RhdGljKCdub25lJywgUGljay5ub25lKQotCi1Qb3AgPSBFbnVtKCdQb3AnLCAnIGFsbF8gZmlyc3QgbGFzdCBtaXhlZCcpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnZmlyc3QnLCBQb3AuZmlyc3QpCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2xhc3QnLCBQb3AubGFzdCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnYWxsXycsIFBvcC5hbGxfKQotc3RhdGljcy5hZGRfc3RhdGljKCdtaXhlZCcsIFBvcC5taXhlZCkKLQotU2NvcGUgPSBFbnVtKCdTY29wZScsICcgZ2xvYmFsXyBsb2NhbCcpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnZ2xvYmFsXycsIFNjb3BlLmdsb2JhbF8pCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2xvY2FsJywgU2NvcGUubG9jYWwpCi0KLQotVCA9IEVudW0oJ1QnLCAnIGlkIGlkXyBrZXkgbGFiZWwgdmFsdWUnKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2lkJywgVC5pZCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnbGFiZWwnLCBULmxhYmVsKQotc3RhdGljcy5hZGRfc3RhdGljKCdpZF8nLCBULmlkXykKLXN0YXRpY3MuYWRkX3N0YXRpYygna2V5JywgVC5rZXkpCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3ZhbHVlJywgVC52YWx1ZSkKLQotCi1PcGVyYXRvciA9IEVudW0oJ09wZXJhdG9yJywgJyBhZGRBbGwgYW5kXyBhc3NpZ24gZGl2IG1heCBtYXhfIG1pbiBtaW5fIG1pbnVzIG11bHQgb3JfIHN1bSBzdW1fIHN1bUxvbmcnKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ3N1bV8nLCBPcGVyYXRvci5zdW1fKQotc3RhdGljcy5hZGRfc3RhdGljKCdzdW0nLCBPcGVyYXRvci5zdW1fKQotc3RhdGljcy5hZGRfc3RhdGljKCdtaW51cycsIE9wZXJhdG9yLm1pbnVzKQotc3RhdGljcy5hZGRfc3RhdGljKCdtdWx0JywgT3BlcmF0b3IubXVsdCkKLXN0YXRpY3MuYWRkX3N0YXRpYygnZGl2JywgT3BlcmF0b3IuZGl2KQotc3RhdGljcy5hZGRfc3RhdGljKCdtaW4nLCBPcGVyYXRvci5taW5fKQotc3RhdGljcy5hZGRfc3RhdGljKCdtaW5fJywgT3BlcmF0b3IubWluXykKLXN0YXRpY3MuYWRkX3N0YXRpYygnbWF4XycsIE9wZXJhdG9yLm1heF8pCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2Fzc2lnbicsIE9wZXJhdG9yLmFzc2lnbikKLXN0YXRpY3MuYWRkX3N0YXRpYygnYW5kXycsIE9wZXJhdG9yLmFuZF8pCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ29yXycsIE9wZXJhdG9yLm9yXykKLXN0YXRpY3MuYWRkX3N0YXRpYygnYWRkQWxsJywgT3BlcmF0b3IuYWRkQWxsKQotc3RhdGljcy5hZGRfc3RhdGljKCdzdW1Mb25nJywgT3BlcmF0b3Iuc3VtTG9uZykKLQotCi1jbGFzcyBQKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wZXJhdG9yLCB2YWx1ZSwgb3RoZXI9Tm9uZSk6Ci0gICAgICAgIHNlbGYub3BlcmF0b3IgPSBvcGVyYXRvcgotICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKLSAgICAgICAgc2VsZi5vdGhlciA9IG90aGVyCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIGJldHdlZW4oKmFyZ3MpOgotICAgICAgICByZXR1cm4gUCgiYmV0d2VlbiIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBlcSgqYXJncyk6Ci0gICAgICAgIHJldHVybiBQKCJlcSIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBndCgqYXJncyk6Ci0gICAgICAgIHJldHVybiBQKCJndCIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBndGUoKmFyZ3MpOgotICAgICAgICByZXR1cm4gUCgiZ3RlIiwgKmFyZ3MpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIGluc2lkZSgqYXJncyk6Ci0gICAgICAgIHJldHVybiBQKCJpbnNpZGUiLCAqYXJncykKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgbHQoKmFyZ3MpOgotICAgICAgICByZXR1cm4gUCgibHQiLCAqYXJncykKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgbHRlKCphcmdzKToKLSAgICAgICAgcmV0dXJuIFAoImx0ZSIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBuZXEoKmFyZ3MpOgotICAgICAgICByZXR1cm4gUCgibmVxIiwgKmFyZ3MpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIG5vdF8oKmFyZ3MpOgotICAgICAgICByZXR1cm4gUCgibm90IiwgKmFyZ3MpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIG91dHNpZGUoKmFyZ3MpOgotICAgICAgICByZXR1cm4gUCgib3V0c2lkZSIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiB0ZXN0KCphcmdzKToKLSAgICAgICAgcmV0dXJuIFAoInRlc3QiLCAqYXJncykKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgd2l0aGluKCphcmdzKToKLSAgICAgICAgaWYgbGVuKGFyZ3MpID09IDEgYW5kIHR5cGUoYXJnc1swXSkgPT0gbGlzdDoKLSAgICAgICAgICAgIHJldHVybiBQKCJ3aXRoaW4iLCBhcmdzWzBdKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIFAoIndpdGhpbiIsIGxpc3QoYXJncykpCi0gICAgICAgIAotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgd2l0aG91dCgqYXJncyk6Ci0gICAgICAgIGlmIGxlbihhcmdzKSA9PSAxIGFuZCB0eXBlKGFyZ3NbMF0pID09IGxpc3Q6Ci0gICAgICAgICAgICByZXR1cm4gUCgid2l0aG91dCIsIGFyZ3NbMF0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gUCgid2l0aG91dCIsIGxpc3QoYXJncykpCi0KLSAgICBkZWYgYW5kXyhzZWxmLCBhcmcpOgotICAgICAgICByZXR1cm4gUCgiYW5kIiwgc2VsZiwgYXJnKQotCi0gICAgZGVmIG9yXyhzZWxmLCBhcmcpOgotICAgICAgICByZXR1cm4gUCgib3IiLCBzZWxmLCBhcmcpCi0KLSAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5vcGVyYXRvciA9PSBvdGhlci5vcGVyYXRvciBhbmQgc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZSBhbmQgc2VsZi5vdGhlciA9PSBvdGhlci5vdGhlcgotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5vcGVyYXRvciArICIoIiArIHN0cihzZWxmLnZhbHVlKSArICIpIiBpZiBzZWxmLm90aGVyIGlzIE5vbmUgZWxzZSBzZWxmLm9wZXJhdG9yICsgIigiICsgc3RyKHNlbGYudmFsdWUpICsgIiwiICsgc3RyKHNlbGYub3RoZXIpICsgIikiCi0KLQotZGVmIGJldHdlZW4oKmFyZ3MpOgotICAgIHJldHVybiBQLmJldHdlZW4oKmFyZ3MpCi0KLQotZGVmIGVxKCphcmdzKToKLSAgICByZXR1cm4gUC5lcSgqYXJncykKLQotCi1kZWYgZ3QoKmFyZ3MpOgotICAgIHJldHVybiBQLmd0KCphcmdzKQotCi0KLWRlZiBndGUoKmFyZ3MpOgotICAgIHJldHVybiBQLmd0ZSgqYXJncykKLQotCi1kZWYgaW5zaWRlKCphcmdzKToKLSAgICByZXR1cm4gUC5pbnNpZGUoKmFyZ3MpCi0KLQotZGVmIGx0KCphcmdzKToKLSAgICByZXR1cm4gUC5sdCgqYXJncykKLQotCi1kZWYgbHRlKCphcmdzKToKLSAgICByZXR1cm4gUC5sdGUoKmFyZ3MpCi0KLQotZGVmIG5lcSgqYXJncyk6Ci0gICAgcmV0dXJuIFAubmVxKCphcmdzKQotCi0KLWRlZiBub3RfKCphcmdzKToKLSAgICByZXR1cm4gUC5ub3RfKCphcmdzKQotCi0KLWRlZiBvdXRzaWRlKCphcmdzKToKLSAgICByZXR1cm4gUC5vdXRzaWRlKCphcmdzKQotCi0KLWRlZiB0ZXN0KCphcmdzKToKLSAgICByZXR1cm4gUC50ZXN0KCphcmdzKQotCi0KLWRlZiB3aXRoaW4oKmFyZ3MpOgotICAgIHJldHVybiBQLndpdGhpbigqYXJncykKLQotCi1kZWYgd2l0aG91dCgqYXJncyk6Ci0gICAgcmV0dXJuIFAud2l0aG91dCgqYXJncykKLQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2JldHdlZW4nLCBiZXR3ZWVuKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2VxJywgZXEpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnZ3QnLCBndCkKLQotc3RhdGljcy5hZGRfc3RhdGljKCdndGUnLCBndGUpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnaW5zaWRlJywgaW5zaWRlKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ2x0JywgbHQpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnbHRlJywgbHRlKQotCi1zdGF0aWNzLmFkZF9zdGF0aWMoJ25lcScsIG5lcSkKLQotc3RhdGljcy5hZGRfc3RhdGljKCdub3RfJywgbm90XykKLQotc3RhdGljcy5hZGRfc3RhdGljKCdvdXRzaWRlJywgb3V0c2lkZSkKLQotc3RhdGljcy5hZGRfc3RhdGljKCd0ZXN0JywgdGVzdCkKLQotc3RhdGljcy5hZGRfc3RhdGljKCd3aXRoaW4nLCB3aXRoaW4pCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnd2l0aG91dCcsIHdpdGhvdXQpCi0KLQotY2xhc3MgVGV4dFAoUCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wZXJhdG9yLCB2YWx1ZSwgb3RoZXI9Tm9uZSk6Ci0gICAgICAgIFAuX19pbml0X18oc2VsZiwgb3BlcmF0b3IsIHZhbHVlLCBvdGhlcikKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgY29udGFpbmluZygqYXJncyk6Ci0gICAgICAgIHJldHVybiBUZXh0UCgiY29udGFpbmluZyIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBlbmRpbmdXaXRoKCphcmdzKToKLSAgICAgICAgcmV0dXJuIFRleHRQKCJlbmRpbmdXaXRoIiwgKmFyZ3MpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIG5vdENvbnRhaW5pbmcoKmFyZ3MpOgotICAgICAgICByZXR1cm4gVGV4dFAoIm5vdENvbnRhaW5pbmciLCAqYXJncykKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgbm90RW5kaW5nV2l0aCgqYXJncyk6Ci0gICAgICAgIHJldHVybiBUZXh0UCgibm90RW5kaW5nV2l0aCIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBub3RTdGFydGluZ1dpdGgoKmFyZ3MpOgotICAgICAgICByZXR1cm4gVGV4dFAoIm5vdFN0YXJ0aW5nV2l0aCIsICphcmdzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBzdGFydGluZ1dpdGgoKmFyZ3MpOgotICAgICAgICByZXR1cm4gVGV4dFAoInN0YXJ0aW5nV2l0aCIsICphcmdzKQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYub3BlcmF0b3IgPT0gb3RoZXIub3BlcmF0b3IgYW5kIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUgYW5kIHNlbGYub3RoZXIgPT0gb3RoZXIub3RoZXIKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYub3BlcmF0b3IgKyAiKCIgKyBzdHIoc2VsZi52YWx1ZSkgKyAiKSIgaWYgc2VsZi5vdGhlciBpcyBOb25lIGVsc2Ugc2VsZi5vcGVyYXRvciArICIoIiArIHN0cihzZWxmLnZhbHVlKSArICIsIiArIHN0cihzZWxmLm90aGVyKSArICIpIgotCi0KLWRlZiBjb250YWluaW5nKCphcmdzKToKLSAgICByZXR1cm4gVGV4dFAuY29udGFpbmluZygqYXJncykKLQotCi1kZWYgZW5kaW5nV2l0aCgqYXJncyk6Ci0gICAgcmV0dXJuIFRleHRQLmVuZGluZ1dpdGgoKmFyZ3MpCi0KLQotZGVmIG5vdENvbnRhaW5pbmcoKmFyZ3MpOgotICAgIHJldHVybiBUZXh0UC5ub3RDb250YWluaW5nKCphcmdzKQotCi0KLWRlZiBub3RFbmRpbmdXaXRoKCphcmdzKToKLSAgICByZXR1cm4gVGV4dFAubm90RW5kaW5nV2l0aCgqYXJncykKLQotCi1kZWYgbm90U3RhcnRpbmdXaXRoKCphcmdzKToKLSAgICByZXR1cm4gVGV4dFAubm90U3RhcnRpbmdXaXRoKCphcmdzKQotCi0KLWRlZiBzdGFydGluZ1dpdGgoKmFyZ3MpOgotICAgIHJldHVybiBUZXh0UC5zdGFydGluZ1dpdGgoKmFyZ3MpCi0KLQotc3RhdGljcy5hZGRfc3RhdGljKCdjb250YWluaW5nJywgY29udGFpbmluZykKLQotc3RhdGljcy5hZGRfc3RhdGljKCdlbmRpbmdXaXRoJywgZW5kaW5nV2l0aCkKLQotc3RhdGljcy5hZGRfc3RhdGljKCdub3RDb250YWluaW5nJywgbm90Q29udGFpbmluZykKLQotc3RhdGljcy5hZGRfc3RhdGljKCdub3RFbmRpbmdXaXRoJywgbm90RW5kaW5nV2l0aCkKLQotc3RhdGljcy5hZGRfc3RhdGljKCdub3RTdGFydGluZ1dpdGgnLCBub3RTdGFydGluZ1dpdGgpCi0KLXN0YXRpY3MuYWRkX3N0YXRpYygnc3RhcnRpbmdXaXRoJywgc3RhcnRpbmdXaXRoKQotCi0KLQotCi0nJycKLUlPCi0nJycKLQotCi1jbGFzcyBJTyhvYmplY3QpOgotCi0gICAgZ3JhcGhtbCA9ICJncmFwaG1sIgotCi0gICAgZ3JhcGhzb24gPSAiZ3JhcGhzb24iCi0KLSAgICBncnlvID0gImdyeW8iCi0KLSAgICByZWFkZXIgPSAifnRpbmtlcnBvcC5pby5yZWFkZXIiCi0KLSAgICByZWdpc3RyeSA9ICJ+dGlua2VycG9wLmlvLnJlZ2lzdHJ5IgotCi0gICAgd3JpdGVyID0gIn50aW5rZXJwb3AuaW8ud3JpdGVyIgotCi0KLScnJwotQ29ubmVjdGVkQ29tcG9uZW50Ci0nJycKLQotCi1jbGFzcyBDb25uZWN0ZWRDb21wb25lbnQob2JqZWN0KToKLQotICAgIGNvbXBvbmVudCA9ICJncmVtbGluLmNvbm5lY3RlZENvbXBvbmVudFZlcnRleFByb2dyYW0uY29tcG9uZW50IgotCi0gICAgZWRnZXMgPSAifnRpbmtlcnBvcC5jb25uZWN0ZWRDb21wb25lbnQuZWRnZXMiCi0KLSAgICBwcm9wZXJ0eU5hbWUgPSAifnRpbmtlcnBvcC5jb25uZWN0ZWRDb21wb25lbnQucHJvcGVydHlOYW1lIgotCi0KLScnJwotU2hvcnRlc3RQYXRoCi0nJycKLQotCi1jbGFzcyBTaG9ydGVzdFBhdGgob2JqZWN0KToKLQotICAgIGRpc3RhbmNlID0gIn50aW5rZXJwb3Auc2hvcnRlc3RQYXRoLmRpc3RhbmNlIgotCi0gICAgZWRnZXMgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGguZWRnZXMiCi0KLSAgICBpbmNsdWRlRWRnZXMgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGguaW5jbHVkZUVkZ2VzIgotCi0gICAgbWF4RGlzdGFuY2UgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGgubWF4RGlzdGFuY2UiCi0KLSAgICB0YXJnZXQgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGgudGFyZ2V0IgotCi0KLScnJwotUGFnZVJhbmsKLScnJwotCi0KLWNsYXNzIFBhZ2VSYW5rKG9iamVjdCk6Ci0KLSAgICBlZGdlcyA9ICJ+dGlua2VycG9wLnBhZ2VSYW5rLmVkZ2VzIgotCi0gICAgcHJvcGVydHlOYW1lID0gIn50aW5rZXJwb3AucGFnZVJhbmsucHJvcGVydHlOYW1lIgotCi0gICAgdGltZXMgPSAifnRpbmtlcnBvcC5wYWdlUmFuay50aW1lcyIKLQotCi0nJycKLVBlZXJQcmVzc3VyZQotJycnCi0KLQotY2xhc3MgUGVlclByZXNzdXJlKG9iamVjdCk6Ci0KLSAgICBlZGdlcyA9ICJ+dGlua2VycG9wLnBlZXJQcmVzc3VyZS5lZGdlcyIKLQotICAgIHByb3BlcnR5TmFtZSA9ICJ+dGlua2VycG9wLnBlZXJQcmVzc3VyZS5wcm9wZXJ0eU5hbWUiCi0KLSAgICB0aW1lcyA9ICJ+dGlua2VycG9wLnBlZXJQcmVzc3VyZS50aW1lcyIKLQotCi0nJycKLVRSQVZFUlNFUgotJycnCi0KLQotY2xhc3MgVHJhdmVyc2VyKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iamVjdCwgYnVsaz1Ob25lKToKLSAgICAgICAgaWYgYnVsayBpcyBOb25lOgotICAgICAgICAgICAgYnVsayA9IGxvbmcoMSkKLSAgICAgICAgc2VsZi5vYmplY3QgPSBvYmplY3QKLSAgICAgICAgc2VsZi5idWxrID0gYnVsawotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc3RyKHNlbGYub2JqZWN0KQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYub2JqZWN0ID09IG90aGVyLm9iamVjdAotCi0KLScnJwotVFJBVkVSU0FMIFNJREUtRUZGRUNUUwotJycnCi0KLQotY2xhc3MgVHJhdmVyc2FsU2lkZUVmZmVjdHMob2JqZWN0KToKLSAgICBkZWYga2V5cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNldCgpCi0KLSAgICBkZWYgZ2V0KHNlbGYsIGtleSk6Ci0gICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKLQotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5KQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gInNpZGVFZmZlY3RzW3NpemU6IiArIHN0cihsZW4oc2VsZi5rZXlzKCkpKSArICJdIgotCi0KLScnJwotVFJBVkVSU0FMIFNUUkFURUdJRVMKLScnJwotCi0KLWNsYXNzIFRyYXZlcnNhbFN0cmF0ZWdpZXMob2JqZWN0KToKLSAgICBnbG9iYWxfY2FjaGUgPSB7fQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYXZlcnNhbF9zdHJhdGVnaWVzPU5vbmUpOgotICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzID0gICAgICAgICAgICAgdHJhdmVyc2FsX3N0cmF0ZWdpZXMudHJhdmVyc2FsX3N0cmF0ZWdpZXMgaWYgdHJhdmVyc2FsX3N0cmF0ZWdpZXMgaXMgbm90IE5vbmUgZWxzZSBbXQotCi0gICAgZGVmIGFkZF9zdHJhdGVnaWVzKHNlbGYsIHRyYXZlcnNhbF9zdHJhdGVnaWVzKToKLSAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcyA9IHNlbGYudHJhdmVyc2FsX3N0cmF0ZWdpZXMgKyB0cmF2ZXJzYWxfc3RyYXRlZ2llcwotCi0gICAgZGVmIGFwcGx5X3N0cmF0ZWdpZXMoc2VsZiwgdHJhdmVyc2FsKToKLSAgICAgICAgZm9yIHRyYXZlcnNhbF9zdHJhdGVneSBpbiBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzOgotICAgICAgICAgICAgdHJhdmVyc2FsX3N0cmF0ZWd5LmFwcGx5KHRyYXZlcnNhbCkKLQotICAgIGRlZiBhcHBseV9hc3luY19zdHJhdGVnaWVzKHNlbGYsIHRyYXZlcnNhbCk6Ci0gICAgICAgIGZvciB0cmF2ZXJzYWxfc3RyYXRlZ3kgaW4gc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llczoKLSAgICAgICAgICAgIHRyYXZlcnNhbF9zdHJhdGVneS5hcHBseV9hc3luYyh0cmF2ZXJzYWwpCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzdHIoc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcykKLQotCi1jbGFzcyBUcmF2ZXJzYWxTdHJhdGVneShvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJhdGVneV9uYW1lPU5vbmUsIGNvbmZpZ3VyYXRpb249Tm9uZSwgZnFjbj1Ob25lKToKLSAgICAgICAgc2VsZi5mcWNuID0gZnFjbgotICAgICAgICBzZWxmLnN0cmF0ZWd5X25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fIGlmIHN0cmF0ZWd5X25hbWUgaXMgTm9uZSBlbHNlIHN0cmF0ZWd5X25hbWUKLSAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0ge30gaWYgY29uZmlndXJhdGlvbiBpcyBOb25lIGVsc2UgY29uZmlndXJhdGlvbgotCi0gICAgZGVmIGFwcGx5KHNlbGYsIHRyYXZlcnNhbCk6Ci0gICAgICAgIHJldHVybgotCi0gICAgZGVmIGFwcGx5X2FzeW5jKHNlbGYsIHRyYXZlcnNhbCk6Ci0gICAgICAgIHJldHVybgotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKLQotICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5zdHJhdGVneV9uYW1lKQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5zdHJhdGVneV9uYW1lCi0KLQotJycnCi1CWVRFQ09ERQotJycnCi0KLQotY2xhc3MgQnl0ZWNvZGUob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZWNvZGU9Tm9uZSk6Ci0gICAgICAgIHNlbGYuc291cmNlX2luc3RydWN0aW9ucyA9IFtdCi0gICAgICAgIHNlbGYuc3RlcF9pbnN0cnVjdGlvbnMgPSBbXQotICAgICAgICBzZWxmLmJpbmRpbmdzID0ge30KLSAgICAgICAgaWYgYnl0ZWNvZGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMgPSBsaXN0KGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMpCi0gICAgICAgICAgICBzZWxmLnN0ZXBfaW5zdHJ1Y3Rpb25zID0gbGlzdChieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKLQotICAgIGRlZiBhZGRfc291cmNlKHNlbGYsIHNvdXJjZV9uYW1lLCAqYXJncyk6Ci0gICAgICAgIGluc3RydWN0aW9uID0gW3NvdXJjZV9uYW1lXQotICAgICAgICBmb3IgYXJnIGluIGFyZ3M6Ci0gICAgICAgICAgICBpbnN0cnVjdGlvbi5hcHBlbmQoc2VsZi5fX2NvbnZlcnRBcmd1bWVudChhcmcpKQotICAgICAgICBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3RydWN0aW9uKQotCi0gICAgZGVmIGFkZF9zdGVwKHNlbGYsIHN0ZXBfbmFtZSwgKmFyZ3MpOgotICAgICAgICBpbnN0cnVjdGlvbiA9IFtzdGVwX25hbWVdCi0gICAgICAgIGZvciBhcmcgaW4gYXJnczoKLSAgICAgICAgICAgIGluc3RydWN0aW9uLmFwcGVuZChzZWxmLl9fY29udmVydEFyZ3VtZW50KGFyZykpCi0gICAgICAgIHNlbGYuc3RlcF9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3RydWN0aW9uKQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMgPT0gb3RoZXIuc291cmNlX2luc3RydWN0aW9ucyBhbmQgc2VsZi5zdGVwX2luc3RydWN0aW9ucyA9PSBvdGhlci5zdGVwX2luc3RydWN0aW9ucwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgX19jb3B5X18oc2VsZik6Ci0gICAgICAgIGJiID0gQnl0ZWNvZGUoKQotICAgICAgICBiYi5zb3VyY2VfaW5zdHJ1Y3Rpb25zID0gc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zCi0gICAgICAgIGJiLnN0ZXBfaW5zdHJ1Y3Rpb25zID0gc2VsZi5zdGVwX2luc3RydWN0aW9ucwotICAgICAgICBiYi5iaW5kaW5ncyA9IHNlbGYuYmluZGluZ3MKLSAgICAgICAgcmV0dXJuIGJiCi0KLSAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW89e30pOgotICAgICAgICBiYiA9IEJ5dGVjb2RlKCkKLSAgICAgICAgYmIuc291cmNlX2luc3RydWN0aW9ucyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zLCBtZW1vKQotICAgICAgICBiYi5zdGVwX2luc3RydWN0aW9ucyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zdGVwX2luc3RydWN0aW9ucywgbWVtbykKLSAgICAgICAgYmIuYmluZGluZ3MgPSBjb3B5LmRlZXBjb3B5KHNlbGYuYmluZGluZ3MsIG1lbW8pCi0gICAgICAgIHJldHVybiBiYgotCi0gICAgZGVmIF9fY29udmVydEFyZ3VtZW50KHNlbGYsYXJnKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIFRyYXZlcnNhbCk6Ci0gICAgICAgICAgICBzZWxmLmJpbmRpbmdzLnVwZGF0ZShhcmcuYnl0ZWNvZGUuYmluZGluZ3MpCi0gICAgICAgICAgICByZXR1cm4gYXJnLmJ5dGVjb2RlCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmcsIGRpY3QpOgotICAgICAgICAgICAgbmV3RGljdCA9IHt9Ci0gICAgICAgICAgICBmb3Iga2V5IGluIGFyZzoKLSAgICAgICAgICAgICAgICBuZXdEaWN0W3NlbGYuX19jb252ZXJ0QXJndW1lbnQoa2V5KV0gPSBzZWxmLl9fY29udmVydEFyZ3VtZW50KGFyZ1trZXldKQotICAgICAgICAgICAgcmV0dXJuIG5ld0RpY3QKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZywgbGlzdCk6Ci0gICAgICAgICAgICBuZXdMaXN0ID0gW10KLSAgICAgICAgICAgIGZvciBpdGVtIGluIGFyZzoKLSAgICAgICAgICAgICAgICBuZXdMaXN0LmFwcGVuZChzZWxmLl9fY29udmVydEFyZ3VtZW50KGl0ZW0pKQotICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3QKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZywgc2V0KToKLSAgICAgICAgICAgIG5ld1NldCA9IHNldCgpCi0gICAgICAgICAgICBmb3IgaXRlbSBpbiBhcmc6Ci0gICAgICAgICAgICAgICAgbmV3U2V0LmFkZChzZWxmLl9fY29udmVydEFyZ3VtZW50KGl0ZW0pKQotICAgICAgICAgICAgcmV0dXJuIG5ld1NldAotICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYXJnLCBCaW5kaW5nKToKLSAgICAgICAgICAgIHNlbGYuYmluZGluZ3NbYXJnLmtleV0gPSBhcmcudmFsdWUKLSAgICAgICAgICAgIHJldHVybiBCaW5kaW5nKGFyZy5rZXksIHNlbGYuX19jb252ZXJ0QXJndW1lbnQoYXJnLnZhbHVlKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBhcmcKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChzdHIoc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zKSBpZiBsZW4oc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zKSA+IDAgZWxzZSAiIikgKyBcCi0gICAgICAgICAgICAgICAoc3RyKHNlbGYuc3RlcF9pbnN0cnVjdGlvbnMpIGlmIGxlbihzZWxmLnN0ZXBfaW5zdHJ1Y3Rpb25zKSA+IDAgZWxzZSAiIikKLQotCi0nJycKLUJJTkRJTkdTCi0nJycKLQotCi1jbGFzcyBCaW5kaW5ncyhvYmplY3QpOgotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBvZihrZXksIHZhbHVlKToKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBzdHIpOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJLZXkgbXVzdCBiZSBzdHIiKQotICAgICAgICByZXR1cm4gQmluZGluZyhrZXksIHZhbHVlKQotCi0KLWNsYXNzIEJpbmRpbmcob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWx1ZSk6Ci0gICAgICAgIHNlbGYua2V5ID0ga2V5Ci0gICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYua2V5ID09IG90aGVyLmtleSBhbmQgc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQotCi0gICAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gaGFzaChzZWxmLmtleSkgKyBoYXNoKHNlbGYudmFsdWUpCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiYmluZGluZ1siICsgc2VsZi5rZXkgKyAiPSIgKyBzdHIoc2VsZi52YWx1ZSkgKyAiXSIKLQotCi0nJycKLVdJVEggT1BUSU9OUwotJycnCi0KLQotY2xhc3MgV2l0aE9wdGlvbnMob2JqZWN0KToKLQotICAgIHRva2VucyA9ICJ+dGlua2VycG9wLnZhbHVlTWFwLnRva2VucyIKLQotICAgIG5vbmUgPSAwCi0KLSAgICBpZHMgPSAxCi0KLSAgICBsYWJlbHMgPSAyCi0KLSAgICBrZXlzID0gNAotCi0gICAgdmFsdWVzID0gOAotCi0gICAgYWxsID0gMTUKLQotICAgIGluZGV4ZXIgPSAifnRpbmtlcnBvcC5pbmRleC5pbmRleGVyIgotCi0gICAgbGlzdCA9IDAKLQotICAgIG1hcCA9IDEKLQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL3N0YXRpY3MucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RhdGljcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxZTE2Ni4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RhdGljcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1mcm9tIHR5cGVzIGltcG9ydCBGdW5jdGlvblR5cGUKLQotaW1wb3J0IHNpeAotZnJvbSBhZW51bSBpbXBvcnQgRW51bQotCi0KLWlmIHNpeC5QWTM6Ci0gICAgY2xhc3MgbG9uZyhpbnQpOiBwYXNzCi0gICAgRmxvYXRUeXBlID0gZmxvYXQKLSAgICBJbnRUeXBlID0gaW50Ci0gICAgTG9uZ1R5cGUgPSBsb25nCi0gICAgVHlwZVR5cGUgPSB0eXBlCi0gICAgTGlzdFR5cGUgPSBsaXN0Ci0gICAgRGljdFR5cGUgPSBkaWN0Ci0gICAgU2V0VHlwZSA9IHNldAotICAgIEJ5dGVCdWZmZXJUeXBlID0gYnl0ZXMKLWVsc2U6Ci0gICAgbG9uZyA9IGxvbmcKLSAgICBTZXRUeXBlID0gc2V0Ci0gICAgQnl0ZUJ1ZmZlclR5cGUgPSBieXRlYXJyYXkKLSAgICBmcm9tIHR5cGVzIGltcG9ydCBGbG9hdFR5cGUKLSAgICBmcm9tIHR5cGVzIGltcG9ydCBJbnRUeXBlCi0gICAgZnJvbSB0eXBlcyBpbXBvcnQgTG9uZ1R5cGUKLSAgICBmcm9tIHR5cGVzIGltcG9ydCBUeXBlVHlwZQotICAgIGZyb20gdHlwZXMgaW1wb3J0IExpc3RUeXBlCi0gICAgZnJvbSB0eXBlcyBpbXBvcnQgRGljdFR5cGUKLSAgICBmcm9tIHR5cGVzIGltcG9ydCBUeXBlVHlwZQotCi0KLWNsYXNzIHRpbWVzdGFtcChmbG9hdCk6Ci0gICAgIiIiCi0gICAgSW4gUHl0aG9uIGEgdGltZXN0YW1wIGlzIHNpbXBseSBhIGZsb2F0LiBUaGlzIGR1bW15IGNsYXNzIChzaW1pbGFyIHRvIGxvbmcpLCBhbGxvd3MgdXNlcnMgdG8gd3JhcCBhIGZsb2F0Ci0gICAgaW4gYSBHTFYgc2NyaXB0IHRvIG1ha2Ugc3VyZSB0aGUgdmFsdWUgaXMgc2VyaWFsaXplZCBhcyBhIEdyZW1saW4gdGltZXN0YW1wLgotICAgICIiIgotICAgIHBhc3MKLQotCi1jbGFzcyBTaW5nbGVCeXRlKGludCk6Ci0gICAgIiIiCi0gICAgUHJvdmlkZXMgYSB3YXkgdG8gcGFzcyBhIHNpbmdsZSBieXRlIHZpYSBHcmVtbGluLgotICAgICIiIgotICAgIGRlZiBfX25ld19fKGNscywgYik6Ci0gICAgICAgIGlmIC0xMjggPD0gYiA8IDEyODoKLSAgICAgICAgICAgIGludC5fX25ld19fKGNscywgYikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInZhbHVlIG11c3QgYmUgYmV0d2VlbiAtMTI4IGFuZCAxMjcgaW5jbHVzaXZlIikKLQotCi1jbGFzcyBTaW5nbGVDaGFyKHN0cik6Ci0gICAgIiIiCi0gICAgUHJvdmlkZXMgYSB3YXkgdG8gcGFzcyBhIHNpbmdsZSBjaGFyYWN0ZXIgdmlhIEdyZW1saW4uCi0gICAgIiIiCi0gICAgZGVmIF9fbmV3X18oY2xzLCBjKToKLSAgICAgICAgaWYgbGVuKGIpID09IDE6Ci0gICAgICAgICAgICBzdHIuX19uZXdfXyhjbHMsIGMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdHJpbmcgbXVzdCBjb250YWluIGEgc2luZ2xlIGNoYXJhY3RlciIpCi0KLQotY2xhc3MgR3JlbWxpblR5cGUob2JqZWN0KToKLSAgICAiIiIKLSAgICBQcm92aWRlcyBhIHdheSB0byByZXByZXNlbnQgYSAiSmF2YSBjbGFzcyIgZm9yIEdyZW1saW4uCi0gICAgIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGdyZW1saW5fdHlwZSk6Ci0gICAgICAgIHNlbGYuZ3JlbWxpbl90eXBlID0gZ3JlbWxpbl90eXBlCi0gICAgICAgIAotCi1zdGF0aWNNZXRob2RzID0ge30KLXN0YXRpY0VudW1zID0ge30KLWRlZmF1bHRfbGFtYmRhX2xhbmd1YWdlID0gImdyZW1saW4tcHl0aG9uIgotCi0KLWRlZiBhZGRfc3RhdGljKGtleSwgdmFsdWUpOgotICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIEVudW0pOgotICAgICAgICBzdGF0aWNFbnVtc1trZXldID0gdmFsdWUKLSAgICBlbHNlOgotICAgICAgICBzdGF0aWNNZXRob2RzW2tleV0gPSB2YWx1ZQotCi0KLWRlZiBsb2FkX3N0YXRpY3MoZ2xvYmFsX2RpY3QpOgotICAgIGZvciBrZXkgaW4gc3RhdGljTWV0aG9kczoKLSAgICAgICAgZ2xvYmFsX2RpY3Rba2V5XSA9IHN0YXRpY01ldGhvZHNba2V5XQotICAgIGZvciBrZXkgaW4gc3RhdGljRW51bXM6Ci0gICAgICAgIGdsb2JhbF9kaWN0W2tleV0gPSBzdGF0aWNFbnVtc1trZXldCi0KLQotZGVmIHVubG9hZF9zdGF0aWNzKGdsb2JhbF9kaWN0KToKLSAgICBmb3Iga2V5IGluIHN0YXRpY01ldGhvZHM6Ci0gICAgICAgIGlmIGtleSBpbiBnbG9iYWxfZGljdDoKLSAgICAgICAgICAgIGRlbCBnbG9iYWxfZGljdFtrZXldCi0gICAgZm9yIGtleSBpbiBzdGF0aWNFbnVtczoKLSAgICAgICAgaWYga2V5IGluIGdsb2JhbF9kaWN0OgotICAgICAgICAgICAgZGVsIGdsb2JhbF9kaWN0W2tleV0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnlWMS5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnlWMS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2ZWUxMi4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5VjEucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgzICswLDAgQEAKLSIiIgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSIiIgotCi1pbXBvcnQgc2l4Ci1pbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBjYWxlbmRhcgotaW1wb3J0IHV1aWQKLWltcG9ydCBtYXRoCi1pbXBvcnQgaW8KLWltcG9ydCBzdHJ1Y3QKLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Ci1pbXBvcnQgbG9nZ2luZwotCi1mcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCi1mcm9tIGFlbnVtIGltcG9ydCBFbnVtCi1mcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKLWZyb20gZ3JlbWxpbl9weXRob24gaW1wb3J0IHN0YXRpY3MKLWZyb20gZ3JlbWxpbl9weXRob24uc3RhdGljcyBpbXBvcnQgRmxvYXRUeXBlLCBGdW5jdGlvblR5cGUsIEludFR5cGUsIExvbmdUeXBlLCBUeXBlVHlwZSwgRGljdFR5cGUsIExpc3RUeXBlLCBTZXRUeXBlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZUJ5dGUsIEJ5dGVCdWZmZXJUeXBlLCBHcmVtbGluVHlwZSwgU2luZ2xlQ2hhcgotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgQmFycmllciwgQmluZGluZywgQnl0ZWNvZGUsIENhcmRpbmFsaXR5LCBDb2x1bW4sIERpcmVjdGlvbiwgT3BlcmF0b3IsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyLCBQaWNrLCBQb3AsIFAsIFNjb3BlLCBUZXh0UCwgVHJhdmVyc2FsLCBUcmF2ZXJzZXIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5LCBUCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBHcmFwaFRyYXZlcnNhbAotZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IEdyYXBoLCBFZGdlLCBQcm9wZXJ0eSwgVmVydGV4LCBWZXJ0ZXhQcm9wZXJ0eSwgUGF0aAotCi1sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKLQotIyBXaGVuIHdlIGZhbGwgYmFjayB0byBhIHN1cGVyY2xhc3MncyBzZXJpYWxpemVyLCB3ZSBpdGVyYXRlIG92ZXIgdGhpcyBtYXAuCi0jIFdlIHdhbnQgdGhhdCBpdGVyYXRpb24gb3JkZXIgdG8gYmUgY29uc2lzdGVudCwgc28gd2UgdXNlIGFuIE9yZGVyZWREaWN0LAotIyBub3QgYSBkaWN0LgotX3NlcmlhbGl6ZXJzID0gT3JkZXJlZERpY3QoKQotX2Rlc2VyaWFsaXplcnMgPSB7fQotCi0KLWNsYXNzIERhdGFUeXBlKEVudW0pOgotICAgIG51bGwgPSAweGZlCi0gICAgaW50ID0gMHgwMQotICAgIGxvbmcgPSAweDAyCi0gICAgc3RyaW5nID0gMHgwMwotICAgIGRhdGUgPSAweDA0Ci0gICAgdGltZXN0YW1wID0gMHgwNQotICAgIGNsYXp6ID0gMHgwNgotICAgIGRvdWJsZSA9IDB4MDcKLSAgICBmbG9hdCA9IDB4MDgKLSAgICBsaXN0ID0gMHgwOQotICAgIG1hcCA9IDB4MGEKLSAgICBzZXQgPSAweDBiCi0gICAgdXVpZCA9IDB4MGMKLSAgICBlZGdlID0gMHgwZAotICAgIHBhdGggPSAweDBlCi0gICAgcHJvcGVydHkgPSAweDBmCi0gICAgZ3JhcGggPSAweDEwICAgICAgICAgICAgICAgICAgIyBub3Qgc3VwcG9ydGVkIC0gbm8gZ3JhcGggb2JqZWN0IGluIHB5dGhvbiB5ZXQKLSAgICB2ZXJ0ZXggPSAweDExCi0gICAgdmVydGV4cHJvcGVydHkgPSAweDEyCi0gICAgYmFycmllciA9IDB4MTMKLSAgICBiaW5kaW5nID0gMHgxNAotICAgIGJ5dGVjb2RlID0gMHgxNQotICAgIGNhcmRpbmFsaXR5ID0gMHgxNgotICAgIGNvbHVtbiA9IDB4MTcKLSAgICBkaXJlY3Rpb24gPSAweDE4Ci0gICAgb3BlcmF0b3IgPSAweDE5Ci0gICAgb3JkZXIgPSAweDFhCi0gICAgcGljayA9IDB4MWIKLSAgICBwb3AgPSAweDFjCi0gICAgbGFtYmRhXyA9IDB4MWQKLSAgICBwID0gMHgxZQotICAgIHNjb3BlID0gMHgxZgotICAgIHQgPSAweDIwCi0gICAgdHJhdmVyc2VyID0gMHgyMQotICAgIGJpZ2RlY2ltYWwgPSAweDIyICAgICAgICAgICAgICMgdG9kbwotICAgIGJpZ2ludGVnZXIgPSAweDIzICAgICAgICAgICAgICMgdG9kbwotICAgIGJ5dGUgPSAweDI0Ci0gICAgYnl0ZWJ1ZmZlciA9IDB4MjUKLSAgICBzaG9ydCA9IDB4MjYgICAgICAgICAgICAgICAgICAjIHRvZG8KLSAgICBib29sZWFuID0gMHgyNwotICAgIHRleHRwID0gMHgyOAotICAgIHRyYXZlcnNhbHN0cmF0ZWd5ID0gMHgyOQotICAgIGJ1bGtzZXQgPSAweDJhCi0gICAgdHJlZSA9IDB4MmIgICAgICAgICAgICAgICAgICAgIyBub3Qgc3VwcG9ydGVkIC0gbm8gdHJlZSBvYmplY3QgaW4gUHl0aG9uIHlldAotICAgIG1ldHJpY3MgPSAweDJjCi0gICAgdHJhdmVyc2FsbWV0cmljcyA9IDB4MmQKLSAgICBjaGFyID0gMHg4MAotICAgIGR1cmF0aW9uID0gMHg4MQotICAgIGluZXRhZGRyZXNzID0gMHg4MiAgICAgICAgICAgICMgdG9kbwotICAgIGluc3RhbnQgPSAweDgzICAgICAgICAgICAgICAgICMgdG9kbwotICAgIGxvY2FsZGF0ZSA9IDB4ODQgICAgICAgICAgICAgICMgdG9kbwotICAgIGxvY2FsZGF0ZXRpbWUgPSAweDg1ICAgICAgICAgICMgdG9kbwotICAgIGxvY2FsdGltZSA9IDB4ODYgICAgICAgICAgICAgICMgdG9kbwotICAgIG1vbnRoZGF5ID0gMHg4NyAgICAgICAgICAgICAgICMgdG9kbwotICAgIG9mZnNldGRhdGV0aW1lID0gMHg4OCAgICAgICAgICMgdG9kbwotICAgIG9mZnNldHRpbWUgPSAweDg5ICAgICAgICAgICAgICMgdG9kbwotICAgIHBlcmlvZCA9IDB4OGEgICAgICAgICAgICAgICAgICMgdG9kbwotICAgIHllYXIgPSAweDhiICAgICAgICAgICAgICAgICAgICMgdG9kbwotICAgIHllYXJtb250aCA9IDB4OGMgICAgICAgICAgICAgICMgdG9kbwotICAgIHpvbmVkYXRldGltZSA9IDB4OGQgICAgICAgICAgICMgdG9kbwotICAgIHpvbmVvZmZzZXQgPSAweDhlICAgICAgICAgICAgICMgdG9kbwotICAgIGN1c3RvbSA9IDB4MDAgICAgICAgICAgICAgICAgICMgdG9kbwotCi0KLU5VTExfQllURVMgPSBbRGF0YVR5cGUubnVsbC52YWx1ZSwgMHgwMV0KLQotCi1kZWYgX21ha2VfcGFja2VyKGZvcm1hdF9zdHJpbmcpOgotICAgIHBhY2tlciA9IHN0cnVjdC5TdHJ1Y3QoZm9ybWF0X3N0cmluZykKLSAgICBwYWNrID0gcGFja2VyLnBhY2sKLSAgICB1bnBhY2sgPSBsYW1iZGEgczogcGFja2VyLnVucGFjayhzKVswXQotICAgIHJldHVybiBwYWNrLCB1bnBhY2sKLQotCi1pbnQ2NF9wYWNrLCBpbnQ2NF91bnBhY2sgPSBfbWFrZV9wYWNrZXIoJz5xJykKLWludDMyX3BhY2ssIGludDMyX3VucGFjayA9IF9tYWtlX3BhY2tlcignPmknKQotaW50OF9wYWNrLCBpbnQ4X3VucGFjayA9IF9tYWtlX3BhY2tlcignPmInKQotdWludDY0X3BhY2ssIHVpbnQ2NF91bnBhY2sgPSBfbWFrZV9wYWNrZXIoJz5RJykKLXVpbnQ4X3BhY2ssIHVpbnQ4X3VucGFjayA9IF9tYWtlX3BhY2tlcignPkInKQotZmxvYXRfcGFjaywgZmxvYXRfdW5wYWNrID0gX21ha2VfcGFja2VyKCc+ZicpCi1kb3VibGVfcGFjaywgZG91YmxlX3VucGFjayA9IF9tYWtlX3BhY2tlcignPmQnKQotCi0KLWNsYXNzIEdyYXBoQmluYXJ5VHlwZVR5cGUodHlwZSk6Ci0gICAgZGVmIF9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGN0KToKLSAgICAgICAgY2xzID0gc3VwZXIoR3JhcGhCaW5hcnlUeXBlVHlwZSwgbWNzKS5fX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIGRjdCkKLSAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgotICAgICAgICAgICAgaWYgY2xzLnB5dGhvbl90eXBlOgotICAgICAgICAgICAgICAgIF9zZXJpYWxpemVyc1tjbHMucHl0aG9uX3R5cGVdID0gY2xzCi0gICAgICAgICAgICBpZiBjbHMuZ3JhcGhiaW5hcnlfdHlwZToKLSAgICAgICAgICAgICAgICBfZGVzZXJpYWxpemVyc1tjbHMuZ3JhcGhiaW5hcnlfdHlwZV0gPSBjbHMKLSAgICAgICAgcmV0dXJuIGNscwotCi0KLWNsYXNzIEdyYXBoQmluYXJ5V3JpdGVyKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcmlhbGl6ZXJfbWFwPU5vbmUpOgotICAgICAgICBzZWxmLnNlcmlhbGl6ZXJzID0gX3NlcmlhbGl6ZXJzLmNvcHkoKQotICAgICAgICBpZiBzZXJpYWxpemVyX21hcDoKLSAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplcnMudXBkYXRlKHNlcmlhbGl6ZXJfbWFwKQotCi0gICAgZGVmIHdyaXRlT2JqZWN0KHNlbGYsIG9iamVjdERhdGEpOgotICAgICAgICByZXR1cm4gc2VsZi50b0RpY3Qob2JqZWN0RGF0YSkKLQotICAgIGRlZiB0b0RpY3Qoc2VsZiwgb2JqLCB0b19leHRlbmQ9Tm9uZSk6Ci0gICAgICAgIGlmIHRvX2V4dGVuZCBpcyBOb25lOgotICAgICAgICAgICAgdG9fZXh0ZW5kID0gYnl0ZWFycmF5KCkKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ID0gdHlwZShvYmopCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICMgY29lcmNlIHVuaWNvZGUgdG8gc3RyIHNvIHRoZSBzZXJpYWxpemVyIHdpbGwgYmUgZm91bmQgcHJvcGVybHkgaW4gdGhlIGNhY2hlLi4uYmV0dGVyIHdheT8KLSAgICAgICAgICAgIGlmIG5vdCBzaXguUFkzOgotICAgICAgICAgICAgICAgIHQgPSBzdHIgaWYgaXNpbnN0YW5jZShvYmosIHVuaWNvZGUpIGVsc2UgdAotICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2VyaWFsaXplcnNbdF0uZGljdGlmeShvYmosIHNlbGYsIHRvX2V4dGVuZCkKLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgZm9yIGtleSwgc2VyaWFsaXplciBpbiBzZWxmLnNlcmlhbGl6ZXJzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGtleSk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVyLmRpY3RpZnkob2JqLCBzZWxmLCB0b19leHRlbmQpCi0KLSAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGRpY3QpOgotICAgICAgICAgICAgcmV0dXJuIGRpY3QoKHNlbGYudG9EaWN0KGssIHRvX2V4dGVuZCksIHNlbGYudG9EaWN0KHYsIHRvX2V4dGVuZCkpIGZvciBrLCB2IGluIG9iai5pdGVtcygpKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBzZXQpOgotICAgICAgICAgICAgcmV0dXJuIHNldChbc2VsZi50b0RpY3QobywgdG9fZXh0ZW5kKSBmb3IgbyBpbiBvYmpdKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBsaXN0KToKLSAgICAgICAgICAgIHJldHVybiBbc2VsZi50b0RpY3QobywgdG9fZXh0ZW5kKSBmb3IgbyBpbiBvYmpdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gb2JqCi0KLQotY2xhc3MgR3JhcGhCaW5hcnlSZWFkZXIob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzZXJpYWxpemVyX21hcD1Ob25lKToKLSAgICAgICAgc2VsZi5kZXNlcmlhbGl6ZXJzID0gX2Rlc2VyaWFsaXplcnMuY29weSgpCi0gICAgICAgIGlmIGRlc2VyaWFsaXplcl9tYXA6Ci0gICAgICAgICAgICBzZWxmLmRlc2VyaWFsaXplcnMudXBkYXRlKGRlc2VyaWFsaXplcl9tYXApCi0KLSAgICBkZWYgcmVhZE9iamVjdChzZWxmLCBiKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShiLCBieXRlYXJyYXkpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9PYmplY3QoaW8uQnl0ZXNJTyhiKSkKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGIsIGlvLkJ1ZmZlcmVkSU9CYXNlKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnRvT2JqZWN0KGIpCi0KLSAgICBkZWYgdG9PYmplY3Qoc2VsZiwgYnVmZiwgZGF0YV90eXBlPU5vbmUsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBpZiBkYXRhX3R5cGUgaXMgTm9uZToKLSAgICAgICAgICAgIGJ0ID0gdWludDhfdW5wYWNrKGJ1ZmYucmVhZCgxKSkKLSAgICAgICAgICAgIGlmIGJ0ID09IERhdGFUeXBlLm51bGwudmFsdWU6Ci0gICAgICAgICAgICAgICAgaWYgbnVsbGFibGU6Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmYucmVhZCgxKQotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5kZXNlcmlhbGl6ZXJzW0RhdGFUeXBlKGJ0KV0ub2JqZWN0aWZ5KGJ1ZmYsIHNlbGYsIG51bGxhYmxlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVzZXJpYWxpemVyc1tkYXRhX3R5cGVdLm9iamVjdGlmeShidWZmLCBzZWxmLCBudWxsYWJsZSkKLQotCi1Ac2l4LmFkZF9tZXRhY2xhc3MoR3JhcGhCaW5hcnlUeXBlVHlwZSkKLWNsYXNzIF9HcmFwaEJpbmFyeVR5cGVJTyhvYmplY3QpOgotICAgIHB5dGhvbl90eXBlID0gTm9uZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBOb25lCi0KLSAgICBzeW1ib2xNYXAgPSB7Imdsb2JhbF8iOiAiZ2xvYmFsIiwgImFzXyI6ICJhcyIsICJpbl8iOiAiaW4iLCAiYW5kXyI6ICJhbmQiLAotICAgICAgICAgICAgICAgICAib3JfIjogIm9yIiwgImlzXyI6ICJpcyIsICJub3RfIjogIm5vdCIsICJmcm9tXyI6ICJmcm9tIiwKLSAgICAgICAgICAgICAgICAgInNldF8iOiAic2V0IiwgImxpc3RfIjogImxpc3QiLCAiYWxsXyI6ICJhbGwiLCAid2l0aF8iOiAid2l0aCIsCi0gICAgICAgICAgICAgICAgICJmaWx0ZXJfIjogImZpbHRlciIsICJpZF8iOiAiaWQiLCAibWF4XyI6ICJtYXgiLCAibWluXyI6ICJtaW4iLCAic3VtXyI6ICJzdW0ifQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHByZWZpeF9ieXRlcyhjbHMsIGdyYXBoYmluX3R5cGUsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlLCB0b19leHRlbmQ9Tm9uZSk6Ci0gICAgICAgIGlmIHRvX2V4dGVuZCBpcyBOb25lOgotICAgICAgICAgICAgdG9fZXh0ZW5kID0gYnl0ZWFycmF5KCkKLQotICAgICAgICBpZiBub3QgYXNfdmFsdWU6Ci0gICAgICAgICAgICB0b19leHRlbmQgKz0gdWludDhfcGFjayhncmFwaGJpbl90eXBlLnZhbHVlKQotCi0gICAgICAgIGlmIG51bGxhYmxlOgotICAgICAgICAgICAgdG9fZXh0ZW5kICs9IGludDhfcGFjaygwKQotCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiByZWFkX2ludChjbHMsIGJ1ZmYpOgotICAgICAgICByZXR1cm4gaW50MzJfdW5wYWNrKGJ1ZmYucmVhZCg0KSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB1bm1hbmdsZV9rZXl3b3JkKGNscywgc3ltYm9sKToKLSAgICAgICAgcmV0dXJuIGNscy5zeW1ib2xNYXAuZ2V0KHN5bWJvbCwgc3ltYm9sKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGlzX251bGwoY2xzLCBidWZmLCByZWFkZXIsIGVsc2Vfb3B0LCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIE5vbmUgaWYgbnVsbGFibGUgYW5kIGJ1ZmYucmVhZCgxKVswXSA9PSAweDAxIGVsc2UgZWxzZV9vcHQoYnVmZiwgcmVhZGVyKQotCi0gICAgZGVmIGRpY3RpZnkoc2VsZiwgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLQotICAgIGRlZiBvYmplY3RpZnkoc2VsZiwgZCwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCi0gICAgICAgIAotCi1jbGFzcyBMb25nSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLQotICAgIHB5dGhvbl90eXBlID0gTG9uZ1R5cGUKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUubG9uZwotICAgIGJ5dGVfZm9ybWF0X3BhY2sgPSBpbnQ2NF9wYWNrCi0gICAgYnl0ZV9mb3JtYXRfdW5wYWNrID0gaW50NjRfdW5wYWNrCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgaWYgb2JqIDwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggb3Igb2JqID4gOTIyMzM3MjAzNjg1NDc3NTgwNzoKLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVE9ETzogZG9uJ3QgZm9yZ2V0IGJpZ2ludCIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2sob2JqKSkKLSAgICAgICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IGludDY0X3VucGFjayhidWZmLnJlYWQoOCkpLCBudWxsYWJsZSkKLQotCi1jbGFzcyBJbnRJTyhMb25nSU8pOgotCi0gICAgcHl0aG9uX3R5cGUgPSBJbnRUeXBlCi0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmludAotICAgIGJ5dGVfZm9ybWF0X3BhY2sgPSBpbnQzMl9wYWNrCi0gICAgYnl0ZV9mb3JtYXRfdW5wYWNrID0gaW50MzJfdW5wYWNrCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IGNscy5yZWFkX2ludChiKSwgbnVsbGFibGUpCi0KLQotY2xhc3MgRGF0ZUlPKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0KLSAgICBweXRob25fdHlwZSA9IGRhdGV0aW1lLmRhdGV0aW1lCi0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmRhdGUKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0aW1lc3RhbXBfc2Vjb25kcyA9IGNhbGVuZGFyLnRpbWVnbShvYmoudXRjdGltZXR1cGxlKCkpCi0gICAgICAgICAgICBwdHMgPSB0aW1lc3RhbXBfc2Vjb25kcyAqIDFlMyArIGdldGF0dHIob2JqLCAnbWljcm9zZWNvbmQnLCAwKSAvIDFlMwotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBwdHMgPSBjYWxlbmRhci50aW1lZ20ob2JqLnRpbWV0dXBsZSgpKSAqIDFlMwotCi0gICAgICAgIHRzID0gaW50KHJvdW5kKHB0cykpCi0gICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQotICAgICAgICB0b19leHRlbmQuZXh0ZW5kKGludDY0X3BhY2sodHMpKQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBiLCByOiBkYXRldGltZS5kYXRldGltZS51dGNmcm9tdGltZXN0YW1wKGludDY0X3VucGFjayhiLnJlYWQoOCkpIC8gMTAwMC4wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlKQotCi0KLSMgQmFzZWQgb24gY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBjbGFzcyBtdXN0IGFsd2F5cyBiZSBkZWNsYXJlZCBiZWZvcmUgRmxvYXRJTy4KLSMgU2VlbXMgcHJldHR5IGZyYWdpbGUgZm9yIGZ1dHVyZSBtYWludGFpbmVycy4gTWF5YmUgbG9vayBpbnRvIHRoaXMuCi1jbGFzcyBUaW1lc3RhbXBJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gc3RhdGljcy50aW1lc3RhbXAKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudGltZXN0YW1wCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgIyBKYXZhIHRpbWVzdGFtcCBleHBlY3RzIG1pbGxpc2Vjb25kcyBpbnRlZ2VyIC0gSGF2ZSB0byB1c2UgaW50IGJlY2F1c2Ugb2YgbGVnYWN5IFB5dGhvbgotICAgICAgICB0cyA9IGludChyb3VuZChvYmogKiAxMDAwKSkKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50NjRfcGFjayh0cykpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICAjIFB5dGhvbiB0aW1lc3RhbXAgZXhwZWN0cyBzZWNvbmRzCi0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGxhbWJkYSBiLCByOiBzdGF0aWNzLnRpbWVzdGFtcChpbnQ2NF91bnBhY2soYi5yZWFkKDgpKSAvIDEwMDAuMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsYWJsZSkKLSAgICAKLQotZGVmIF9sb25nX2JpdHNfdG9fZG91YmxlKGJpdHMpOgotICAgIHJldHVybiB1bnBhY2soJ2QnLCBwYWNrKCdRJywgYml0cykpWzBdCi0KLQotTkFOID0gX2xvbmdfYml0c190b19kb3VibGUoMHg3ZmY4MDAwMDAwMDAwMDAwKQotUE9TSVRJVkVfSU5GSU5JVFkgPSBfbG9uZ19iaXRzX3RvX2RvdWJsZSgweDdmZjAwMDAwMDAwMDAwMDApCi1ORUdBVElWRV9JTkZJTklUWSA9IF9sb25nX2JpdHNfdG9fZG91YmxlKDB4RmZmMDAwMDAwMDAwMDAwMCkKLQotCi1jbGFzcyBGbG9hdElPKExvbmdJTyk6Ci0KLSAgICBweXRob25fdHlwZSA9IEZsb2F0VHlwZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5mbG9hdAotICAgIGdyYXBoYmluYXJ5X2Jhc2VfdHlwZSA9IERhdGFUeXBlLmZsb2F0Ci0gICAgYnl0ZV9mb3JtYXRfcGFjayA9IGZsb2F0X3BhY2sKLSAgICBieXRlX2Zvcm1hdF91bnBhY2sgPSBmbG9hdF91bnBhY2sKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBpZiBtYXRoLmlzbmFuKG9iaik6Ci0gICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2soTkFOKSkKLSAgICAgICAgZWxpZiBtYXRoLmlzaW5mKG9iaikgYW5kIG9iaiA+IDA6Ci0gICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2soUE9TSVRJVkVfSU5GSU5JVFkpKQotICAgICAgICBlbGlmIG1hdGguaXNpbmYob2JqKSBhbmQgb2JqIDwgMDoKLSAgICAgICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQotICAgICAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChjbHMuYnl0ZV9mb3JtYXRfcGFjayhORUdBVElWRV9JTkZJTklUWSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2sob2JqKSkKLQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IGZsb2F0X3VucGFjayhiLnJlYWQoNCkpLCBudWxsYWJsZSkKLQotCi1jbGFzcyBEb3VibGVJTyhGbG9hdElPKToKLSAgICAiIiIKLSAgICBGbG9hdHMgYmFzaWNhbGx5IGp1c3QgZmFsbCB0aHJvdWdoIHRvIGRvdWJsZSBzZXJpYWxpemF0aW9uLgotICAgICIiIgotCi0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmRvdWJsZQotICAgIGdyYXBoYmluYXJ5X2Jhc2VfdHlwZSA9IERhdGFUeXBlLmRvdWJsZQotICAgIGJ5dGVfZm9ybWF0X3BhY2sgPSBkb3VibGVfcGFjawotICAgIGJ5dGVfZm9ybWF0X3VucGFjayA9IGRvdWJsZV91bnBhY2sKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBsYW1iZGEgYiwgcjogZG91YmxlX3VucGFjayhiLnJlYWQoOCkpLCBudWxsYWJsZSkKLQotCi1jbGFzcyBDaGFySU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IFNpbmdsZUNoYXIKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuY2hhcgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlciwgdG9fZXh0ZW5kLCBhc192YWx1ZT1GYWxzZSwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQotICAgICAgICB0b19leHRlbmQuZXh0ZW5kKG9iai5lbmNvZGUoInV0Zi04IikpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfY2hhciwgbnVsbGFibGUpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgX3JlYWRfY2hhcihjbHMsIGIsIHIpOgotICAgICAgICBtYXhfYnl0ZXMgPSA0Ci0gICAgICAgIHggPSBiLnJlYWQoMSkKLSAgICAgICAgd2hpbGUgbWF4X2J5dGVzID4gMDoKLSAgICAgICAgICAgIG1heF9ieXRlcyA9IG1heF9ieXRlcyAtIDEKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXR1cm4geC5kZWNvZGUoInV0Zi04IikKLSAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6Ci0gICAgICAgICAgICAgICAgeCArPSBiLnJlYWQoMSkKLQotCi1jbGFzcyBTdHJpbmdJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotCi0gICAgcHl0aG9uX3R5cGUgPSBzdHIKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuc3RyaW5nCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIHN0cl9ieXRlcyA9IG9iai5lbmNvZGUoInV0Zi04IikKLSAgICAgICAgdG9fZXh0ZW5kICs9IGludDMyX3BhY2sobGVuKHN0cl9ieXRlcykpCi0gICAgICAgIHRvX2V4dGVuZCArPSBzdHJfYnl0ZXMKLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGxhbWJkYSBiLCByOiBiLnJlYWQoY2xzLnJlYWRfaW50KGIpKS5kZWNvZGUoInV0Zi04IiksIG51bGxhYmxlKQotCi0KLWNsYXNzIExpc3RJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotCi0gICAgcHl0aG9uX3R5cGUgPSBsaXN0Ci0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmxpc3QKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQzMl9wYWNrKGxlbihvYmopKSkKLSAgICAgICAgZm9yIGl0ZW0gaW4gb2JqOgotICAgICAgICAgICAgd3JpdGVyLnRvRGljdChpdGVtLCB0b19leHRlbmQpCi0KLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF9saXN0LCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF9saXN0KGNscywgYiwgcik6Ci0gICAgICAgIHNpemUgPSBjbHMucmVhZF9pbnQoYikKLSAgICAgICAgdGhlX2xpc3QgPSBbXQotICAgICAgICB3aGlsZSBzaXplID4gMDoKLSAgICAgICAgICAgIHRoZV9saXN0LmFwcGVuZChyLnJlYWRPYmplY3QoYikpCi0gICAgICAgICAgICBzaXplID0gc2l6ZSAtIDEKLQotICAgICAgICByZXR1cm4gdGhlX2xpc3QKLQotCi1jbGFzcyBTZXREZXNlcmlhbGl6ZXIoTGlzdElPKToKLQotICAgIHB5dGhvbl90eXBlID0gU2V0VHlwZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5zZXQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gc2V0KExpc3RJTy5vYmplY3RpZnkoYnVmZiwgcmVhZGVyLCBudWxsYWJsZSkpCi0KLQotY2xhc3MgTWFwSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLQotICAgIHB5dGhvbl90eXBlID0gRGljdFR5cGUKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUubWFwCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0KLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQzMl9wYWNrKGxlbihvYmopKSkKLSAgICAgICAgZm9yIGssIHYgaW4gb2JqLml0ZW1zKCk6Ci0gICAgICAgICAgICB3cml0ZXIudG9EaWN0KGssIHRvX2V4dGVuZCkKLSAgICAgICAgICAgIHdyaXRlci50b0RpY3QodiwgdG9fZXh0ZW5kKQotCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfbWFwLCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF9tYXAoY2xzLCBiLCByKToKLSAgICAgICAgc2l6ZSA9IGNscy5yZWFkX2ludChiKQotICAgICAgICB0aGVfZGljdCA9IHt9Ci0gICAgICAgIHdoaWxlIHNpemUgPiAwOgotICAgICAgICAgICAgayA9IHIucmVhZE9iamVjdChiKQotICAgICAgICAgICAgdiA9IHIucmVhZE9iamVjdChiKQotICAgICAgICAgICAgdGhlX2RpY3Rba10gPSB2Ci0gICAgICAgICAgICBzaXplID0gc2l6ZSAtIDEKLQotICAgICAgICByZXR1cm4gdGhlX2RpY3QKLQotCi1jbGFzcyBVdWlkSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLQotICAgIHB5dGhvbl90eXBlID0gdXVpZC5VVUlECi0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLnV1aWQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChvYmouYnl0ZXMpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBsYW1iZGEgYiwgcjogdXVpZC5VVUlEKGJ5dGVzPWIucmVhZCgxNikpLCBudWxsYWJsZSkKLQotCi1jbGFzcyBFZGdlSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLQotICAgIHB5dGhvbl90eXBlID0gRWRnZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5lZGdlCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0KLSAgICAgICAgd3JpdGVyLnRvRGljdChvYmouaWQsIHRvX2V4dGVuZCkKLSAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmoubGFiZWwsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKLSAgICAgICAgd3JpdGVyLnRvRGljdChvYmouaW5WLmlkLCB0b19leHRlbmQpCi0gICAgICAgIFN0cmluZ0lPLmRpY3RpZnkob2JqLmluVi5sYWJlbCwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQotICAgICAgICB3cml0ZXIudG9EaWN0KG9iai5vdXRWLmlkLCB0b19leHRlbmQpCi0gICAgICAgIFN0cmluZ0lPLmRpY3RpZnkob2JqLm91dFYubGFiZWwsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChOVUxMX0JZVEVTKQotICAgICAgICB0b19leHRlbmQuZXh0ZW5kKE5VTExfQllURVMpCi0KLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF9lZGdlLCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF9lZGdlKGNscywgYiwgcik6Ci0gICAgICAgIGVkZ2VpZCA9IHIucmVhZE9iamVjdChiKQotICAgICAgICBlZGdlbGJsID0gci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKQotICAgICAgICBpbnYgPSBWZXJ0ZXgoci5yZWFkT2JqZWN0KGIpLCByLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpKQotICAgICAgICBvdXR2ID0gVmVydGV4KHIucmVhZE9iamVjdChiKSwgci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKSkKLSAgICAgICAgZWRnZSA9IEVkZ2UoZWRnZWlkLCBvdXR2LCBlZGdlbGJsLCBpbnYpCi0gICAgICAgIGIucmVhZCg0KQotICAgICAgICByZXR1cm4gZWRnZQotCi0KLWNsYXNzIFBhdGhJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotCi0gICAgcHl0aG9uX3R5cGUgPSBQYXRoCi0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLnBhdGgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgd3JpdGVyLnRvRGljdChvYmoubGFiZWxzLCB0b19leHRlbmQpCi0gICAgICAgIHdyaXRlci50b0RpY3Qob2JqLm9iamVjdHMsIHRvX2V4dGVuZCkKLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGxhbWJkYSBiLCByOiBQYXRoKHIucmVhZE9iamVjdChiKSwgci5yZWFkT2JqZWN0KGIpKSwgbnVsbGFibGUpCi0KLQotY2xhc3MgUHJvcGVydHlJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotCi0gICAgcHl0aG9uX3R5cGUgPSBQcm9wZXJ0eQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5wcm9wZXJ0eQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlciwgdG9fZXh0ZW5kLCBhc192YWx1ZT1GYWxzZSwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQotICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KG9iai5rZXksIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKLSAgICAgICAgd3JpdGVyLnRvRGljdChvYmoudmFsdWUsIHRvX2V4dGVuZCkKLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChOVUxMX0JZVEVTKQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX3Byb3BlcnR5LCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF9wcm9wZXJ0eShjbHMsIGIsIHIpOgotICAgICAgICBwID0gUHJvcGVydHkoci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKSwgci5yZWFkT2JqZWN0KGIpLCBOb25lKQotICAgICAgICBiLnJlYWQoMikKLSAgICAgICAgcmV0dXJuIHAKLQotCi1jbGFzcyBUaW5rZXJHcmFwaElPKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0KLSAgICBweXRob25fdHlwZSA9IEdyYXBoCi0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmdyYXBoCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIlRpbmtlckdyYXBoIHNlcmlhbGl6YXRpb24gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgZ3JlbWxpbi1weXRob24iKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGIsIHJlYWRlciwgYXNfdmFsdWU9RmFsc2UpOgotICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiVGlua2VyR3JhcGggZGVzZXJpYWxpemF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IGdyZW1saW4tcHl0aG9uIikKLQotCi1jbGFzcyBWZXJ0ZXhJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotCi0gICAgcHl0aG9uX3R5cGUgPSBWZXJ0ZXgKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudmVydGV4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIHdyaXRlci50b0RpY3Qob2JqLmlkLCB0b19leHRlbmQpCi0gICAgICAgIFN0cmluZ0lPLmRpY3RpZnkob2JqLmxhYmVsLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQoTlVMTF9CWVRFUykKLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF92ZXJ0ZXgsIG51bGxhYmxlKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9yZWFkX3ZlcnRleChjbHMsIGIsIHIpOgotICAgICAgICB2ZXJ0ZXggPSBWZXJ0ZXgoci5yZWFkT2JqZWN0KGIpLCByLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpKQotICAgICAgICBiLnJlYWQoMikKLSAgICAgICAgcmV0dXJuIHZlcnRleAotCi0KLWNsYXNzIFZlcnRleFByb3BlcnR5SU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLQotICAgIHB5dGhvbl90eXBlID0gVmVydGV4UHJvcGVydHkKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudmVydGV4cHJvcGVydHkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgd3JpdGVyLnRvRGljdChvYmouaWQsIHRvX2V4dGVuZCkKLSAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmoubGFiZWwsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKLSAgICAgICAgd3JpdGVyLnRvRGljdChvYmoudmFsdWUsIHRvX2V4dGVuZCkKLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChOVUxMX0JZVEVTKQotICAgICAgICB0b19leHRlbmQuZXh0ZW5kKE5VTExfQllURVMpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfdmVydGV4cHJvcGVydHksIG51bGxhYmxlKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9yZWFkX3ZlcnRleHByb3BlcnR5KGNscywgYiwgcik6Ci0gICAgICAgIHZwID0gVmVydGV4UHJvcGVydHkoci5yZWFkT2JqZWN0KGIpLCByLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpLCByLnJlYWRPYmplY3QoYiksIE5vbmUpCi0gICAgICAgIGIucmVhZCg0KQotICAgICAgICByZXR1cm4gdnAKLQotCi1jbGFzcyBfRW51bUlPKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIFN0cmluZ0lPLmRpY3RpZnkoY2xzLnVubWFuZ2xlX2tleXdvcmQoc3RyKG9iai5uYW1lKSksIHdyaXRlciwgdG9fZXh0ZW5kKQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX2VudW12YWwsIG51bGxhYmxlKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9yZWFkX2VudW12YWwoY2xzLCBiLCByKToKLSAgICAgICAgZW51bV9uYW1lID0gci50b09iamVjdChiKQotICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlW2VudW1fbmFtZV0KLQotCi1jbGFzcyBCYXJyaWVySU8oX0VudW1JTyk6Ci0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmJhcnJpZXIKLSAgICBweXRob25fdHlwZSA9IEJhcnJpZXIKLQotCi1jbGFzcyBDYXJkaW5hbGl0eUlPKF9FbnVtSU8pOgotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5jYXJkaW5hbGl0eQotICAgIHB5dGhvbl90eXBlID0gQ2FyZGluYWxpdHkKLQotCi1jbGFzcyBDb2x1bW5JTyhfRW51bUlPKToKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuY29sdW1uCi0gICAgcHl0aG9uX3R5cGUgPSBDb2x1bW4KLQotCi1jbGFzcyBEaXJlY3Rpb25JTyhfRW51bUlPKToKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuZGlyZWN0aW9uCi0gICAgcHl0aG9uX3R5cGUgPSBEaXJlY3Rpb24KLQotCi1jbGFzcyBPcGVyYXRvcklPKF9FbnVtSU8pOgotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5vcGVyYXRvcgotICAgIHB5dGhvbl90eXBlID0gT3BlcmF0b3IKLQotCi1jbGFzcyBPcmRlcklPKF9FbnVtSU8pOgotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5vcmRlcgotICAgIHB5dGhvbl90eXBlID0gT3JkZXIKLQotCi1jbGFzcyBQaWNrSU8oX0VudW1JTyk6Ci0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLnBpY2sKLSAgICBweXRob25fdHlwZSA9IFBpY2sKLQotCi1jbGFzcyBQb3BJTyhfRW51bUlPKToKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUucG9wCi0gICAgcHl0aG9uX3R5cGUgPSBQb3AKLQotCi1jbGFzcyBCaW5kaW5nSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLQotICAgIHB5dGhvbl90eXBlID0gQmluZGluZwotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5iaW5kaW5nCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIFN0cmluZ0lPLmRpY3RpZnkob2JqLmtleSwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQotICAgICAgICB3cml0ZXIudG9EaWN0KG9iai52YWx1ZSwgdG9fZXh0ZW5kKQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IEJpbmRpbmcoci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRPYmplY3QoYikpLCBudWxsYWJsZSkKLQotCi1jbGFzcyBCeXRlY29kZUlPKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBCeXRlY29kZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5ieXRlY29kZQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlciwgdG9fZXh0ZW5kLCBhc192YWx1ZT1GYWxzZSwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQotICAgICAgICBiYyA9IG9iai5ieXRlY29kZSBpZiBpc2luc3RhbmNlKG9iaiwgVHJhdmVyc2FsKSBlbHNlIG9iagotICAgICAgICB0b19leHRlbmQuZXh0ZW5kKGludDMyX3BhY2sobGVuKGJjLnN0ZXBfaW5zdHJ1Y3Rpb25zKSkpCi0gICAgICAgIGZvciBpbnN0IGluIGJjLnN0ZXBfaW5zdHJ1Y3Rpb25zOgotICAgICAgICAgICAgaW5zdF9uYW1lLCBpbnN0X2FyZ3MgPSBpbnN0WzBdLCBpbnN0WzE6XSBpZiBsZW4oaW5zdCkgPiAxIGVsc2UgW10KLSAgICAgICAgICAgIFN0cmluZ0lPLmRpY3RpZnkoaW5zdF9uYW1lLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCi0gICAgICAgICAgICB0b19leHRlbmQuZXh0ZW5kKGludDMyX3BhY2sobGVuKGluc3RfYXJncykpKQotICAgICAgICAgICAgZm9yIGFyZyBpbiBpbnN0X2FyZ3M6Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnRvRGljdChhcmcsIHRvX2V4dGVuZCkKLQotICAgICAgICB0b19leHRlbmQuZXh0ZW5kKGludDMyX3BhY2sobGVuKGJjLnNvdXJjZV9pbnN0cnVjdGlvbnMpKSkKLSAgICAgICAgZm9yIGluc3QgaW4gYmMuc291cmNlX2luc3RydWN0aW9uczoKLSAgICAgICAgICAgIGluc3RfbmFtZSwgaW5zdF9hcmdzID0gaW5zdFswXSwgaW5zdFsxOl0gaWYgbGVuKGluc3QpID4gMSBlbHNlIFtdCi0gICAgICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KGluc3RfbmFtZSwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQotICAgICAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQzMl9wYWNrKGxlbihpbnN0X2FyZ3MpKSkKLSAgICAgICAgICAgIGZvciBhcmcgaW4gaW5zdF9hcmdzOgotICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBUeXBlVHlwZSk6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci50b0RpY3QoR3JlbWxpblR5cGUoYXJnKCkuZnFjbiksIHRvX2V4dGVuZCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB3cml0ZXIudG9EaWN0KGFyZywgdG9fZXh0ZW5kKQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX2J5dGVjb2RlLCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF9ieXRlY29kZShjbHMsIGIsIHIpOgotICAgICAgICBieXRlY29kZSA9IEJ5dGVjb2RlKCkKLQotICAgICAgICBzdGVwX2NvdW50ID0gY2xzLnJlYWRfaW50KGIpCi0gICAgICAgIGl4ID0gMAotICAgICAgICB3aGlsZSBpeCA8IHN0ZXBfY291bnQ6Ci0gICAgICAgICAgICBpbnN0ID0gW3IudG9PYmplY3QoYiwgRGF0YVR5cGUuc3RyaW5nLCBGYWxzZSldCi0gICAgICAgICAgICBpbnN0X2N0ID0gY2xzLnJlYWRfaW50KGIpCi0gICAgICAgICAgICBpeSA9IDAKLSAgICAgICAgICAgIHdoaWxlIGl5IDwgaW5zdF9jdDoKLSAgICAgICAgICAgICAgICBpbnN0LmFwcGVuZChyLnJlYWRPYmplY3QoYikpCi0gICAgICAgICAgICAgICAgaXkgKz0gMQotICAgICAgICAgICAgYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3QpCi0gICAgICAgICAgICBpeCArPSAxCi0KLSAgICAgICAgc291cmNlX2NvdW50ID0gY2xzLnJlYWRfaW50KGIpCi0gICAgICAgIGl4ID0gMAotICAgICAgICB3aGlsZSBpeCA8IHNvdXJjZV9jb3VudDoKLSAgICAgICAgICAgIGluc3QgPSBbci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKV0KLSAgICAgICAgICAgIGluc3RfY3QgPSBjbHMucmVhZF9pbnQoYikKLSAgICAgICAgICAgIGl5ID0gMAotICAgICAgICAgICAgd2hpbGUgaXkgPCBpbnN0X2N0OgotICAgICAgICAgICAgICAgIGluc3QuYXBwZW5kKHIucmVhZE9iamVjdChiKSkKLSAgICAgICAgICAgICAgICBpeSArPSAxCi0gICAgICAgICAgICBieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zLmFwcGVuZChpbnN0KQotICAgICAgICAgICAgaXggKz0gMQotCi0gICAgICAgIHJldHVybiBieXRlY29kZQotCi0KLWNsYXNzIFRyYXZlcnNhbElPKEJ5dGVjb2RlSU8pOgotICAgIHB5dGhvbl90eXBlID0gR3JhcGhUcmF2ZXJzYWwKLQotCi1jbGFzcyBMYW1iZGFTZXJpYWxpemVyKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0KLSAgICBweXRob25fdHlwZSA9IEZ1bmN0aW9uVHlwZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5sYW1iZGFfCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0KLSAgICAgICAgbGFtYmRhX3Jlc3VsdCA9IG9iaigpCi0gICAgICAgIHNjcmlwdCA9IGxhbWJkYV9yZXN1bHQgaWYgaXNpbnN0YW5jZShsYW1iZGFfcmVzdWx0LCBzdHIpIGVsc2UgbGFtYmRhX3Jlc3VsdFswXQotICAgICAgICBsYW5ndWFnZSA9IHN0YXRpY3MuZGVmYXVsdF9sYW1iZGFfbGFuZ3VhZ2UgaWYgaXNpbnN0YW5jZShsYW1iZGFfcmVzdWx0LCBzdHIpIGVsc2UgbGFtYmRhX3Jlc3VsdFsxXQotCi0gICAgICAgIFN0cmluZ0lPLmRpY3RpZnkobGFuZ3VhZ2UsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKLQotICAgICAgICBzY3JpcHRfY2xlYW5lZCA9IHNjcmlwdAotICAgICAgICBzY3JpcHRfYXJncyA9IC0xCi0KLSAgICAgICAgaWYgbGFuZ3VhZ2UgPT0gImdyZW1saW4tanl0aG9uIiBvciBsYW5ndWFnZSA9PSAiZ3JlbWxpbi1weXRob24iOgotICAgICAgICAgICAgaWYgbm90IHNjcmlwdC5zdHJpcCgpLnN0YXJ0c3dpdGgoImxhbWJkYSIpOgotICAgICAgICAgICAgICAgIHNjcmlwdF9jbGVhbmVkID0gImxhbWJkYSAiICsgc2NyaXB0Ci0gICAgICAgICAgICBzY3JpcHRfYXJncyA9IHNpeC5nZXRfZnVuY3Rpb25fY29kZShldmFsKHNjcmlwdF9jbGVhbmVkKSkuY29fYXJnY291bnQKLSAgICAgICAgZWxpZiBsYW5ndWFnZSA9PSAiZ3JlbWxpbi1ncm9vdnkiIGFuZCAiLT4iIGluIHNjcmlwdDoKLSAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgYWRkZWQgcGFyYW1ldGVycyB0byB0aGUgZ3Jvb3Z5IGNsb3N1cmUgdGhlbiB3ZSBjYW4gZWFzaWx5IGRldGVjdCBvbmUgb3IgdHdvCi0gICAgICAgICAgICAjIGFyZyBsYW1iZGFzIC0gaWYgd2UgY2FuJ3QgZGV0ZWN0IDEgb3IgMiB0aGVuIHdlIGp1c3QgZ28gd2l0aCAidW5rbm93biIKLSAgICAgICAgICAgIGFyZ3MgPSBzY3JpcHRbMDpzY3JpcHQuZmluZCgiLT4iKV0KLSAgICAgICAgICAgIHNjcmlwdF9hcmdzID0gMiBpZiAiLCIgaW4gYXJncyBlbHNlIDEKLQotICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KHNjcmlwdF9jbGVhbmVkLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhzY3JpcHRfYXJncykpCi0KLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0KLWNsYXNzIFBTZXJpYWxpemVyKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLnAKLSAgICBweXRob25fdHlwZSA9IFAKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLQotICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KG9iai5vcGVyYXRvciwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQotCi0gICAgICAgIGFyZ3MgPSBbXQotICAgICAgICBpZiBvYmoub3RoZXIgaXMgTm9uZToKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLnZhbHVlLCBMaXN0VHlwZSk6Ci0gICAgICAgICAgICAgICAgYXJncyA9IG9iai52YWx1ZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBhcmdzLmFwcGVuZChvYmoudmFsdWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhcmdzLmFwcGVuZChvYmoudmFsdWUpCi0gICAgICAgICAgICBhcmdzLmFwcGVuZChvYmoub3RoZXIpCi0KLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQzMl9wYWNrKGxlbihhcmdzKSkpCi0gICAgICAgIGZvciBhIGluIGFyZ3M6Ci0gICAgICAgICAgICB3cml0ZXIudG9EaWN0KGEsIHRvX2V4dGVuZCkKLQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLQotY2xhc3MgU2NvcGVJTyhfRW51bUlPKToKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuc2NvcGUKLSAgICBweXRob25fdHlwZSA9IFNjb3BlCi0KLQotY2xhc3MgVElPKF9FbnVtSU8pOgotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS50Ci0gICAgcHl0aG9uX3R5cGUgPSBUCi0KLQotY2xhc3MgVHJhdmVyc2VySU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudHJhdmVyc2VyCi0gICAgcHl0aG9uX3R5cGUgPSBUcmF2ZXJzZXIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQ2NF9wYWNrKG9iai5idWxrKSkKLSAgICAgICAgd3JpdGVyLnRvRGljdChvYmoub2JqZWN0LCB0b19leHRlbmQpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfdHJhdmVyc2VyLCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF90cmF2ZXJzZXIoY2xzLCBiLCByKToKLSAgICAgICAgYnVsayA9IGludDY0X3VucGFjayhiLnJlYWQoOCkpCi0gICAgICAgIG9iaiA9IHIucmVhZE9iamVjdChiKQotICAgICAgICByZXR1cm4gVHJhdmVyc2VyKG9iaiwgYnVsaz1idWxrKQotCi0KLWNsYXNzIEJ5dGVJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gU2luZ2xlQnl0ZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5ieXRlCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50OF9wYWNrKG9iaikpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIGIsIHI6IGludC5fX25ld19fKFNpbmdsZUJ5dGUsIGludDhfdW5wYWNrKGIucmVhZCgxKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGUpCi0KLQotY2xhc3MgQnl0ZUJ1ZmZlcklPKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBCeXRlQnVmZmVyVHlwZQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5ieXRlYnVmZmVyCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhsZW4ob2JqKSkpCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQob2JqKQotICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX2J5dGVidWZmZXIsIG51bGxhYmxlKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9yZWFkX2J5dGVidWZmZXIoY2xzLCBiLCByKToKLSAgICAgICAgc2l6ZSA9IGNscy5yZWFkX2ludChiKQotICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclR5cGUoYi5yZWFkKHNpemUpKQotCi0KLWNsYXNzIEJvb2xlYW5JTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gYm9vbAotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5ib29sZWFuCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50OF9wYWNrKDB4MDEgaWYgb2JqIGVsc2UgMHgwMCkpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgotICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIGIsIHI6IFRydWUgaWYgaW50OF91bnBhY2soYi5yZWFkKDEpKSA9PSAweDAxIGVsc2UgRmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsYWJsZSkKLQotCi1jbGFzcyBUZXh0UFNlcmlhbGl6ZXIoX0dyYXBoQmluYXJ5VHlwZUlPKToKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudGV4dHAKLSAgICBweXRob25fdHlwZSA9IFRleHRQCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0KLSAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmoub3BlcmF0b3IsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKLQotICAgICAgICBhcmdzID0gW10KLSAgICAgICAgaWYgb2JqLm90aGVyIGlzIE5vbmU6Ci0gICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iai52YWx1ZSwgTGlzdFR5cGUpOgotICAgICAgICAgICAgICAgIGFyZ3MgPSBvYmoudmFsdWUKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgYXJncy5hcHBlbmQob2JqLnZhbHVlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYXJncy5hcHBlbmQob2JqLnZhbHVlKQotICAgICAgICAgICAgYXJncy5hcHBlbmQob2JqLm90aGVyKQotCi0gICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhsZW4oYXJncykpKQotICAgICAgICBmb3IgYSBpbiBhcmdzOgotICAgICAgICAgICAgd3JpdGVyLnRvRGljdChhLCB0b19leHRlbmQpCi0KLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0KLWNsYXNzIEJ1bGtTZXREZXNlcmlhbGl6ZXIoX0dyYXBoQmluYXJ5VHlwZUlPKToKLQotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5idWxrc2V0Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX2J1bGtzZXQsIG51bGxhYmxlKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9yZWFkX2J1bGtzZXQoY2xzLCBiLCByKToKLSAgICAgICAgc2l6ZSA9IGNscy5yZWFkX2ludChiKQotICAgICAgICB0aGVfbGlzdCA9IFtdCi0gICAgICAgIHdoaWxlIHNpemUgPiAwOgotICAgICAgICAgICAgaXRtID0gci5yZWFkT2JqZWN0KGIpCi0gICAgICAgICAgICBidWxrID0gaW50NjRfdW5wYWNrKGIucmVhZCg4KSkKLSAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKGJ1bGspOgotICAgICAgICAgICAgICAgIHRoZV9saXN0LmFwcGVuZChpdG0pICAgICAgICAgICAgCi0gICAgICAgICAgICBzaXplID0gc2l6ZSAtIDEKLQotICAgICAgICByZXR1cm4gdGhlX2xpc3QKLQotCi1jbGFzcyBNZXRyaWNzRGVzZXJpYWxpemVyKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0KLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUubWV0cmljcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF9tZXRyaWNzLCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF9tZXRyaWNzKGNscywgYiwgcik6Ci0gICAgICAgIG1ldHJpY2lkID0gci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKQotICAgICAgICBuYW1lID0gci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKQotICAgICAgICBkdXJhdGlvbiA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUubG9uZywgbnVsbGFibGU9RmFsc2UpCi0gICAgICAgIGNvdW50cyA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUubWFwLCBudWxsYWJsZT1GYWxzZSkKLSAgICAgICAgYW5ub3RhdGlvbnMgPSByLnRvT2JqZWN0KGIsIERhdGFUeXBlLm1hcCwgbnVsbGFibGU9RmFsc2UpCi0gICAgICAgIG1ldHJpY3MgPSByLnRvT2JqZWN0KGIsIERhdGFUeXBlLmxpc3QsIG51bGxhYmxlPUZhbHNlKQotCi0gICAgICAgIHJldHVybiB7ImlkIjogbWV0cmljaWQsCi0gICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAotICAgICAgICAgICAgICAgICJkdXIiOiBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAiY291bnRzIjogY291bnRzLAotICAgICAgICAgICAgICAgICJhbm5vdGF0aW9ucyI6IGFubm90YXRpb25zLAotICAgICAgICAgICAgICAgICJtZXRyaWNzIjogbWV0cmljc30KLQotCi1jbGFzcyBUcmF2ZXJzYWxNZXRyaWNzRGVzZXJpYWxpemVyKF9HcmFwaEJpbmFyeVR5cGVJTyk6Ci0KLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudHJhdmVyc2FsbWV0cmljcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF90cmF2ZXJzYWxtZXRyaWNzLCBudWxsYWJsZSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfcmVhZF90cmF2ZXJzYWxtZXRyaWNzKGNscywgYiwgcik6Ci0gICAgICAgIGR1cmF0aW9uID0gci50b09iamVjdChiLCBEYXRhVHlwZS5sb25nLCBudWxsYWJsZT1GYWxzZSkKLSAgICAgICAgbWV0cmljcyA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUubGlzdCwgbnVsbGFibGU9RmFsc2UpCi0KLSAgICAgICAgcmV0dXJuIHsiZHVyIjogZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgIm1ldHJpY3MiOiBtZXRyaWNzfQotCi0KLWNsYXNzIENsYXNzU2VyaWFsaXplcihfR3JhcGhCaW5hcnlUeXBlSU8pOgotICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5jbGF6egotICAgIHB5dGhvbl90eXBlID0gR3JlbWxpblR5cGUKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgotICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKLSAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmouZ3JlbWxpbl90eXBlLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotCi1jbGFzcyBUcmF2ZXJzYWxTdHJhdGVneVNlcmlhbGl6ZXIoX0dyYXBoQmluYXJ5VHlwZUlPKToKLSAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudHJhdmVyc2Fsc3RyYXRlZ3kKLSAgICBweXRob25fdHlwZSA9IFRyYXZlcnNhbFN0cmF0ZWd5Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0KLSAgICAgICAgQ2xhc3NTZXJpYWxpemVyLmRpY3RpZnkoR3JlbWxpblR5cGUob2JqLmZxY24pLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCi0gICAgICAgIGNvbmYgPSB7azogY2xzLl9jb252ZXJ0KHYpIGZvciBrLCB2IGluIG9iai5jb25maWd1cmF0aW9uLml0ZW1zKCl9Ci0gICAgICAgIE1hcElPLmRpY3RpZnkoY29uZiwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQotCi0gICAgICAgIHJldHVybiB0b19leHRlbmQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfY29udmVydChjbHMsIHYpOgotICAgICAgICByZXR1cm4gdi5ieXRlY29kZSBpZiBpc2luc3RhbmNlKHYsIFRyYXZlcnNhbCkgZWxzZSB2Ci0KLQotY2xhc3MgRHVyYXRpb25JTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gdGltZWRlbHRhCi0gICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmR1cmF0aW9uCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKLSAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCi0gICAgICAgIExvbmdJTy5kaWN0aWZ5KG9iai5zZWNvbmRzLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCi0gICAgICAgIEludElPLmRpY3RpZnkob2JqLm1pY3Jvc2Vjb25kcyAqIDEwMDAsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKLSAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6Ci0gICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF9kdXJhdGlvbiwgbnVsbGFibGUpCi0gICAgCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9yZWFkX2R1cmF0aW9uKGNscywgYiwgcik6Ci0gICAgICAgIHNlY29uZHMgPSByLnRvT2JqZWN0KGIsIERhdGFUeXBlLmxvbmcsIEZhbHNlKQotICAgICAgICBuYW5vcyA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUuaW50LCBGYWxzZSkKLSAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShzZWNvbmRzPXNlY29uZHMsIG1pY3Jvc2Vjb25kcz1uYW5vcyAvIDEwMDApCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uVjJkMC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb25WMmQwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTA2ZGJhLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb25WMmQwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaW1wb3J0IGNhbGVuZGFyCi1pbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBqc29uCi1pbXBvcnQgdXVpZAotaW1wb3J0IG1hdGgKLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Ci1mcm9tIGRlY2ltYWwgaW1wb3J0ICoKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQotCi1pbXBvcnQgc2l4Ci1mcm9tIGFlbnVtIGltcG9ydCBFbnVtCi1mcm9tIGlzb2RhdGUgaW1wb3J0IHBhcnNlX2R1cmF0aW9uLCBkdXJhdGlvbl9pc29mb3JtYXQKLQotZnJvbSBncmVtbGluX3B5dGhvbiBpbXBvcnQgc3RhdGljcwotZnJvbSBncmVtbGluX3B5dGhvbi5zdGF0aWNzIGltcG9ydCBGbG9hdFR5cGUsIEZ1bmN0aW9uVHlwZSwgSW50VHlwZSwgTG9uZ1R5cGUsIFR5cGVUeXBlLCBTaW5nbGVCeXRlLCBCeXRlQnVmZmVyVHlwZSwgU2luZ2xlQ2hhcgotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgQmluZGluZywgQnl0ZWNvZGUsIFAsIFRleHRQLCBUcmF2ZXJzYWwsIFRyYXZlcnNlciwgVHJhdmVyc2FsU3RyYXRlZ3kKLWZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBFZGdlLCBQcm9wZXJ0eSwgVmVydGV4LCBWZXJ0ZXhQcm9wZXJ0eSwgUGF0aAotCi0jIFdoZW4gd2UgZmFsbCBiYWNrIHRvIGEgc3VwZXJjbGFzcydzIHNlcmlhbGl6ZXIsIHdlIGl0ZXJhdGUgb3ZlciB0aGlzIG1hcC4KLSMgV2Ugd2FudCB0aGF0IGl0ZXJhdGlvbiBvcmRlciB0byBiZSBjb25zaXN0ZW50LCBzbyB3ZSB1c2UgYW4gT3JkZXJlZERpY3QsCi0jIG5vdCBhIGRpY3QuCi1fc2VyaWFsaXplcnMgPSBPcmRlcmVkRGljdCgpCi1fZGVzZXJpYWxpemVycyA9IHt9Ci0KLQotY2xhc3MgR3JhcGhTT05UeXBlVHlwZSh0eXBlKToKLSAgICBkZWYgX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBkY3QpOgotICAgICAgICBjbHMgPSBzdXBlcihHcmFwaFNPTlR5cGVUeXBlLCBtY3MpLl9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGN0KQotICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6Ci0gICAgICAgICAgICBpZiBjbHMucHl0aG9uX3R5cGU6Ci0gICAgICAgICAgICAgICAgX3NlcmlhbGl6ZXJzW2Nscy5weXRob25fdHlwZV0gPSBjbHMKLSAgICAgICAgICAgIGlmIGNscy5ncmFwaHNvbl90eXBlOgotICAgICAgICAgICAgICAgIF9kZXNlcmlhbGl6ZXJzW2Nscy5ncmFwaHNvbl90eXBlXSA9IGNscwotICAgICAgICByZXR1cm4gY2xzCi0KLQotY2xhc3MgR3JhcGhTT05VdGlsKG9iamVjdCk6Ci0gICAgVFlQRV9LRVkgPSAiQHR5cGUiCi0gICAgVkFMVUVfS0VZID0gIkB2YWx1ZSIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB0eXBlZFZhbHVlKGNscywgdHlwZV9uYW1lLCB2YWx1ZSwgcHJlZml4PSJnIik6Ci0gICAgICAgIG91dCA9IHtjbHMuVFlQRV9LRVk6IGNscy5mb3JtYXRUeXBlKHByZWZpeCwgdHlwZV9uYW1lKX0KLSAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBvdXRbY2xzLlZBTFVFX0tFWV0gPSB2YWx1ZQotICAgICAgICByZXR1cm4gb3V0Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZm9ybWF0VHlwZShjbHMsIHByZWZpeCwgdHlwZV9uYW1lKToKLSAgICAgICAgcmV0dXJuICIlczolcyIgJSAocHJlZml4LCB0eXBlX25hbWUpCi0KLQotIyBSZWFkL1dyaXRlIGNsYXNzZXMgc3BsaXQgdG8gZm9sbG93IHByZWNlZGVuY2Ugb2YgdGhlIEphdmEgQVBJCi1jbGFzcyBHcmFwaFNPTldyaXRlcihvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJpYWxpemVyX21hcD1Ob25lKToKLSAgICAgICAgIiIiCi0gICAgICAgIDpwYXJhbSBzZXJpYWxpemVyX21hcDogbWFwIGZyb20gUHl0aG9uIHR5cGUgdG8gc2VyaWFsaXplciBpbnN0YW5jZSBpbXBsZW1lbnRpbmcgYGRpY3RpZnlgCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLnNlcmlhbGl6ZXJzID0gX3NlcmlhbGl6ZXJzLmNvcHkoKQotICAgICAgICBpZiBzZXJpYWxpemVyX21hcDoKLSAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplcnMudXBkYXRlKHNlcmlhbGl6ZXJfbWFwKQotCi0gICAgZGVmIHdyaXRlT2JqZWN0KHNlbGYsIG9iamVjdERhdGEpOgotICAgICAgICAjIHRvIEpTT04KLSAgICAgICAgcmV0dXJuIGpzb24uZHVtcHMoc2VsZi50b0RpY3Qob2JqZWN0RGF0YSksIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKLQotICAgIGRlZiB0b0RpY3Qoc2VsZiwgb2JqKToKLSAgICAgICAgIiIiCi0gICAgICAgIEVuY29kZXMgcHl0aG9uIG9iamVjdHMgaW4gR3JhcGhTT04gdHlwZS10YWdnZWQgZGljdCB2YWx1ZXMKLSAgICAgICAgIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnNlcmlhbGl6ZXJzW3R5cGUob2JqKV0uZGljdGlmeShvYmosIHNlbGYpCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIGZvciBrZXksIHNlcmlhbGl6ZXIgaW4gc2VsZi5zZXJpYWxpemVycy5pdGVtcygpOgotICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBrZXkpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplci5kaWN0aWZ5KG9iaiwgc2VsZikKLQotICAgICAgICAjIGxpc3QgYW5kIG1hcCBhcmUgdHJlYXRlZCBhcyBub3JtYWwganNvbiBvYmpzIChjb3VsZCBiZSBpc29sYXRlZCBzZXJpYWxpemVycykKLSAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIChsaXN0LCBzZXQpKToKLSAgICAgICAgICAgIHJldHVybiBbc2VsZi50b0RpY3QobykgZm9yIG8gaW4gb2JqXQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBkaWN0KToKLSAgICAgICAgICAgIHJldHVybiBkaWN0KChzZWxmLnRvRGljdChrKSwgc2VsZi50b0RpY3QodikpIGZvciBrLCB2IGluIG9iai5pdGVtcygpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIG9iagotCi0KLWNsYXNzIEdyYXBoU09OUmVhZGVyKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlc2VyaWFsaXplcl9tYXA9Tm9uZSk6Ci0gICAgICAgICIiIgotICAgICAgICA6cGFyYW0gZGVzZXJpYWxpemVyX21hcDogbWFwIGZyb20gR3JhcGhTT04gdHlwZSB0YWcgdG8gZGVzZXJpYWxpemVyIGluc3RhbmNlIGltcGxlbWVudGluZyBgb2JqZWN0aWZ5YAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5kZXNlcmlhbGl6ZXJzID0gX2Rlc2VyaWFsaXplcnMuY29weSgpCi0gICAgICAgIGlmIGRlc2VyaWFsaXplcl9tYXA6Ci0gICAgICAgICAgICBzZWxmLmRlc2VyaWFsaXplcnMudXBkYXRlKGRlc2VyaWFsaXplcl9tYXApCi0KLSAgICBkZWYgcmVhZE9iamVjdChzZWxmLCBqc29uRGF0YSk6Ci0gICAgICAgICMgZnJvbSBKU09OCi0gICAgICAgIHJldHVybiBzZWxmLnRvT2JqZWN0KGpzb24ubG9hZHMoanNvbkRhdGEpKQotCi0gICAgZGVmIHRvT2JqZWN0KHNlbGYsIG9iaik6Ci0gICAgICAgICIiIgotICAgICAgICBVbnBhY2tzIEdyYXBoU09OIHR5cGUtdGFnZ2VkIGRpY3QgdmFsdWVzIGludG8gb2JqZWN0cyBtYXBwZWQgaW4gc2VsZi5kZXNlcmlhbGl6ZXJzCi0gICAgICAgICIiIgotICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgZGljdCk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVzZXJpYWxpemVyc1tvYmpbR3JhcGhTT05VdGlsLlRZUEVfS0VZXV0ub2JqZWN0aWZ5KG9ialtHcmFwaFNPTlV0aWwuVkFMVUVfS0VZXSwgc2VsZikKLSAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAjIGxpc3QgYW5kIG1hcCBhcmUgdHJlYXRlZCBhcyBub3JtYWwganNvbiBvYmpzIChjb3VsZCBiZSBpc29sYXRlZCBkZXNlcmlhbGl6ZXJzKQotICAgICAgICAgICAgcmV0dXJuIGRpY3QoKHNlbGYudG9PYmplY3QoayksIHNlbGYudG9PYmplY3QodikpIGZvciBrLCB2IGluIG9iai5pdGVtcygpKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBsaXN0KToKLSAgICAgICAgICAgIHJldHVybiBbc2VsZi50b09iamVjdChvKSBmb3IgbyBpbiBvYmpdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gb2JqCi0KLQotQHNpeC5hZGRfbWV0YWNsYXNzKEdyYXBoU09OVHlwZVR5cGUpCi1jbGFzcyBfR3JhcGhTT05UeXBlSU8ob2JqZWN0KToKLSAgICBweXRob25fdHlwZSA9IE5vbmUKLSAgICBncmFwaHNvbl90eXBlID0gTm9uZQotCi0gICAgc3ltYm9sTWFwID0geyJnbG9iYWxfIjogImdsb2JhbCIsICJhc18iOiAiYXMiLCAiaW5fIjogImluIiwgImFuZF8iOiAiYW5kIiwKLSAgICAgICAgICAgICAgICAgIm9yXyI6ICJvciIsICJpc18iOiAiaXMiLCAibm90XyI6ICJub3QiLCAiZnJvbV8iOiAiZnJvbSIsCi0gICAgICAgICAgICAgICAgICJzZXRfIjogInNldCIsICJsaXN0XyI6ICJsaXN0IiwgImFsbF8iOiAiYWxsIiwgIndpdGhfIjogIndpdGgiLAotICAgICAgICAgICAgICAgICAiZmlsdGVyXyI6ICJmaWx0ZXIiLCAiaWRfIjogImlkIiwgIm1heF8iOiAibWF4IiwgIm1pbl8iOiAibWluIiwgInN1bV8iOiAic3VtIn0KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB1bm1hbmdsZUtleXdvcmQoY2xzLCBzeW1ib2wpOgotICAgICAgICByZXR1cm4gY2xzLnN5bWJvbE1hcC5nZXQoc3ltYm9sLCBzeW1ib2wpCi0KLSAgICBkZWYgZGljdGlmeShzZWxmLCBvYmosIHdyaXRlcik6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQotCi0gICAgZGVmIG9iamVjdGlmeShzZWxmLCBkLCByZWFkZXIpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLQotCi1jbGFzcyBfQnl0ZWNvZGVTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9kaWN0aWZ5X2luc3RydWN0aW9ucyhjbHMsIGluc3RydWN0aW9ucywgd3JpdGVyKToKLSAgICAgICAgb3V0ID0gW10KLSAgICAgICAgZm9yIGluc3RydWN0aW9uIGluIGluc3RydWN0aW9uczoKLSAgICAgICAgICAgIGluc3QgPSBbaW5zdHJ1Y3Rpb25bMF1dCi0gICAgICAgICAgICBpbnN0LmV4dGVuZCh3cml0ZXIudG9EaWN0KGFyZykgZm9yIGFyZyBpbiBpbnN0cnVjdGlvblsxOl0pCi0gICAgICAgICAgICBvdXQuYXBwZW5kKGluc3QpCi0gICAgICAgIHJldHVybiBvdXQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgYnl0ZWNvZGUsIHdyaXRlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UoYnl0ZWNvZGUsIFRyYXZlcnNhbCk6Ci0gICAgICAgICAgICBieXRlY29kZSA9IGJ5dGVjb2RlLmJ5dGVjb2RlCi0gICAgICAgIG91dCA9IHt9Ci0gICAgICAgIGlmIGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnM6Ci0gICAgICAgICAgICBvdXRbInNvdXJjZSJdID0gY2xzLl9kaWN0aWZ5X2luc3RydWN0aW9ucyhieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zLCB3cml0ZXIpCi0gICAgICAgIGlmIGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zOgotICAgICAgICAgICAgb3V0WyJzdGVwIl0gPSBjbHMuX2RpY3RpZnlfaW5zdHJ1Y3Rpb25zKGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zLCB3cml0ZXIpCi0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiQnl0ZWNvZGUiLCBvdXQpCi0KLWNsYXNzIFRyYXZlcnNhbFNlcmlhbGl6ZXIoX0J5dGVjb2RlU2VyaWFsaXplcik6Ci0gICAgcHl0aG9uX3R5cGUgPSBUcmF2ZXJzYWwKLQotCi1jbGFzcyBCeXRlY29kZVNlcmlhbGl6ZXIoX0J5dGVjb2RlU2VyaWFsaXplcik6Ci0gICAgcHl0aG9uX3R5cGUgPSBCeXRlY29kZQotCi0KLWNsYXNzIFZlcnRleFNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IFZlcnRleAotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpWZXJ0ZXgiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIHZlcnRleCwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJWZXJ0ZXgiLCB7ImlkIjogd3JpdGVyLnRvRGljdCh2ZXJ0ZXguaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB3cml0ZXIudG9EaWN0KHZlcnRleC5sYWJlbCl9KQotCi0KLWNsYXNzIEVkZ2VTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBFZGdlCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOkVkZ2UiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIGVkZ2UsIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiRWRnZSIsIHsiaWQiOiB3cml0ZXIudG9EaWN0KGVkZ2UuaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dFYiOiB3cml0ZXIudG9EaWN0KGVkZ2Uub3V0Vi5pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0VkxhYmVsIjogd3JpdGVyLnRvRGljdChlZGdlLm91dFYubGFiZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogd3JpdGVyLnRvRGljdChlZGdlLmxhYmVsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpblYiOiB3cml0ZXIudG9EaWN0KGVkZ2UuaW5WLmlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpblZMYWJlbCI6IHdyaXRlci50b0RpY3QoZWRnZS5pblYubGFiZWwpfSkKLQotCi1jbGFzcyBWZXJ0ZXhQcm9wZXJ0eVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IFZlcnRleFByb3BlcnR5Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlZlcnRleFByb3BlcnR5IgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCB2ZXJ0ZXhfcHJvcGVydHksIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiVmVydGV4UHJvcGVydHkiLCB7ImlkIjogd3JpdGVyLnRvRGljdCh2ZXJ0ZXhfcHJvcGVydHkuaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHdyaXRlci50b0RpY3QodmVydGV4X3Byb3BlcnR5LmxhYmVsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB3cml0ZXIudG9EaWN0KHZlcnRleF9wcm9wZXJ0eS52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnRleCI6IHdyaXRlci50b0RpY3QodmVydGV4X3Byb3BlcnR5LnZlcnRleC5pZCl9KQotCi0KLWNsYXNzIFByb3BlcnR5U2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gUHJvcGVydHkKLSAgICBncmFwaHNvbl90eXBlID0gImc6UHJvcGVydHkiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIHByb3BlcnR5LCB3cml0ZXIpOgotICAgICAgICBlbGVtZW50RGljdCA9IHdyaXRlci50b0RpY3QocHJvcGVydHkuZWxlbWVudCkKLSAgICAgICAgaWYgZWxlbWVudERpY3QgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB2YWx1ZURpY3QgPSBlbGVtZW50RGljdFsiQHZhbHVlIl0KLSAgICAgICAgICAgIGlmICJvdXRWTGFiZWwiIGluIHZhbHVlRGljdDoKLSAgICAgICAgICAgICAgICBkZWwgdmFsdWVEaWN0WyJvdXRWTGFiZWwiXQotICAgICAgICAgICAgaWYgImluVkxhYmVsIiBpbiB2YWx1ZURpY3Q6Ci0gICAgICAgICAgICAgICAgZGVsIHZhbHVlRGljdFsiaW5WTGFiZWwiXQotICAgICAgICAgICAgaWYgInByb3BlcnRpZXMiIGluIHZhbHVlRGljdDoKLSAgICAgICAgICAgICAgICBkZWwgdmFsdWVEaWN0WyJwcm9wZXJ0aWVzIl0KLSAgICAgICAgICAgIGlmICJ2YWx1ZSIgaW4gdmFsdWVEaWN0OgotICAgICAgICAgICAgICAgIGRlbCB2YWx1ZURpY3RbInZhbHVlIl0KLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJQcm9wZXJ0eSIsIHsia2V5Ijogd3JpdGVyLnRvRGljdChwcm9wZXJ0eS5rZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHdyaXRlci50b0RpY3QocHJvcGVydHkudmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50IjogZWxlbWVudERpY3R9KQotCi0KLWNsYXNzIFRyYXZlcnNhbFN0cmF0ZWd5U2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gVHJhdmVyc2FsU3RyYXRlZ3kKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgc3RyYXRlZ3ksIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShzdHJhdGVneS5zdHJhdGVneV9uYW1lLCB3cml0ZXIudG9EaWN0KHN0cmF0ZWd5LmNvbmZpZ3VyYXRpb24pKQotCi0KLWNsYXNzIFRyYXZlcnNlcklPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBUcmF2ZXJzZXIKLSAgICBncmFwaHNvbl90eXBlID0gImc6VHJhdmVyc2VyIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCB0cmF2ZXJzZXIsIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiVHJhdmVyc2VyIiwgeyJ2YWx1ZSI6IHdyaXRlci50b0RpY3QodHJhdmVyc2VyLm9iamVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWxrIjogd3JpdGVyLnRvRGljdCh0cmF2ZXJzZXIuYnVsayl9KQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIHJldHVybiBUcmF2ZXJzZXIocmVhZGVyLnRvT2JqZWN0KGRbInZhbHVlIl0pLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci50b09iamVjdChkWyJidWxrIl0pKQotCi0KLWNsYXNzIEVudW1TZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBFbnVtCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIGVudW0sIF8pOgotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLnVubWFuZ2xlS2V5d29yZCh0eXBlKGVudW0pLl9fbmFtZV9fKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy51bm1hbmdsZUtleXdvcmQoc3RyKGVudW0ubmFtZSkpKQotCi0KLWNsYXNzIFBTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBQCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIHAsIHdyaXRlcik6Ci0gICAgICAgIG91dCA9IHsicHJlZGljYXRlIjogcC5vcGVyYXRvciwKLSAgICAgICAgICAgICAgICJ2YWx1ZSI6IFt3cml0ZXIudG9EaWN0KHAudmFsdWUpLCB3cml0ZXIudG9EaWN0KHAub3RoZXIpXSBpZiBwLm90aGVyIGlzIG5vdCBOb25lIGVsc2UKLSAgICAgICAgICAgICAgIHdyaXRlci50b0RpY3QocC52YWx1ZSl9Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiUCIsIG91dCkKLQotCi1jbGFzcyBUZXh0UFNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IFRleHRQCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIHAsIHdyaXRlcik6Ci0gICAgICAgIG91dCA9IHsicHJlZGljYXRlIjogcC5vcGVyYXRvciwKLSAgICAgICAgICAgICAgICJ2YWx1ZSI6IFt3cml0ZXIudG9EaWN0KHAudmFsdWUpLCB3cml0ZXIudG9EaWN0KHAub3RoZXIpXSBpZiBwLm90aGVyIGlzIG5vdCBOb25lIGVsc2UKLSAgICAgICAgICAgICAgIHdyaXRlci50b0RpY3QocC52YWx1ZSl9Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiVGV4dFAiLCBvdXQpCi0KLQotY2xhc3MgQmluZGluZ1NlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IEJpbmRpbmcKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgYmluZGluZywgd3JpdGVyKToKLSAgICAgICAgb3V0ID0geyJrZXkiOiBiaW5kaW5nLmtleSwKLSAgICAgICAgICAgICAgICJ2YWx1ZSI6IHdyaXRlci50b0RpY3QoYmluZGluZy52YWx1ZSl9Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiQmluZGluZyIsIG91dCkKLQotCi1jbGFzcyBMYW1iZGFTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBGdW5jdGlvblR5cGUKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgbGFtYmRhX29iamVjdCwgd3JpdGVyKToKLSAgICAgICAgbGFtYmRhX3Jlc3VsdCA9IGxhbWJkYV9vYmplY3QoKQotICAgICAgICBzY3JpcHQgPSBsYW1iZGFfcmVzdWx0IGlmIGlzaW5zdGFuY2UobGFtYmRhX3Jlc3VsdCwgc3RyKSBlbHNlIGxhbWJkYV9yZXN1bHRbMF0KLSAgICAgICAgbGFuZ3VhZ2UgPSBzdGF0aWNzLmRlZmF1bHRfbGFtYmRhX2xhbmd1YWdlIGlmIGlzaW5zdGFuY2UobGFtYmRhX3Jlc3VsdCwgc3RyKSBlbHNlIGxhbWJkYV9yZXN1bHRbMV0KLSAgICAgICAgb3V0ID0geyJzY3JpcHQiOiBzY3JpcHQsCi0gICAgICAgICAgICAgICAibGFuZ3VhZ2UiOiBsYW5ndWFnZX0KLSAgICAgICAgaWYgbGFuZ3VhZ2UgPT0gImdyZW1saW4tanl0aG9uIiBvciBsYW5ndWFnZSA9PSAiZ3JlbWxpbi1weXRob24iOgotICAgICAgICAgICAgaWYgbm90IHNjcmlwdC5zdHJpcCgpLnN0YXJ0c3dpdGgoImxhbWJkYSIpOgotICAgICAgICAgICAgICAgIHNjcmlwdCA9ICJsYW1iZGEgIiArIHNjcmlwdAotICAgICAgICAgICAgICAgIG91dFsic2NyaXB0Il0gPSBzY3JpcHQKLSAgICAgICAgICAgIG91dFsiYXJndW1lbnRzIl0gPSBzaXguZ2V0X2Z1bmN0aW9uX2NvZGUoZXZhbChvdXRbInNjcmlwdCJdKSkuY29fYXJnY291bnQKLSAgICAgICAgZWxpZiBsYW5ndWFnZSA9PSAiZ3JlbWxpbi1ncm9vdnkiIGFuZCAiLT4iIGluIHNjcmlwdDoKLSAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgYWRkZWQgcGFyYW1ldGVycyB0byB0aGUgZ3Jvb3Z5IGNsb3N1cmUgdGhlbiB3ZSBjYW4gZWFzaWx5IGRldGVjdCBvbmUgb3IgdHdvCi0gICAgICAgICAgICAjIGFyZyBsYW1iZGFzIC0gaWYgd2UgY2FuJ3QgZGV0ZWN0IDEgb3IgMiB0aGVuIHdlIGp1c3QgZ28gd2l0aCAidW5rbm93biIKLSAgICAgICAgICAgIGFyZ3MgPSBzY3JpcHRbMDpzY3JpcHQuZmluZCgiLT4iKV0KLSAgICAgICAgICAgIG91dFsiYXJndW1lbnRzIl0gPSAyIGlmICIsIiBpbiBhcmdzIGVsc2UgMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgb3V0WyJhcmd1bWVudHMiXSA9IC0xCi0KLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJMYW1iZGEiLCBvdXQpCi0KLQotY2xhc3MgVHlwZVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IFR5cGVUeXBlCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIHR5cCwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIHdyaXRlci50b0RpY3QodHlwKCkpCi0KLQotY2xhc3MgVVVJRElPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSB1dWlkLlVVSUQKLSAgICBncmFwaHNvbl90eXBlID0gImc6VVVJRCIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiVVVJRCIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIpOgotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgc3RyKG9iaikpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKLSAgICAgICAgcmV0dXJuIGNscy5weXRob25fdHlwZShkKQotCi0KLWNsYXNzIERhdGVJTyhfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gZGF0ZXRpbWUuZGF0ZXRpbWUKLSAgICBncmFwaHNvbl90eXBlID0gImc6RGF0ZSIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiRGF0ZSIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0aW1lc3RhbXBfc2Vjb25kcyA9IGNhbGVuZGFyLnRpbWVnbShvYmoudXRjdGltZXR1cGxlKCkpCi0gICAgICAgICAgICBwdHMgPSB0aW1lc3RhbXBfc2Vjb25kcyAqIDFlMyArIGdldGF0dHIob2JqLCAnbWljcm9zZWNvbmQnLCAwKSAvIDFlMwotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBwdHMgPSBjYWxlbmRhci50aW1lZ20ob2JqLnRpbWV0dXBsZSgpKSAqIDFlMwotCi0gICAgICAgIHRzID0gaW50KHJvdW5kKHB0cykpCi0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCB0cykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB0cywgcmVhZGVyKToKLSAgICAgICAgIyBQeXRob24gdGltZXN0YW1wIGV4cGVjdHMgc2Vjb25kcwotICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCh0cyAvIDEwMDAuMCkKLQotCi0jIEJhc2VkIG9uIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoaXMgY2xhc3MgbXVzdCBhbHdheXMgYmUgZGVjbGFyZWQgYmVmb3JlIEZsb2F0SU8uCi0jIFNlZW1zIHByZXR0eSBmcmFnaWxlIGZvciBmdXR1cmUgbWFpbnRhaW5lcnMuIE1heWJlIGxvb2sgaW50byB0aGlzLgotY2xhc3MgVGltZXN0YW1wSU8oX0dyYXBoU09OVHlwZUlPKToKLSAgICAiIiJBIHRpbWVzdGFtcCBpbiBQeXRob24gaXMgdHlwZSBmbG9hdCIiIgotICAgIHB5dGhvbl90eXBlID0gc3RhdGljcy50aW1lc3RhbXAKLSAgICBncmFwaHNvbl90eXBlID0gImc6VGltZXN0YW1wIgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJUaW1lc3RhbXAiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyKToKLSAgICAgICAgIyBKYXZhIHRpbWVzdGFtcCBleHBlY3RzIG1pbGxpc2Vjb25kcyBpbnRlZ2VyCi0gICAgICAgICMgSGF2ZSB0byB1c2UgaW50IGJlY2F1c2Ugb2YgbGVnYWN5IFB5dGhvbgotICAgICAgICB0cyA9IGludChyb3VuZChvYmogKiAxMDAwKSkKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIHRzKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIHRzLCByZWFkZXIpOgotICAgICAgICAjIFB5dGhvbiB0aW1lc3RhbXAgZXhwZWN0cyBzZWNvbmRzCi0gICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGUodHMgLyAxMDAwLjApCi0KLQotY2xhc3MgX051bWJlcklPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQotICAgICAgICAgICAgcmV0dXJuIG4KLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6Ci0gICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGUodikKLQotCi1jbGFzcyBGbG9hdElPKF9OdW1iZXJJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBGbG9hdFR5cGUKLSAgICBncmFwaHNvbl90eXBlID0gImc6RmxvYXQiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkZsb2F0IgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQotICAgICAgICAgICAgcmV0dXJuIG4KLSAgICAgICAgZWxpZiBtYXRoLmlzbmFuKG4pOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJOYU4iKQotICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPiAwOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJJbmZpbml0eSIpCi0gICAgICAgIGVsaWYgbWF0aC5pc2luZihuKSBhbmQgbiA8IDA6Ci0gICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgIi1JbmZpbml0eSIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgbikKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgotICAgICAgICAgICAgaWYgdiA9PSAnTmFOJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ25hbicpCi0gICAgICAgICAgICBlbGlmIHYgPT0gIkluZmluaXR5IjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCi0gICAgICAgICAgICBlbGlmIHYgPT0gIi1JbmZpbml0eSI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCctaW5mJykKLQotICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHYpCi0KLQotY2xhc3MgQmlnRGVjaW1hbElPKF9OdW1iZXJJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBEZWNpbWFsCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJneDpCaWdEZWNpbWFsIgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJCaWdEZWNpbWFsIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQotICAgICAgICAgICAgcmV0dXJuIG4KLSAgICAgICAgZWxpZiBtYXRoLmlzbmFuKG4pOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJOYU4iLCAiZ3giKQotICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPiAwOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJJbmZpbml0eSIsICJneCIpCi0gICAgICAgIGVsaWYgbWF0aC5pc2luZihuKSBhbmQgbiA8IDA6Ci0gICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgIi1JbmZpbml0eSIsICJneCIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgc3RyKG4pLCAiZ3giKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgotICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cik6Ci0gICAgICAgICAgICBpZiB2ID09ICdOYU4nOgotICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKCduYW4nKQotICAgICAgICAgICAgZWxpZiB2ID09ICJJbmZpbml0eSI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoJ2luZicpCi0gICAgICAgICAgICBlbGlmIHYgPT0gIi1JbmZpbml0eSI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoJy1pbmYnKQotCi0gICAgICAgIHJldHVybiBEZWNpbWFsKHYpCi0KLQotY2xhc3MgRG91YmxlSU8oRmxvYXRJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOkRvdWJsZSIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiRG91YmxlIgotCi0KLWNsYXNzIEludDY0SU8oX051bWJlcklPKToKLSAgICBweXRob25fdHlwZSA9IExvbmdUeXBlCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOkludDY0IgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJJbnQ2NCIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKLSAgICAgICAgIyBpZiB3ZSBleGNlZWQgSmF2YSBsb25nIHJhbmdlIHRoZW4gd2UgbmVlZCBhIEJpZ0ludGVnZXIKLSAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKToKLSAgICAgICAgICAgIHJldHVybiBuCi0gICAgICAgIGVsaWYgbiA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIG4gPiA5MjIzMzcyMDM2ODU0Nzc1ODA3OgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCaWdJbnRlZ2VyIiwgc3RyKG4pLCAiZ3giKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCi0KLQotY2xhc3MgQmlnSW50ZWdlcklPKEludDY0SU8pOgotICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6QmlnSW50ZWdlciIKLQotCi1jbGFzcyBJbnQzMklPKEludDY0SU8pOgotICAgIHB5dGhvbl90eXBlID0gSW50VHlwZQotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpJbnQzMiIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiSW50MzIiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6Ci0gICAgICAgICMgaWYgd2UgZXhjZWVkIEphdmEgaW50IHJhbmdlIHRoZW4gd2UgbmVlZCBhIGxvbmcKLSAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKToKLSAgICAgICAgICAgIHJldHVybiBuCi0gICAgICAgIGVsaWYgbiA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIG4gPiA5MjIzMzcyMDM2ODU0Nzc1ODA3OgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCaWdJbnRlZ2VyIiwgc3RyKG4pLCAiZ3giKQotICAgICAgICBlbGlmIG4gPCAtMjE0NzQ4MzY0OCBvciBuID4gMjE0NzQ4MzY0NzoKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiSW50NjQiLCBuKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCi0KLQotY2xhc3MgQnl0ZUlPKF9OdW1iZXJJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBTaW5nbGVCeXRlCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJneDpCeXRlIgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJCeXRlIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQotICAgICAgICAgICAgcmV0dXJuIG4KLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4sICJneCIpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6Ci0gICAgICAgIHJldHVybiBpbnQuX19uZXdfXyhTaW5nbGVCeXRlLCB2KQotCi0KLWNsYXNzIEJ5dGVCdWZmZXJJTyhfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gQnl0ZUJ1ZmZlclR5cGUKLSAgICBncmFwaHNvbl90eXBlID0gImd4OkJ5dGVCdWZmZXIiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkJ5dGVCdWZmZXIiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCAiIi5qb2luKGNocih4KSBmb3IgeCBpbiBuKSwgImd4IikKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKLSAgICAgICAgcmV0dXJuIGNscy5weXRob25fdHlwZSh2LCAidXRmOCIpCi0KLQotY2xhc3MgQ2hhcklPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBTaW5nbGVDaGFyCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJneDpDaGFyIgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJDaGFyIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgbiwgImd4IikKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKLSAgICAgICAgcmV0dXJuIHN0ci5fX25ld19fKFNpbmdsZUNoYXIsIHYpCi0KLQotY2xhc3MgRHVyYXRpb25JTyhfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gdGltZWRlbHRhCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJneDpEdXJhdGlvbiIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiRHVyYXRpb24iCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBkdXJhdGlvbl9pc29mb3JtYXQobiksICJneCIpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6Ci0gICAgICAgIHJldHVybiBwYXJzZV9kdXJhdGlvbih2KQotCi0KLWNsYXNzIFZlcnRleERlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpWZXJ0ZXgiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKLSAgICAgICAgcmV0dXJuIFZlcnRleChyZWFkZXIudG9PYmplY3QoZFsiaWQiXSksIGQuZ2V0KCJsYWJlbCIsICJ2ZXJ0ZXgiKSkKLQotCi1jbGFzcyBFZGdlRGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOkVkZ2UiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKLSAgICAgICAgcmV0dXJuIEVkZ2UocmVhZGVyLnRvT2JqZWN0KGRbImlkIl0pLAotICAgICAgICAgICAgICAgICAgICBWZXJ0ZXgocmVhZGVyLnRvT2JqZWN0KGRbIm91dFYiXSksIGQuZ2V0KCJvdXRWTGFiZWwiLCAidmVydGV4IikpLAotICAgICAgICAgICAgICAgICAgICBkLmdldCgibGFiZWwiLCAiZWRnZSIpLAotICAgICAgICAgICAgICAgICAgICBWZXJ0ZXgocmVhZGVyLnRvT2JqZWN0KGRbImluViJdKSwgZC5nZXQoImluVkxhYmVsIiwgInZlcnRleCIpKSkKLQotCi1jbGFzcyBWZXJ0ZXhQcm9wZXJ0eURlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpWZXJ0ZXhQcm9wZXJ0eSIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgotICAgICAgICB2ZXJ0ZXggPSBWZXJ0ZXgocmVhZGVyLnRvT2JqZWN0KGQuZ2V0KCJ2ZXJ0ZXgiKSkpIGlmICJ2ZXJ0ZXgiIGluIGQgZWxzZSBOb25lCi0gICAgICAgIHJldHVybiBWZXJ0ZXhQcm9wZXJ0eShyZWFkZXIudG9PYmplY3QoZFsiaWQiXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWyJsYWJlbCJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnRvT2JqZWN0KGRbInZhbHVlIl0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4KQotCi0KLWNsYXNzIFByb3BlcnR5RGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlByb3BlcnR5IgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIGVsZW1lbnQgPSByZWFkZXIudG9PYmplY3QoZFsiZWxlbWVudCJdKSBpZiAiZWxlbWVudCIgaW4gZCBlbHNlIE5vbmUKLSAgICAgICAgcmV0dXJuIFByb3BlcnR5KGRbImtleSJdLCByZWFkZXIudG9PYmplY3QoZFsidmFsdWUiXSksIGVsZW1lbnQpCi0KLQotY2xhc3MgUGF0aERlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpQYXRoIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIGxhYmVscyA9IFtzZXQobGFiZWwpIGZvciBsYWJlbCBpbiBkWyJsYWJlbHMiXV0KLSAgICAgICAgb2JqZWN0cyA9IFtyZWFkZXIudG9PYmplY3QobykgZm9yIG8gaW4gZFsib2JqZWN0cyJdXQotICAgICAgICByZXR1cm4gUGF0aChsYWJlbHMsIG9iamVjdHMpCi0KLQotY2xhc3MgVHJhdmVyc2FsTWV0cmljc0Rlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpUcmF2ZXJzYWxNZXRyaWNzIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIHJldHVybiByZWFkZXIudG9PYmplY3QoZCkKLQotCi1jbGFzcyBNZXRyaWNzRGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOk1ldHJpY3MiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKLSAgICAgICAgcmV0dXJuIHJlYWRlci50b09iamVjdChkKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9pby9ncmFwaHNvblYzZDAucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uVjNkMC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1YWNhNi4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uVjNkMC5weQorKysgL2Rldi9udWxsCkBAIC0xLDc1NSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi1pbXBvcnQgY2FsZW5kYXIKLWltcG9ydCBkYXRldGltZQotaW1wb3J0IGpzb24KLWltcG9ydCB1dWlkCi1pbXBvcnQgbWF0aAotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKLWZyb20gZGVjaW1hbCBpbXBvcnQgKgotaW1wb3J0IGxvZ2dpbmcKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQotCi1pbXBvcnQgc2l4Ci1mcm9tIGFlbnVtIGltcG9ydCBFbnVtCi1mcm9tIGlzb2RhdGUgaW1wb3J0IHBhcnNlX2R1cmF0aW9uLCBkdXJhdGlvbl9pc29mb3JtYXQKLQotZnJvbSBncmVtbGluX3B5dGhvbiBpbXBvcnQgc3RhdGljcwotZnJvbSBncmVtbGluX3B5dGhvbi5zdGF0aWNzIGltcG9ydCBGbG9hdFR5cGUsIEZ1bmN0aW9uVHlwZSwgSW50VHlwZSwgTG9uZ1R5cGUsIFR5cGVUeXBlLCBEaWN0VHlwZSwgTGlzdFR5cGUsIFNldFR5cGUsIFNpbmdsZUJ5dGUsIEJ5dGVCdWZmZXJUeXBlLCBTaW5nbGVDaGFyCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBCaW5kaW5nLCBCeXRlY29kZSwgRGlyZWN0aW9uLCBQLCBUZXh0UCwgVHJhdmVyc2FsLCBUcmF2ZXJzZXIsIFRyYXZlcnNhbFN0cmF0ZWd5LCBUCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgRWRnZSwgUHJvcGVydHksIFZlcnRleCwgVmVydGV4UHJvcGVydHksIFBhdGgKLQotbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCi0KLSMgV2hlbiB3ZSBmYWxsIGJhY2sgdG8gYSBzdXBlcmNsYXNzJ3Mgc2VyaWFsaXplciwgd2UgaXRlcmF0ZSBvdmVyIHRoaXMgbWFwLgotIyBXZSB3YW50IHRoYXQgaXRlcmF0aW9uIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQsIHNvIHdlIHVzZSBhbiBPcmRlcmVkRGljdCwKLSMgbm90IGEgZGljdC4KLV9zZXJpYWxpemVycyA9IE9yZGVyZWREaWN0KCkKLV9kZXNlcmlhbGl6ZXJzID0ge30KLQotCi1jbGFzcyBHcmFwaFNPTlR5cGVUeXBlKHR5cGUpOgotICAgIGRlZiBfX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIGRjdCk6Ci0gICAgICAgIGNscyA9IHN1cGVyKEdyYXBoU09OVHlwZVR5cGUsIG1jcykuX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBkY3QpCi0gICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKToKLSAgICAgICAgICAgIGlmIGNscy5weXRob25fdHlwZToKLSAgICAgICAgICAgICAgICBfc2VyaWFsaXplcnNbY2xzLnB5dGhvbl90eXBlXSA9IGNscwotICAgICAgICAgICAgaWYgY2xzLmdyYXBoc29uX3R5cGU6Ci0gICAgICAgICAgICAgICAgX2Rlc2VyaWFsaXplcnNbY2xzLmdyYXBoc29uX3R5cGVdID0gY2xzCi0gICAgICAgIHJldHVybiBjbHMKLQotCi1jbGFzcyBHcmFwaFNPTlV0aWwob2JqZWN0KToKLSAgICBUWVBFX0tFWSA9ICJAdHlwZSIKLSAgICBWQUxVRV9LRVkgPSAiQHZhbHVlIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHR5cGVkVmFsdWUoY2xzLCB0eXBlX25hbWUsIHZhbHVlLCBwcmVmaXg9ImciKToKLSAgICAgICAgb3V0ID0ge2Nscy5UWVBFX0tFWTogY2xzLmZvcm1hdFR5cGUocHJlZml4LCB0eXBlX25hbWUpfQotICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIG91dFtjbHMuVkFMVUVfS0VZXSA9IHZhbHVlCi0gICAgICAgIHJldHVybiBvdXQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBmb3JtYXRUeXBlKGNscywgcHJlZml4LCB0eXBlX25hbWUpOgotICAgICAgICByZXR1cm4gIiVzOiVzIiAlIChwcmVmaXgsIHR5cGVfbmFtZSkKLQotCi0jIFJlYWQvV3JpdGUgY2xhc3NlcyBzcGxpdCB0byBmb2xsb3cgcHJlY2VkZW5jZSBvZiB0aGUgSmF2YSBBUEkKLWNsYXNzIEdyYXBoU09OV3JpdGVyKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcmlhbGl6ZXJfbWFwPU5vbmUpOgotICAgICAgICAiIiIKLSAgICAgICAgOnBhcmFtIHNlcmlhbGl6ZXJfbWFwOiBtYXAgZnJvbSBQeXRob24gdHlwZSB0byBzZXJpYWxpemVyIGluc3RhbmNlIGltcGxlbWVudGluZyBgZGljdGlmeWAKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuc2VyaWFsaXplcnMgPSBfc2VyaWFsaXplcnMuY29weSgpCi0gICAgICAgIGlmIHNlcmlhbGl6ZXJfbWFwOgotICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVycy51cGRhdGUoc2VyaWFsaXplcl9tYXApCi0KLSAgICBkZWYgd3JpdGVPYmplY3Qoc2VsZiwgb2JqZWN0RGF0YSk6Ci0gICAgICAgICMgdG8gSlNPTgotICAgICAgICByZXR1cm4ganNvbi5kdW1wcyhzZWxmLnRvRGljdChvYmplY3REYXRhKSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQotCi0gICAgZGVmIHRvRGljdChzZWxmLCBvYmopOgotICAgICAgICAiIiIKLSAgICAgICAgRW5jb2RlcyBweXRob24gb2JqZWN0cyBpbiBHcmFwaFNPTiB0eXBlLXRhZ2dlZCBkaWN0IHZhbHVlcwotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2VyaWFsaXplcnNbdHlwZShvYmopXS5kaWN0aWZ5KG9iaiwgc2VsZikKLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgZm9yIGtleSwgc2VyaWFsaXplciBpbiBzZWxmLnNlcmlhbGl6ZXJzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGtleSk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVyLmRpY3RpZnkob2JqLCBzZWxmKQotCi0gICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBkaWN0KToKLSAgICAgICAgICAgIHJldHVybiBkaWN0KChzZWxmLnRvRGljdChrKSwgc2VsZi50b0RpY3QodikpIGZvciBrLCB2IGluIG9iai5pdGVtcygpKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBzZXQpOgotICAgICAgICAgICAgcmV0dXJuIHNldChbc2VsZi50b0RpY3QobykgZm9yIG8gaW4gb2JqXSkKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgbGlzdCk6Ci0gICAgICAgICAgICByZXR1cm4gW3NlbGYudG9EaWN0KG8pIGZvciBvIGluIG9ial0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBvYmoKLQotCi1jbGFzcyBHcmFwaFNPTlJlYWRlcihvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXNlcmlhbGl6ZXJfbWFwPU5vbmUpOgotICAgICAgICAiIiIKLSAgICAgICAgOnBhcmFtIGRlc2VyaWFsaXplcl9tYXA6IG1hcCBmcm9tIEdyYXBoU09OIHR5cGUgdGFnIHRvIGRlc2VyaWFsaXplciBpbnN0YW5jZSBpbXBsZW1lbnRpbmcgYG9iamVjdGlmeWAKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuZGVzZXJpYWxpemVycyA9IF9kZXNlcmlhbGl6ZXJzLmNvcHkoKQotICAgICAgICBpZiBkZXNlcmlhbGl6ZXJfbWFwOgotICAgICAgICAgICAgc2VsZi5kZXNlcmlhbGl6ZXJzLnVwZGF0ZShkZXNlcmlhbGl6ZXJfbWFwKQotCi0gICAgZGVmIHJlYWRPYmplY3Qoc2VsZiwganNvbkRhdGEpOgotICAgICAgICAjIGZyb20gSlNPTgotICAgICAgICByZXR1cm4gc2VsZi50b09iamVjdChqc29uLmxvYWRzKGpzb25EYXRhKSkKLQotICAgIGRlZiB0b09iamVjdChzZWxmLCBvYmopOgotICAgICAgICAiIiIKLSAgICAgICAgVW5wYWNrcyBHcmFwaFNPTiB0eXBlLXRhZ2dlZCBkaWN0IHZhbHVlcyBpbnRvIG9iamVjdHMgbWFwcGVkIGluIHNlbGYuZGVzZXJpYWxpemVycwotICAgICAgICAiIiIKLSAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGRpY3QpOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlc2VyaWFsaXplcnNbb2JqW0dyYXBoU09OVXRpbC5UWVBFX0tFWV1dLm9iamVjdGlmeShvYmpbR3JhcGhTT05VdGlsLlZBTFVFX0tFWV0sIHNlbGYpCi0gICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgcmV0dXJuIGRpY3QoKHNlbGYudG9PYmplY3QoayksIHNlbGYudG9PYmplY3QodikpIGZvciBrLCB2IGluIG9iai5pdGVtcygpKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBzZXQpOgotICAgICAgICAgICAgcmV0dXJuIHNldChbc2VsZi50b09iamVjdChvKSBmb3IgbyBpbiBvYmpdKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBsaXN0KToKLSAgICAgICAgICAgIHJldHVybiBbc2VsZi50b09iamVjdChvKSBmb3IgbyBpbiBvYmpdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gb2JqCi0KLQotQHNpeC5hZGRfbWV0YWNsYXNzKEdyYXBoU09OVHlwZVR5cGUpCi1jbGFzcyBfR3JhcGhTT05UeXBlSU8ob2JqZWN0KToKLSAgICBweXRob25fdHlwZSA9IE5vbmUKLSAgICBncmFwaHNvbl90eXBlID0gTm9uZQotCi0gICAgc3ltYm9sTWFwID0geyJnbG9iYWxfIjogImdsb2JhbCIsICJhc18iOiAiYXMiLCAiaW5fIjogImluIiwgImFuZF8iOiAiYW5kIiwKLSAgICAgICAgICAgICAgICAgIm9yXyI6ICJvciIsICJpc18iOiAiaXMiLCAibm90XyI6ICJub3QiLCAiZnJvbV8iOiAiZnJvbSIsCi0gICAgICAgICAgICAgICAgICJzZXRfIjogInNldCIsICJsaXN0XyI6ICJsaXN0IiwgImFsbF8iOiAiYWxsIiwgIndpdGhfIjogIndpdGgiLAotICAgICAgICAgICAgICAgICAiZmlsdGVyXyI6ICJmaWx0ZXIiLCAiaWRfIjogImlkIiwgIm1heF8iOiAibWF4IiwgIm1pbl8iOiAibWluIiwgInN1bV8iOiAic3VtIn0KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB1bm1hbmdsZUtleXdvcmQoY2xzLCBzeW1ib2wpOgotICAgICAgICByZXR1cm4gY2xzLnN5bWJvbE1hcC5nZXQoc3ltYm9sLCBzeW1ib2wpCi0KLSAgICBkZWYgZGljdGlmeShzZWxmLCBvYmosIHdyaXRlcik6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQotCi0gICAgZGVmIG9iamVjdGlmeShzZWxmLCBkLCByZWFkZXIpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLQotCi1jbGFzcyBfQnl0ZWNvZGVTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIF9kaWN0aWZ5X2luc3RydWN0aW9ucyhjbHMsIGluc3RydWN0aW9ucywgd3JpdGVyKToKLSAgICAgICAgb3V0ID0gW10KLSAgICAgICAgZm9yIGluc3RydWN0aW9uIGluIGluc3RydWN0aW9uczoKLSAgICAgICAgICAgIGluc3QgPSBbaW5zdHJ1Y3Rpb25bMF1dCi0gICAgICAgICAgICBpbnN0LmV4dGVuZCh3cml0ZXIudG9EaWN0KGFyZykgZm9yIGFyZyBpbiBpbnN0cnVjdGlvblsxOl0pCi0gICAgICAgICAgICBvdXQuYXBwZW5kKGluc3QpCi0gICAgICAgIHJldHVybiBvdXQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgYnl0ZWNvZGUsIHdyaXRlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UoYnl0ZWNvZGUsIFRyYXZlcnNhbCk6Ci0gICAgICAgICAgICBieXRlY29kZSA9IGJ5dGVjb2RlLmJ5dGVjb2RlCi0gICAgICAgIG91dCA9IHt9Ci0gICAgICAgIGlmIGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnM6Ci0gICAgICAgICAgICBvdXRbInNvdXJjZSJdID0gY2xzLl9kaWN0aWZ5X2luc3RydWN0aW9ucyhieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zLCB3cml0ZXIpCi0gICAgICAgIGlmIGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zOgotICAgICAgICAgICAgb3V0WyJzdGVwIl0gPSBjbHMuX2RpY3RpZnlfaW5zdHJ1Y3Rpb25zKGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zLCB3cml0ZXIpCi0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiQnl0ZWNvZGUiLCBvdXQpCi0KLQotY2xhc3MgVHJhdmVyc2FsU2VyaWFsaXplcihfQnl0ZWNvZGVTZXJpYWxpemVyKToKLSAgICBweXRob25fdHlwZSA9IFRyYXZlcnNhbAotCi0KLWNsYXNzIEJ5dGVjb2RlU2VyaWFsaXplcihfQnl0ZWNvZGVTZXJpYWxpemVyKToKLSAgICBweXRob25fdHlwZSA9IEJ5dGVjb2RlCi0KLQotY2xhc3MgVmVydGV4U2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gVmVydGV4Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlZlcnRleCIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgdmVydGV4LCB3cml0ZXIpOgotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlZlcnRleCIsIHsiaWQiOiB3cml0ZXIudG9EaWN0KHZlcnRleC5pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHdyaXRlci50b0RpY3QodmVydGV4LmxhYmVsKX0pCi0KLQotY2xhc3MgRWRnZVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IEVkZ2UKLSAgICBncmFwaHNvbl90eXBlID0gImc6RWRnZSIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgZWRnZSwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJFZGdlIiwgeyJpZCI6IHdyaXRlci50b0RpY3QoZWRnZS5pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0ViI6IHdyaXRlci50b0RpY3QoZWRnZS5vdXRWLmlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRWTGFiZWwiOiB3cml0ZXIudG9EaWN0KGVkZ2Uub3V0Vi5sYWJlbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB3cml0ZXIudG9EaWN0KGVkZ2UubGFiZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluViI6IHdyaXRlci50b0RpY3QoZWRnZS5pblYuaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluVkxhYmVsIjogd3JpdGVyLnRvRGljdChlZGdlLmluVi5sYWJlbCl9KQotCi0KLWNsYXNzIFZlcnRleFByb3BlcnR5U2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gVmVydGV4UHJvcGVydHkKLSAgICBncmFwaHNvbl90eXBlID0gImc6VmVydGV4UHJvcGVydHkiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIHZlcnRleF9wcm9wZXJ0eSwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJWZXJ0ZXhQcm9wZXJ0eSIsIHsiaWQiOiB3cml0ZXIudG9EaWN0KHZlcnRleF9wcm9wZXJ0eS5pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogd3JpdGVyLnRvRGljdCh2ZXJ0ZXhfcHJvcGVydHkubGFiZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHdyaXRlci50b0RpY3QodmVydGV4X3Byb3BlcnR5LnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydGV4Ijogd3JpdGVyLnRvRGljdCh2ZXJ0ZXhfcHJvcGVydHkudmVydGV4LmlkKX0pCi0KLQotY2xhc3MgUHJvcGVydHlTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBQcm9wZXJ0eQotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpQcm9wZXJ0eSIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgcHJvcGVydHksIHdyaXRlcik6Ci0gICAgICAgIGVsZW1lbnREaWN0ID0gd3JpdGVyLnRvRGljdChwcm9wZXJ0eS5lbGVtZW50KQotICAgICAgICBpZiBlbGVtZW50RGljdCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHZhbHVlRGljdCA9IGVsZW1lbnREaWN0WyJAdmFsdWUiXQotICAgICAgICAgICAgaWYgIm91dFZMYWJlbCIgaW4gdmFsdWVEaWN0OgotICAgICAgICAgICAgICAgIGRlbCB2YWx1ZURpY3RbIm91dFZMYWJlbCJdCi0gICAgICAgICAgICBpZiAiaW5WTGFiZWwiIGluIHZhbHVlRGljdDoKLSAgICAgICAgICAgICAgICBkZWwgdmFsdWVEaWN0WyJpblZMYWJlbCJdCi0gICAgICAgICAgICBpZiAicHJvcGVydGllcyIgaW4gdmFsdWVEaWN0OgotICAgICAgICAgICAgICAgIGRlbCB2YWx1ZURpY3RbInByb3BlcnRpZXMiXQotICAgICAgICAgICAgaWYgInZhbHVlIiBpbiB2YWx1ZURpY3Q6Ci0gICAgICAgICAgICAgICAgZGVsIHZhbHVlRGljdFsidmFsdWUiXQotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlByb3BlcnR5IiwgeyJrZXkiOiB3cml0ZXIudG9EaWN0KHByb3BlcnR5LmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogd3JpdGVyLnRvRGljdChwcm9wZXJ0eS52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnQiOiBlbGVtZW50RGljdH0pCi0KLQotY2xhc3MgVHJhdmVyc2FsU3RyYXRlZ3lTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBUcmF2ZXJzYWxTdHJhdGVneQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBzdHJhdGVneSwgd3JpdGVyKToKLSAgICAgICAgY29uZmlndXJhdGlvbiA9IHt9Ci0gICAgICAgIGZvciBrZXkgaW4gc3RyYXRlZ3kuY29uZmlndXJhdGlvbjoKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25ba2V5XSA9IHdyaXRlci50b0RpY3Qoc3RyYXRlZ3kuY29uZmlndXJhdGlvbltrZXldKQotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoc3RyYXRlZ3kuc3RyYXRlZ3lfbmFtZSwgY29uZmlndXJhdGlvbikKLQotCi1jbGFzcyBUcmF2ZXJzZXJJTyhfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gVHJhdmVyc2VyCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlRyYXZlcnNlciIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgdHJhdmVyc2VyLCB3cml0ZXIpOgotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlRyYXZlcnNlciIsIHsidmFsdWUiOiB3cml0ZXIudG9EaWN0KHRyYXZlcnNlci5vYmplY3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVsayI6IHdyaXRlci50b0RpY3QodHJhdmVyc2VyLmJ1bGspfSkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgotICAgICAgICByZXR1cm4gVHJhdmVyc2VyKHJlYWRlci50b09iamVjdChkWyJ2YWx1ZSJdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIudG9PYmplY3QoZFsiYnVsayJdKSkKLQotCi1jbGFzcyBFbnVtU2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gRW51bQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBlbnVtLCBfKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy51bm1hbmdsZUtleXdvcmQodHlwZShlbnVtKS5fX25hbWVfXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMudW5tYW5nbGVLZXl3b3JkKHN0cihlbnVtLm5hbWUpKSkKLQotCi1jbGFzcyBQU2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gUAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBwLCB3cml0ZXIpOgotICAgICAgICBvdXQgPSB7InByZWRpY2F0ZSI6IHAub3BlcmF0b3IsCi0gICAgICAgICAgICAgICAidmFsdWUiOiBbd3JpdGVyLnRvRGljdChwLnZhbHVlKSwgd3JpdGVyLnRvRGljdChwLm90aGVyKV0gaWYgcC5vdGhlciBpcyBub3QgTm9uZSBlbHNlCi0gICAgICAgICAgICAgICB3cml0ZXIudG9EaWN0KHAudmFsdWUpfQotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlAiLCBvdXQpCi0KLQotY2xhc3MgVGV4dFBTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBUZXh0UAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBwLCB3cml0ZXIpOgotICAgICAgICBvdXQgPSB7InByZWRpY2F0ZSI6IHAub3BlcmF0b3IsCi0gICAgICAgICAgICAgICAidmFsdWUiOiBbd3JpdGVyLnRvRGljdChwLnZhbHVlKSwgd3JpdGVyLnRvRGljdChwLm90aGVyKV0gaWYgcC5vdGhlciBpcyBub3QgTm9uZSBlbHNlCi0gICAgICAgICAgICAgICB3cml0ZXIudG9EaWN0KHAudmFsdWUpfQotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlRleHRQIiwgb3V0KQotCi0KLWNsYXNzIEJpbmRpbmdTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBCaW5kaW5nCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIGJpbmRpbmcsIHdyaXRlcik6Ci0gICAgICAgIG91dCA9IHsia2V5IjogYmluZGluZy5rZXksCi0gICAgICAgICAgICAgICAidmFsdWUiOiB3cml0ZXIudG9EaWN0KGJpbmRpbmcudmFsdWUpfQotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIkJpbmRpbmciLCBvdXQpCi0KLQotY2xhc3MgTGFtYmRhU2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gRnVuY3Rpb25UeXBlCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIGxhbWJkYV9vYmplY3QsIHdyaXRlcik6Ci0gICAgICAgIGxhbWJkYV9yZXN1bHQgPSBsYW1iZGFfb2JqZWN0KCkKLSAgICAgICAgc2NyaXB0ID0gbGFtYmRhX3Jlc3VsdCBpZiBpc2luc3RhbmNlKGxhbWJkYV9yZXN1bHQsIHN0cikgZWxzZSBsYW1iZGFfcmVzdWx0WzBdCi0gICAgICAgIGxhbmd1YWdlID0gc3RhdGljcy5kZWZhdWx0X2xhbWJkYV9sYW5ndWFnZSBpZiBpc2luc3RhbmNlKGxhbWJkYV9yZXN1bHQsIHN0cikgZWxzZSBsYW1iZGFfcmVzdWx0WzFdCi0gICAgICAgIG91dCA9IHsic2NyaXB0Ijogc2NyaXB0LAotICAgICAgICAgICAgICAgImxhbmd1YWdlIjogbGFuZ3VhZ2V9Ci0gICAgICAgIGlmIGxhbmd1YWdlID09ICJncmVtbGluLWp5dGhvbiIgb3IgbGFuZ3VhZ2UgPT0gImdyZW1saW4tcHl0aG9uIjoKLSAgICAgICAgICAgIGlmIG5vdCBzY3JpcHQuc3RyaXAoKS5zdGFydHN3aXRoKCJsYW1iZGEiKToKLSAgICAgICAgICAgICAgICBzY3JpcHQgPSAibGFtYmRhICIgKyBzY3JpcHQKLSAgICAgICAgICAgICAgICBvdXRbInNjcmlwdCJdID0gc2NyaXB0Ci0gICAgICAgICAgICBvdXRbImFyZ3VtZW50cyJdID0gc2l4LmdldF9mdW5jdGlvbl9jb2RlKGV2YWwob3V0WyJzY3JpcHQiXSkpLmNvX2FyZ2NvdW50Ci0gICAgICAgIGVsaWYgbGFuZ3VhZ2UgPT0gImdyZW1saW4tZ3Jvb3Z5IiBhbmQgIi0+IiBpbiBzY3JpcHQ6Ci0gICAgICAgICAgICAjIGlmIHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IGFkZGVkIHBhcmFtZXRlcnMgdG8gdGhlIGdyb292eSBjbG9zdXJlIHRoZW4gd2UgY2FuIGVhc2lseSBkZXRlY3Qgb25lIG9yIHR3bwotICAgICAgICAgICAgIyBhcmcgbGFtYmRhcyAtIGlmIHdlIGNhbid0IGRldGVjdCAxIG9yIDIgdGhlbiB3ZSBqdXN0IGdvIHdpdGggInVua25vd24iCi0gICAgICAgICAgICBhcmdzID0gc2NyaXB0WzA6c2NyaXB0LmZpbmQoIi0+IildCi0gICAgICAgICAgICBvdXRbImFyZ3VtZW50cyJdID0gMiBpZiAiLCIgaW4gYXJncyBlbHNlIDEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG91dFsiYXJndW1lbnRzIl0gPSAtMQotCi0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiTGFtYmRhIiwgb3V0KQotCi0KLWNsYXNzIFR5cGVTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBUeXBlVHlwZQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCB0eXAsIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiB3cml0ZXIudG9EaWN0KHR5cCgpKQotCi0KLWNsYXNzIFVVSURJTyhfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gdXVpZC5VVUlECi0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlVVSUQiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIlVVSUQiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIHN0cihvYmopKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGUoZCkKLQotCi1jbGFzcyBEYXRlSU8oX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IGRhdGV0aW1lLmRhdGV0aW1lCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOkRhdGUiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkRhdGUiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGltZXN0YW1wX3NlY29uZHMgPSBjYWxlbmRhci50aW1lZ20ob2JqLnV0Y3RpbWV0dXBsZSgpKQotICAgICAgICAgICAgcHRzID0gdGltZXN0YW1wX3NlY29uZHMgKiAxZTMgKyBnZXRhdHRyKG9iaiwgJ21pY3Jvc2Vjb25kJywgMCkgLyAxZTMKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgcHRzID0gY2FsZW5kYXIudGltZWdtKG9iai50aW1ldHVwbGUoKSkgKiAxZTMKLQotICAgICAgICB0cyA9IGludChyb3VuZChwdHMpKQotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgdHMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgdHMsIHJlYWRlcik6Ci0gICAgICAgICMgUHl0aG9uIHRpbWVzdGFtcCBleHBlY3RzIHNlY29uZHMKLSAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodHMgLyAxMDAwLjApCi0KLQotIyBCYXNlZCBvbiBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGlzIGNsYXNzIG11c3QgYWx3YXlzIGJlIGRlY2xhcmVkIGJlZm9yZSBGbG9hdElPLgotIyBTZWVtcyBwcmV0dHkgZnJhZ2lsZSBmb3IgZnV0dXJlIG1haW50YWluZXJzLiBNYXliZSBsb29rIGludG8gdGhpcy4KLWNsYXNzIFRpbWVzdGFtcElPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgIiIiQSB0aW1lc3RhbXAgaW4gUHl0aG9uIGlzIHR5cGUgZmxvYXQiIiIKLSAgICBweXRob25fdHlwZSA9IHN0YXRpY3MudGltZXN0YW1wCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlRpbWVzdGFtcCIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiVGltZXN0YW1wIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlcik6Ci0gICAgICAgICMgSmF2YSB0aW1lc3RhbXAgZXhwZWN0cyBtaWxsaXNlY29uZHMgaW50ZWdlcgotICAgICAgICAjIEhhdmUgdG8gdXNlIGludCBiZWNhdXNlIG9mIGxlZ2FjeSBQeXRob24KLSAgICAgICAgdHMgPSBpbnQocm91bmQob2JqICogMTAwMCkpCi0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCB0cykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB0cywgcmVhZGVyKToKLSAgICAgICAgIyBQeXRob24gdGltZXN0YW1wIGV4cGVjdHMgc2Vjb25kcwotICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHRzIC8gMTAwMC4wKQotCi0KLWNsYXNzIF9OdW1iZXJJTyhfR3JhcGhTT05UeXBlSU8pOgotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKTogICMgYmVjYXVzZSBpc2luc3RhbmNlKEZhbHNlLCBpbnQpIGFuZCBpc2luc3RhbmNlKFRydWUsIGludCkKLSAgICAgICAgICAgIHJldHVybiBuCi0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBuKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgotICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHYpCi0KLQotY2xhc3MgTGlzdElPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBMaXN0VHlwZQotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpMaXN0IgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBsLCB3cml0ZXIpOgotICAgICAgICBuZXdfbGlzdCA9IFtdCi0gICAgICAgIGZvciBvYmogaW4gbDoKLSAgICAgICAgICAgIG5ld19saXN0LmFwcGVuZCh3cml0ZXIudG9EaWN0KG9iaikpCi0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiTGlzdCIsIG5ld19saXN0KQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGwsIHJlYWRlcik6Ci0gICAgICAgIG5ld19saXN0ID0gW10KLSAgICAgICAgZm9yIG9iaiBpbiBsOgotICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKHJlYWRlci50b09iamVjdChvYmopKQotICAgICAgICByZXR1cm4gbmV3X2xpc3QKLQotCi1jbGFzcyBTZXRJTyhfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gU2V0VHlwZQotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpTZXQiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIHMsIHdyaXRlcik6Ci0gICAgICAgIG5ld19saXN0ID0gW10KLSAgICAgICAgZm9yIG9iaiBpbiBzOgotICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKHdyaXRlci50b0RpY3Qob2JqKSkKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJTZXQiLCBuZXdfbGlzdCkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBzLCByZWFkZXIpOgotICAgICAgICAiIiIKLSAgICAgICAgQnkgZGVmYXVsdCwgcmV0dXJucyBhIHB5dGhvbiBzZXQKLQotICAgICAgICBJbiBjYXNlIEphdmEgcmV0dXJucyBudW1lcmljIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgd2hpY2gKLSAgICAgICAgcHl0aG9uIGRvbid0IHJlY29nbml6ZSwgY29lcmNlIGFuZCByZXR1cm4gYSBsaXN0LgotICAgICAgICBTZWUgY29tbWVudHMgb2YgVElOS0VSUE9QLTE4NDQgZm9yIG1vcmUgZGV0YWlscwotICAgICAgICAiIiIKLSAgICAgICAgbmV3X2xpc3QgPSBbcmVhZGVyLnRvT2JqZWN0KG9iaikgZm9yIG9iaiBpbiBzXQotICAgICAgICBuZXdfc2V0ID0gc2V0KG5ld19saXN0KQotICAgICAgICBpZiBsZW4obmV3X2xpc3QpICE9IGxlbihuZXdfc2V0KToKLSAgICAgICAgICAgIGxvZy53YXJuaW5nKCJDb2VyY2luZyBnOlNldCB0byBsaXN0IGR1ZSB0byBqYXZhIG51bWVyaWMgdmFsdWVzLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VlIFRJTktFUlBPUC0xODQ0IGZvciBtb3JlIGRldGFpbHMuIikKLSAgICAgICAgICAgIHJldHVybiBuZXdfbGlzdAotCi0gICAgICAgIHJldHVybiBuZXdfc2V0Ci0KLQotY2xhc3MgTWFwVHlwZShfR3JhcGhTT05UeXBlSU8pOgotICAgIHB5dGhvbl90eXBlID0gRGljdFR5cGUKLSAgICBncmFwaHNvbl90eXBlID0gImc6TWFwIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBkLCB3cml0ZXIpOgotICAgICAgICBsID0gW10KLSAgICAgICAgZm9yIGtleSBpbiBkOgotICAgICAgICAgICAgbC5hcHBlbmQod3JpdGVyLnRvRGljdChrZXkpKQotICAgICAgICAgICAgbC5hcHBlbmQod3JpdGVyLnRvRGljdChkW2tleV0pKQotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIk1hcCIsIGwpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgbCwgcmVhZGVyKToKLSAgICAgICAgbmV3X2RpY3QgPSB7fQotICAgICAgICBpZiBsZW4obCkgPiAwOgotICAgICAgICAgICAgeCA9IDAKLSAgICAgICAgICAgIHdoaWxlIHggPCBsZW4obCk6Ci0gICAgICAgICAgICAgICAgbmV3X2RpY3RbcmVhZGVyLnRvT2JqZWN0KGxbeF0pXSA9IHJlYWRlci50b09iamVjdChsW3ggKyAxXSkKLSAgICAgICAgICAgICAgICB4ID0geCArIDIKLSAgICAgICAgcmV0dXJuIG5ld19kaWN0Ci0KLQotY2xhc3MgQnVsa1NldElPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOkJ1bGtTZXQiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgbCwgcmVhZGVyKToKLSAgICAgICAgbmV3X2xpc3QgPSBbXQotCi0gICAgICAgICMgdGhpcyBhcHByb2FjaCBiYXNpY2FsbHkgbWltaWNzIHdoYXQgY3VycmVudGx5IGV4aXN0ZWQgaW4gMy4zLjQgYW5kIHByaW9yIHZlcnNpb25zIHdoZXJlIEJ1bGtTZXQgaXMKLSAgICAgICAgIyBiYXNpY2FsbHkganVzdCBjb2VyY2VkIHRvIGxpc3QuIHRoZSBsaW1pdGF0aW9uIGhlcmUgaXMgdGhhdCBpZiB0aGUgdmFsdWUgb2YgYSBidWxrIGV4Y2VlZHMgdGhlIHNpemUgb2YKLSAgICAgICAgIyBhIGxpc3QgKGludG8gdGhlIGxvbmcgc3BhY2UpIHRoZW4gc3R1ZmYgd29uJ3Qgd29yayBuaWNlLgotICAgICAgICBpZiBsZW4obCkgPiAwOgotICAgICAgICAgICAgeCA9IDAKLSAgICAgICAgICAgIHdoaWxlIHggPCBsZW4obCk6Ci0gICAgICAgICAgICAgICAgb2JqID0gcmVhZGVyLnRvT2JqZWN0KGxbeF0pCi0gICAgICAgICAgICAgICAgYnVsayA9IHJlYWRlci50b09iamVjdChsW3ggKyAxXSkKLSAgICAgICAgICAgICAgICBmb3IgeSBpbiByYW5nZShidWxrKToKLSAgICAgICAgICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKG9iaikKLSAgICAgICAgICAgICAgICB4ID0geCArIDIKLSAgICAgICAgcmV0dXJuIG5ld19saXN0Ci0KLQotY2xhc3MgRmxvYXRJTyhfTnVtYmVySU8pOgotICAgIHB5dGhvbl90eXBlID0gRmxvYXRUeXBlCi0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOkZsb2F0IgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJGbG9hdCIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKTogICMgYmVjYXVzZSBpc2luc3RhbmNlKEZhbHNlLCBpbnQpIGFuZCBpc2luc3RhbmNlKFRydWUsIGludCkKLSAgICAgICAgICAgIHJldHVybiBuCi0gICAgICAgIGVsaWYgbWF0aC5pc25hbihuKToKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCAiTmFOIikKLSAgICAgICAgZWxpZiBtYXRoLmlzaW5mKG4pIGFuZCBuID4gMDoKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCAiSW5maW5pdHkiKQotICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPCAwOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICItSW5maW5pdHkiKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uodiwgc3RyKToKLSAgICAgICAgICAgIGlmIHYgPT0gJ05hTic6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCduYW4nKQotICAgICAgICAgICAgZWxpZiB2ID09ICJJbmZpbml0eSI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCdpbmYnKQotICAgICAgICAgICAgZWxpZiB2ID09ICItSW5maW5pdHkiOgotICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdCgnLWluZicpCi0KLSAgICAgICAgcmV0dXJuIGNscy5weXRob25fdHlwZSh2KQotCi0KLWNsYXNzIEJpZ0RlY2ltYWxJTyhfTnVtYmVySU8pOgotICAgIHB5dGhvbl90eXBlID0gRGVjaW1hbAotICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6QmlnRGVjaW1hbCIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiQmlnRGVjaW1hbCIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKTogICMgYmVjYXVzZSBpc2luc3RhbmNlKEZhbHNlLCBpbnQpIGFuZCBpc2luc3RhbmNlKFRydWUsIGludCkKLSAgICAgICAgICAgIHJldHVybiBuCi0gICAgICAgIGVsaWYgbWF0aC5pc25hbihuKToKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCAiTmFOIiwgImd4IikKLSAgICAgICAgZWxpZiBtYXRoLmlzaW5mKG4pIGFuZCBuID4gMDoKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCAiSW5maW5pdHkiLCAiZ3giKQotICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPCAwOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICItSW5maW5pdHkiLCAiZ3giKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIHN0cihuKSwgImd4IikKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgotICAgICAgICAgICAgaWYgdiA9PSAnTmFOJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbCgnbmFuJykKLSAgICAgICAgICAgIGVsaWYgdiA9PSAiSW5maW5pdHkiOgotICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKCdpbmYnKQotICAgICAgICAgICAgZWxpZiB2ID09ICItSW5maW5pdHkiOgotICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKCctaW5mJykKLQotICAgICAgICByZXR1cm4gRGVjaW1hbCh2KQotCi0KLWNsYXNzIERvdWJsZUlPKEZsb2F0SU8pOgotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpEb3VibGUiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkRvdWJsZSIKLQotCi1jbGFzcyBJbnQ2NElPKF9OdW1iZXJJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBMb25nVHlwZQotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpJbnQ2NCIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiSW50NjQiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6Ci0gICAgICAgICMgaWYgd2UgZXhjZWVkIEphdmEgbG9uZyByYW5nZSB0aGVuIHdlIG5lZWQgYSBCaWdJbnRlZ2VyCi0gICAgICAgIGlmIGlzaW5zdGFuY2UobiwgYm9vbCk6Ci0gICAgICAgICAgICByZXR1cm4gbgotICAgICAgICBlbGlmIG4gPCAtOTIyMzM3MjAzNjg1NDc3NTgwOCBvciBuID4gOTIyMzM3MjAzNjg1NDc3NTgwNzoKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiQmlnSW50ZWdlciIsIHN0cihuKSwgImd4IikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBuKQotCi0KLWNsYXNzIEJpZ0ludGVnZXJJTyhJbnQ2NElPKToKLSAgICBncmFwaHNvbl90eXBlID0gImd4OkJpZ0ludGVnZXIiCi0KLQotY2xhc3MgSW50MzJJTyhJbnQ2NElPKToKLSAgICBweXRob25fdHlwZSA9IEludFR5cGUKLSAgICBncmFwaHNvbl90eXBlID0gImc6SW50MzIiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkludDMyIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgotICAgICAgICAjIGlmIHdlIGV4Y2VlZCBKYXZhIGludCByYW5nZSB0aGVuIHdlIG5lZWQgYSBsb25nCi0gICAgICAgIGlmIGlzaW5zdGFuY2UobiwgYm9vbCk6Ci0gICAgICAgICAgICByZXR1cm4gbgotICAgICAgICBlbGlmIG4gPCAtOTIyMzM3MjAzNjg1NDc3NTgwOCBvciBuID4gOTIyMzM3MjAzNjg1NDc3NTgwNzoKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiQmlnSW50ZWdlciIsIHN0cihuKSwgImd4IikKLSAgICAgICAgZWxpZiBuIDwgLTIxNDc0ODM2NDggb3IgbiA+IDIxNDc0ODM2NDc6Ci0gICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIkludDY0IiwgbikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBuKQotCi1jbGFzcyBCeXRlSU8oX051bWJlcklPKToKLSAgICBweXRob25fdHlwZSA9IFNpbmdsZUJ5dGUKLSAgICBncmFwaHNvbl90eXBlID0gImd4OkJ5dGUiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkJ5dGUiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UobiwgYm9vbCk6ICAjIGJlY2F1c2UgaXNpbnN0YW5jZShGYWxzZSwgaW50KSBhbmQgaXNpbnN0YW5jZShUcnVlLCBpbnQpCi0gICAgICAgICAgICByZXR1cm4gbgotICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgbiwgImd4IikKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKLSAgICAgICAgcmV0dXJuIGludC5fX25ld19fKFNpbmdsZUJ5dGUsIHYpCi0KLQotY2xhc3MgQnl0ZUJ1ZmZlcklPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSBCeXRlQnVmZmVyVHlwZQotICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6Qnl0ZUJ1ZmZlciIKLSAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiQnl0ZUJ1ZmZlciIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICIiLmpvaW4oY2hyKHgpIGZvciB4IGluIG4pLCAiZ3giKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgotICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHYsICJ1dGY4IikKLQotCi1jbGFzcyBDaGFySU8oX0dyYXBoU09OVHlwZUlPKToKLSAgICBweXRob25fdHlwZSA9IFNpbmdsZUNoYXIKLSAgICBncmFwaHNvbl90eXBlID0gImd4OkNoYXIiCi0gICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkNoYXIiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6Ci0gICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBuLCAiZ3giKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgotICAgICAgICByZXR1cm4gc3RyLl9fbmV3X18oU2luZ2xlQ2hhciwgdikKLQotCi1jbGFzcyBEdXJhdGlvbklPKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgcHl0aG9uX3R5cGUgPSB0aW1lZGVsdGEKLSAgICBncmFwaHNvbl90eXBlID0gImd4OkR1cmF0aW9uIgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJEdXJhdGlvbiIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIGR1cmF0aW9uX2lzb2Zvcm1hdChuKSwgImd4IikKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKLSAgICAgICAgcmV0dXJuIHBhcnNlX2R1cmF0aW9uKHYpCi0KLQotY2xhc3MgVmVydGV4RGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlZlcnRleCIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgotICAgICAgICByZXR1cm4gVmVydGV4KHJlYWRlci50b09iamVjdChkWyJpZCJdKSwgZC5nZXQoImxhYmVsIiwgInZlcnRleCIpKQotCi0KLWNsYXNzIEVkZ2VEZXNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBncmFwaHNvbl90eXBlID0gImc6RWRnZSIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgotICAgICAgICByZXR1cm4gRWRnZShyZWFkZXIudG9PYmplY3QoZFsiaWQiXSksCi0gICAgICAgICAgICAgICAgICAgIFZlcnRleChyZWFkZXIudG9PYmplY3QoZFsib3V0ViJdKSwgZC5nZXQoIm91dFZMYWJlbCIsICJ2ZXJ0ZXgiKSksCi0gICAgICAgICAgICAgICAgICAgIGQuZ2V0KCJsYWJlbCIsICJlZGdlIiksCi0gICAgICAgICAgICAgICAgICAgIFZlcnRleChyZWFkZXIudG9PYmplY3QoZFsiaW5WIl0pLCBkLmdldCgiaW5WTGFiZWwiLCAidmVydGV4IikpKQotCi0KLWNsYXNzIFZlcnRleFByb3BlcnR5RGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlZlcnRleFByb3BlcnR5IgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIHZlcnRleCA9IFZlcnRleChyZWFkZXIudG9PYmplY3QoZC5nZXQoInZlcnRleCIpKSkgaWYgInZlcnRleCIgaW4gZCBlbHNlIE5vbmUKLSAgICAgICAgcmV0dXJuIFZlcnRleFByb3BlcnR5KHJlYWRlci50b09iamVjdChkWyJpZCJdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbImxhYmVsIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIudG9PYmplY3QoZFsidmFsdWUiXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgpCi0KLQotY2xhc3MgUHJvcGVydHlEZXNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBncmFwaHNvbl90eXBlID0gImc6UHJvcGVydHkiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKLSAgICAgICAgZWxlbWVudCA9IHJlYWRlci50b09iamVjdChkWyJlbGVtZW50Il0pIGlmICJlbGVtZW50IiBpbiBkIGVsc2UgTm9uZQotICAgICAgICByZXR1cm4gUHJvcGVydHkoZFsia2V5Il0sIHJlYWRlci50b09iamVjdChkWyJ2YWx1ZSJdKSwgZWxlbWVudCkKLQotCi1jbGFzcyBQYXRoRGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlBhdGgiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKLSAgICAgICAgcmV0dXJuIFBhdGgocmVhZGVyLnRvT2JqZWN0KGRbImxhYmVscyJdKSwgcmVhZGVyLnRvT2JqZWN0KGRbIm9iamVjdHMiXSkpCi0KLQotY2xhc3MgVERlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgotICAgIGdyYXBoc29uX3R5cGUgPSAiZzpUIgotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIHJldHVybiBUW2RdCi0KLQotY2xhc3MgRGlyZWN0aW9uSU8oX0dyYXBoU09OVHlwZUlPKToKLSAgICBncmFwaHNvbl90eXBlID0gImc6RGlyZWN0aW9uIgotICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJEaXJlY3Rpb24iCi0gICAgcHl0aG9uX3R5cGUgPSBEaXJlY3Rpb24KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBkaWN0aWZ5KGNscywgZCwgd3JpdGVyKToKLSAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIGQubmFtZSwgImciKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6Ci0gICAgICAgIHJldHVybiBEaXJlY3Rpb25bZF0KLQotCi1jbGFzcyBUcmF2ZXJzYWxNZXRyaWNzRGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6Ci0gICAgZ3JhcGhzb25fdHlwZSA9ICJnOlRyYXZlcnNhbE1ldHJpY3MiCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKLSAgICAgICAgcmV0dXJuIHJlYWRlci50b09iamVjdChkKQotCi0KLWNsYXNzIE1ldHJpY3NEZXNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKLSAgICBncmFwaHNvbl90eXBlID0gImc6TWV0cmljcyIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgotICAgICAgICByZXR1cm4gcmVhZGVyLnRvT2JqZWN0KGQpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vcmFkaXNoL2ZlYXR1cmVfc3RlcHMucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vcmFkaXNoL2ZlYXR1cmVfc3RlcHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDI1MTguLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3JhZGlzaC9mZWF0dXJlX3N0ZXBzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaW1wb3J0IGpzb24KLWltcG9ydCByZQotZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFBhdGgKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5hbm9ueW1vdXNfdHJhdmVyc2FsIGltcG9ydCB0cmF2ZXJzYWwKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5ncmFwaF90cmF2ZXJzYWwgaW1wb3J0IF9fCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBCYXJyaWVyLCBDYXJkaW5hbGl0eSwgUCwgVGV4dFAsIFBvcCwgU2NvcGUsIENvbHVtbiwgT3JkZXIsIERpcmVjdGlvbiwgVCwgUGljaywgT3BlcmF0b3IsIElPLCBXaXRoT3B0aW9ucwotZnJvbSByYWRpc2ggaW1wb3J0IGdpdmVuLCB3aGVuLCB0aGVuCi1mcm9tIGhhbWNyZXN0IGltcG9ydCAqCi0KLXJlZ2V4X2FsbCA9IHJlLmNvbXBpbGUociJQb3BcLmFsbCIpCi1yZWdleF9hbmQgPSByZS5jb21waWxlKHIiKFsoLixcc10pYW5kXCgiKQotcmVnZXhfYXMgPSByZS5jb21waWxlKHIiKFsoLixcc10pYXNcKCIpCi1yZWdleF9mcm9tID0gcmUuY29tcGlsZShyIihbKC4sXHNdKWZyb21cKCIpCi1yZWdleF9nbG9iYWwgPSByZS5jb21waWxlKHIiKFsoLixcc10pZ2xvYmFsIikKLXJlZ2V4X2NhcmRsaXN0ID0gcmUuY29tcGlsZShyIkNhcmRpbmFsaXR5XC5saXN0IikKLXJlZ2V4X2luID0gcmUuY29tcGlsZShyIihbKC4sXHNdKWluXCgiKQotcmVnZXhfaXMgPSByZS5jb21waWxlKHIiKFsoLixcc10paXNcKCIpCi1yZWdleF9ub3QgPSByZS5jb21waWxlKHIiKFsoLixcc10pbm90XCgiKQotcmVnZXhfb3IgPSByZS5jb21waWxlKHIiKFsoLixcc10pb3JcKCIpCi1yZWdleF93aXRoID0gcmUuY29tcGlsZShyIihbKC4sXHNdKXdpdGhcKCIpCi1yZWdleF90cnVlID0gcmUuY29tcGlsZShyIih0cnVlKSIpCi1yZWdleF9mYWxzZSA9IHJlLmNvbXBpbGUociIoZmFsc2UpIikKLQotb3V0ViA9IF9fLm91dFYKLWxhYmVsID0gX18ubGFiZWwKLWluViA9IF9fLmluVgotcHJvamVjdCA9IF9fLnByb2plY3QKLXRhaWwgPSBfXy50YWlsCi0KLWlnbm9yZXMgPSBbXQotCi0KLUBnaXZlbigidGhlIHtncmFwaF9uYW1lOnd9IGdyYXBoIikKLWRlZiBjaG9vc2VfZ3JhcGgoc3RlcCwgZ3JhcGhfbmFtZSk6Ci0gICAgc3RlcC5jb250ZXh0LmdyYXBoX25hbWUgPSBncmFwaF9uYW1lCi0gICAgc3RlcC5jb250ZXh0LmcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHN0ZXAuY29udGV4dC5yZW1vdGVfY29ubltncmFwaF9uYW1lXSkKLQotCi1AZ2l2ZW4oInRoZSBncmFwaCBpbml0aWFsaXplciBvZiIpCi1kZWYgaW5pdGlhbGl6ZV9ncmFwaChzdGVwKToKLSAgICB0ID0gX21ha2VfdHJhdmVyc2FsKHN0ZXAuY29udGV4dC5nLCBzdGVwLnRleHQsIHt9KQotCi0gICAgIyBqdXN0IGJlIHN1cmUgdGhhdCB0aGUgdHJhdmVyc2FsIHJldHVybnMgc29tZXRoaW5nIHRvIHByb3ZlIHRoYXQgaXQgd29ya2VkIHRvIHNvbWUgZGVncmVlLiBwcm9iYWJseQotICAgICMgaXMgb3ZlcmtpbGwgdG8gdHJ5IHRvIGFzc2VydCB0aGUgY29tcGxldGUgc3VjY2VzcyBvZiB0aGlzIGluaXQgb3BlcmF0aW9uLiBwcmVzdW1hYmx5IHRoZSB0ZXN0Ci0gICAgIyBzdWl0ZSB3b3VsZCBmYWlsIGVsc2V3aGVyZSBpZiB0aGlzIGRpZG4ndCB3b3JrIHdoaWNoIHdvdWxkIGhlbHAgaWRlbnRpZnkgYSBwcm9ibGVtLgotICAgIHJlc3VsdCA9IHQudG9MaXN0KCkKLSAgICBhc3NlcnQgbGVuKHJlc3VsdCkgPiAwCi0KLSAgICAjIGFkZCB0aGUgZmlyc3QgcmVzdWx0IC0gaWYgYSBtYXAgLSB0byB0aGUgYmluZGluZ3MuIHRoaXMgaXMgdXNlZnVsIGZvciBjYXNlcyB3aGVuIHBhcmFtZXRlcnMgZm9yCi0gICAgIyB0aGUgdGVzdCB0cmF2ZXJzYWwgbmVlZCB0byBjb21lIGZyb20gdGhlIG9yaWdpbmFsIGdyYXBoIGluaXRpYWxpemVyIChpLmUuIGEgbmV3IGdyYXBoIGlzIGNyZWF0ZWQKLSAgICAjIGFuZCB5b3UgbmVlZCB0aGUgaWQgb2YgYSB2ZXJ0ZXggZnJvbSB0aGF0IGdyYXBoKQotCi0KLUBnaXZlbigiYW4gdW5zdXBwb3J0ZWQgdGVzdCIpCi1kZWYgdW5zdXBwb3J0ZWRfc2NlbmFyaW8oc3RlcCk6Ci0gICAgIyB0aGlzIGlzIGEgZG8gbm90aGluZyBzdGVwIGFzIHRoZSB0ZXN0IGNhbid0IGJlIHN1cHBvcnRlZCBmb3Igd2hhdGV2ZXIgcmVhc29uCi0gICAgcmV0dXJuCi0KLQotQGdpdmVuKCJ1c2luZyB0aGUgcGFyYW1ldGVyIHtwYXJhbV9uYW1lOnd9IGRlZmluZWQgYXMge3BhcmFtOlF1b3RlZFN0cmluZ30iKQotZGVmIGFkZF9wYXJhbWV0ZXIoc3RlcCwgcGFyYW1fbmFtZSwgcGFyYW0pOgotICAgIGlmIG5vdCBoYXNhdHRyKHN0ZXAuY29udGV4dCwgInRyYXZlcnNhbF9wYXJhbXMiKToKLSAgICAgICAgc3RlcC5jb250ZXh0LnRyYXZlcnNhbF9wYXJhbXMgPSB7fQotCi0gICAgc3RlcC5jb250ZXh0LnRyYXZlcnNhbF9wYXJhbXNbcGFyYW1fbmFtZV0gPSBfY29udmVydChwYXJhbS5yZXBsYWNlKCdcXCInLCAnIicpLCBzdGVwLmNvbnRleHQpCi0KLQotQGdpdmVuKCJ0aGUgdHJhdmVyc2FsIG9mIikKLWRlZiB0cmFuc2xhdGVfdHJhdmVyc2FsKHN0ZXApOgotICAgIHN0ZXAuY29udGV4dC5pZ25vcmUgPSBpZ25vcmVzLl9fY29udGFpbnNfXyhzdGVwLnRleHQpCi0gICAgc3RlcC5jb250ZXh0LnRyYXZlcnNhbCA9IF9tYWtlX3RyYXZlcnNhbCgKLSAgICAgICAgc3RlcC5jb250ZXh0LmcsIHN0ZXAudGV4dCwKLSAgICAgICAgc3RlcC5jb250ZXh0LnRyYXZlcnNhbF9wYXJhbXMgaWYgaGFzYXR0cihzdGVwLmNvbnRleHQsICJ0cmF2ZXJzYWxfcGFyYW1zIikgZWxzZSB7fSkKLQotCi1Ad2hlbigiaXRlcmF0ZWQgdG8gbGlzdCIpCi1kZWYgaXRlcmF0ZV90aGVfdHJhdmVyc2FsKHN0ZXApOgotICAgIGlmIHN0ZXAuY29udGV4dC5pZ25vcmU6Ci0gICAgICAgIHJldHVybgotICAgIAotICAgIHN0ZXAuY29udGV4dC5yZXN1bHQgPSBtYXAobGFtYmRhIHg6IF9jb252ZXJ0X3Jlc3VsdHMoeCksIHN0ZXAuY29udGV4dC50cmF2ZXJzYWwudG9MaXN0KCkpCi0KLQotQHdoZW4oIml0ZXJhdGVkIG5leHQiKQotZGVmIG5leHRfdGhlX3RyYXZlcnNhbChzdGVwKToKLSAgICBpZiBzdGVwLmNvbnRleHQuaWdub3JlOgotICAgICAgICByZXR1cm4KLQotICAgIHN0ZXAuY29udGV4dC5yZXN1bHQgPSBtYXAobGFtYmRhIHg6IF9jb252ZXJ0X3Jlc3VsdHMoeCksIHN0ZXAuY29udGV4dC50cmF2ZXJzYWwubmV4dCgpKQotCi0KLUB0aGVuKCJ0aGUgcmVzdWx0IHNob3VsZCBiZSB7Y2hhcmFjdGVyaXplZF9hczp3fSIpCi1kZWYgYXNzZXJ0X3Jlc3VsdChzdGVwLCBjaGFyYWN0ZXJpemVkX2FzKToKLSAgICBpZiBzdGVwLmNvbnRleHQuaWdub3JlOgotICAgICAgICByZXR1cm4KLQotICAgIGlmIGNoYXJhY3Rlcml6ZWRfYXMgPT0gImVtcHR5IjogICAgICAgICMgbm8gcmVzdWx0cwotICAgICAgICBhc3NlcnRfdGhhdChsZW4oc3RlcC5jb250ZXh0LnJlc3VsdCksIGVxdWFsX3RvKDApKQotICAgIGVsaWYgY2hhcmFjdGVyaXplZF9hcyA9PSAib3JkZXJlZCI6ICAgICMgcmVzdWx0cyBhc3NlcnRlZCBpbiB0aGUgb3JkZXIgb2YgdGhlIGRhdGEgdGFibGUKLSAgICAgICAgX3RhYmxlX2Fzc2VydGlvbihzdGVwLnRhYmxlLCBzdGVwLmNvbnRleHQucmVzdWx0LCBzdGVwLmNvbnRleHQsIFRydWUpCi0gICAgZWxpZiBjaGFyYWN0ZXJpemVkX2FzID09ICJ1bm9yZGVyZWQiOiAgIyByZXN1bHRzIGFzc2VydGVkIGluIGFueSBvcmRlcgotICAgICAgICBfdGFibGVfYXNzZXJ0aW9uKHN0ZXAudGFibGUsIHN0ZXAuY29udGV4dC5yZXN1bHQsIHN0ZXAuY29udGV4dCwgRmFsc2UpCi0gICAgZWxpZiBjaGFyYWN0ZXJpemVkX2FzID09ICJvZiI6ICAgICAgICAgIyByZXN1bHRzIG1heSBiZSBvZiBhbnkgb2YgdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgZGF0YSB0YWJsZQotICAgICAgICBfYW55X2Fzc2VydGlvbihzdGVwLnRhYmxlLCBzdGVwLmNvbnRleHQucmVzdWx0LCBzdGVwLmNvbnRleHQpCi0gICAgZWxzZToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBkYXRhIGNoYXJhY3Rlcml6YXRpb24gb2YgIiArIGNoYXJhY3Rlcml6ZWRfYXMpCi0KLQotQHRoZW4oInRoZSBncmFwaCBzaG91bGQgcmV0dXJuIHtjb3VudDpkfSBmb3IgY291bnQgb2Yge3RyYXZlcnNhbF9zdHJpbmc6UXVvdGVkU3RyaW5nfSIpCi1kZWYgYXNzZXJ0X3NpZGVfZWZmZWN0cyhzdGVwLCBjb3VudCwgdHJhdmVyc2FsX3N0cmluZyk6Ci0gICAgaWYgc3RlcC5jb250ZXh0Lmlnbm9yZToKLSAgICAgICAgcmV0dXJuCi0KLSAgICB0ID0gX21ha2VfdHJhdmVyc2FsKHN0ZXAuY29udGV4dC5nLCB0cmF2ZXJzYWxfc3RyaW5nLnJlcGxhY2UoJ1xcIicsICciJyksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmNvbnRleHQudHJhdmVyc2FsX3BhcmFtcyBpZiBoYXNhdHRyKHN0ZXAuY29udGV4dCwgInRyYXZlcnNhbF9wYXJhbXMiKSBlbHNlIHt9KQotICAgIGFzc2VydF90aGF0KHQuY291bnQoKS5uZXh0KCksIGVxdWFsX3RvKGNvdW50KSkKLQotCi1AdGhlbigidGhlIHJlc3VsdCBzaG91bGQgaGF2ZSBhIGNvdW50IG9mIHtjb3VudDpkfSIpCi1kZWYgYXNzZXJ0X2NvdW50KHN0ZXAsIGNvdW50KToKLSAgICBhc3NlcnRfdGhhdChsZW4oc3RlcC5jb250ZXh0LnJlc3VsdCksIGVxdWFsX3RvKGNvdW50KSkKLQotCi1AdGhlbigibm90aGluZyBzaG91bGQgaGFwcGVuIGJlY2F1c2UiKQotZGVmIG5vdGhpbmdfaGFwcGVuaW5nKHN0ZXApOgotICAgIHJldHVybgotCi0KLWRlZiBfY29udmVydCh2YWwsIGN0eCk6Ci0gICAgZ3JhcGhfbmFtZSA9IGN0eC5ncmFwaF9uYW1lCi0gICAgaWYgaXNpbnN0YW5jZSh2YWwsIGRpY3QpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgZGljdGlvbmFyeSBrZXlzL3ZhbHVlcwotICAgICAgICBuID0ge30KLSAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gdmFsLml0ZW1zKCk6Ci0gICAgICAgICAgICBuW19jb252ZXJ0KGtleSwgY3R4KV0gPSBfY29udmVydCh2YWx1ZSwgY3R4KQotICAgICAgICByZXR1cm4gbgotICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHVuaWNvZGUpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IGFubm95aW5nIHB5dGhvbiAyLnggdW5pY29kZSBub25zZW5zZQotICAgICAgICByZXR1cm4gX2NvbnZlcnQodmFsLmVuY29kZSgndXRmLTgnKSwgY3R4KQotICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKCJebFxbLipcXSQiLCB2YWwpOiAgICAgICAgICAgIyBwYXJzZSBsaXN0Ci0gICAgICAgIHJldHVybiBbXSBpZiB2YWwgPT0gImxbXSIgZWxzZSBsaXN0KG1hcCgobGFtYmRhIHg6IF9jb252ZXJ0KHgsIGN0eCkpLCB2YWxbMjotMV0uc3BsaXQoIiwiKSkpCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl5zXFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIHNldAotICAgICAgICByZXR1cm4gc2V0KCkgaWYgdmFsID09ICJzW10iIGVsc2Ugc2V0KG1hcCgobGFtYmRhIHg6IF9jb252ZXJ0KHgsIGN0eCkpLCB2YWxbMjotMV0uc3BsaXQoIiwiKSkpCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl5kXFsuKlxdXC5baWxmZG1dJCIsIHZhbCk6ICAjIHBhcnNlIG51bWVyaWMKLSAgICAgICAgcmV0dXJuIGZsb2F0KHZhbFsyOi0zXSkgaWYgdmFsWzI6LTNdLl9fY29udGFpbnNfXygiLiIpIGVsc2UgbG9uZyh2YWxbMjotM10pCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl52XFsuKlxdXC5pZCQiLCB2YWwpOiAgICAgICAjIHBhcnNlIHZlcnRleCBpZAotICAgICAgICByZXR1cm4gX19maW5kX2NhY2hlZF9lbGVtZW50KGN0eCwgZ3JhcGhfbmFtZSwgdmFsWzI6LTRdLCAidiIpLmlkCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl52XFsuKlxdXC5zaWQkIiwgdmFsKTogICAgICAjIHBhcnNlIHZlcnRleCBpZCBhcyBzdHJpbmcKLSAgICAgICAgcmV0dXJuIHN0cihfX2ZpbmRfY2FjaGVkX2VsZW1lbnQoY3R4LCBncmFwaF9uYW1lLCB2YWxbMjotNV0sICJ2IikuaWQpCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl52XFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIHZlcnRleAotICAgICAgICByZXR1cm4gX19maW5kX2NhY2hlZF9lbGVtZW50KGN0eCwgZ3JhcGhfbmFtZSwgdmFsWzI6LTFdLCAidiIpCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl5lXFsuKlxdXC5pZCQiLCB2YWwpOiAgICAgICAjIHBhcnNlIGVkZ2UgaWQKLSAgICAgICAgcmV0dXJuIF9fZmluZF9jYWNoZWRfZWxlbWVudChjdHgsIGdyYXBoX25hbWUsIHZhbFsyOi00XSwgImUiKS5pZAotICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKCJeZVxbLipcXVwuc2lkJCIsIHZhbCk6ICAgICAgIyBwYXJzZSBlZGdlIGlkIGFzIHN0cmluZwotICAgICAgICByZXR1cm4gc3RyKF9fZmluZF9jYWNoZWRfZWxlbWVudChjdHgsIGdyYXBoX25hbWUsIHZhbFsyOi01XSwgImUiKS5pZCkKLSAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHIpIGFuZCByZS5tYXRjaCgiXmVcWy4qXF0kIiwgdmFsKTogICAgICAgICAgICMgcGFyc2UgZWRnZQotICAgICAgICByZXR1cm4gX19maW5kX2NhY2hlZF9lbGVtZW50KGN0eCwgZ3JhcGhfbmFtZSwgdmFsWzI6LTFdLCAiZSIpCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl5tXFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIGpzb24gYXMgYSBtYXAKLSAgICAgICAgcmV0dXJuIF9jb252ZXJ0KGpzb24ubG9hZHModmFsWzI6LTFdKSwgY3R4KQotICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKCJecFxbLipcXSQiLCB2YWwpOiAgICAgICAgICAgIyBwYXJzZSBwYXRoCi0gICAgICAgIHBhdGhfb2JqZWN0cyA9IGxpc3QobWFwKChsYW1iZGEgeDogX2NvbnZlcnQoeCwgY3R4KSksIHZhbFsyOi0xXS5zcGxpdCgiLCIpKSkKLSAgICAgICAgcmV0dXJuIFBhdGgoW3NldChbXSldLCBwYXRoX29iamVjdHMpCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl5jXFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIGxhbWJkYS9jbG9zdXJlCi0gICAgICAgIHJldHVybiBsYW1iZGE6ICh2YWxbMjotMV0sICJncmVtbGluLWdyb292eSIpCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl50XFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIGluc3RhbmNlIG9mIFQgZW51bQotICAgICAgICByZXR1cm4gVFt2YWxbMjotMV1dCi0gICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2goIl5EXFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIGluc3RhbmNlIG9mIERpcmVjdGlvbiBlbnVtCi0gICAgICAgIHJldHVybiBEaXJlY3Rpb25bdmFsWzI6LTFdXQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiB2YWwKLQotCi1kZWYgX19maW5kX2NhY2hlZF9lbGVtZW50KGN0eCwgZ3JhcGhfbmFtZSwgaWRlbnRpZmllciwgZWxlbWVudF90eXBlKToKLSAgICBpZiBncmFwaF9uYW1lID09ICJlbXB0eSI6Ci0gICAgICAgIGNhY2hlID0gX19jcmVhdGVfbG9va3VwX3YoY3R4LnJlbW90ZV9jb25uWyJlbXB0eSJdKSBpZiBlbGVtZW50X3R5cGUgPT0gInYiIGVsc2UgX19jcmVhdGVfbG9va3VwX2UoY3R4LnJlbW90ZV9jb25uWyJlbXB0eSJdKQotICAgIGVsc2U6Ci0gICAgICAgIGNhY2hlID0gY3R4Lmxvb2t1cF92W2dyYXBoX25hbWVdIGlmIGVsZW1lbnRfdHlwZSA9PSAidiIgZWxzZSBjdHgubG9va3VwX2VbZ3JhcGhfbmFtZV0KLQotICAgIHJldHVybiBjYWNoZVtpZGVudGlmaWVyXQotCi0KLWRlZiBfY29udmVydF9yZXN1bHRzKHZhbCk6Ci0gICAgaWYgaXNpbnN0YW5jZSh2YWwsIFBhdGgpOgotICAgICAgICAjIGtpbGwgb3V0IGxhYmVscyBhcyB0aGV5IGFyZW4ndCBpbiB0aGUgYXNzZXJ0aW9uIGxvZ2ljCi0gICAgICAgIHJldHVybiBQYXRoKFtzZXQoW10pXSwgbWFwKGxhbWJkYSBwOiBwLmVuY29kZSgidXRmLTgiKSBpZiBpc2luc3RhbmNlKHAsIHVuaWNvZGUpIGVsc2UgcCwgdmFsLm9iamVjdHMpKQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiB2YWwKLQotCi1kZWYgX2FueV9hc3NlcnRpb24oZGF0YSwgcmVzdWx0LCBjdHgpOgotICAgIGNvbnZlcnRlZCA9IFtfY29udmVydChsaW5lWydyZXN1bHQnXSwgY3R4KSBmb3IgbGluZSBpbiBkYXRhXQotICAgIGZvciByIGluIHJlc3VsdDoKLSAgICAgICAgYXNzZXJ0X3RoYXQociwgaXNfaW4oY29udmVydGVkKSkKLQotCi1kZWYgX3RhYmxlX2Fzc2VydGlvbihkYXRhLCByZXN1bHQsIGN0eCwgb3JkZXJlZCk6Ci0gICAgIyByZXN1bHRzIGZyb20gdHJhdmVyc2FsIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIHRoZSBmZWF0dXJlIGRhdGEgdGFibGUKLSAgICBhc3NlcnRfdGhhdChsZW4ocmVzdWx0KSwgZXF1YWxfdG8obGVuKGRhdGEpKSwgInJlc3VsdDoiICsgc3RyKHJlc3VsdCkpCi0KLSAgICByZXN1bHRzX3RvX3Rlc3QgPSBsaXN0KHJlc3VsdCkKLQotICAgICMgZmluZHMgYSBtYXRjaCBpbiB0aGUgcmVzdWx0cyBmb3IgZWFjaCBsaW5lIG9mIGRhdGEgdG8gYXNzZXJ0IGFuZCB0aGVuIHJlbW92ZXMgdGhhdCBpdGVtCi0gICAgIyBmcm9tIHRoZSBsaXN0IC0gaW4gdGhlIGVuZCB0aGVyZSBzaG91bGQgYmUgbm8gaXRlbXMgbGVmdCBvdmVyIGFuZCBlYWNoIHdpbGwgaGF2ZSBiZWVuIGFzc2VydGVkCi0gICAgZm9yIGl4LCBsaW5lIGluIGVudW1lcmF0ZShkYXRhKToKLSAgICAgICAgdmFsID0gX2NvbnZlcnQobGluZVsncmVzdWx0J10sIGN0eCkKLQotICAgICAgICAjIGNsZWFyIHRoZSBsYWJlbHMgc2luY2Ugd2UgZG9uJ3QgZGVmaW5lIHRoZW0gaW4gLmZlYXR1cmUgZmlsZXMKLSAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIFBhdGgpOgotICAgICAgICAgICAgdmFsLmxhYmVscyA9IFtzZXQoW10pXQotCi0gICAgICAgIGlmIG9yZGVyZWQ6Ci0gICAgICAgICAgICBhc3NlcnRfdGhhdChyZXN1bHRzX3RvX3Rlc3RbaXhdLCBlcXVhbF90byh2YWwpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYXNzZXJ0X3RoYXQodmFsLCBpc19pbihyZXN1bHRzX3RvX3Rlc3QpKQotICAgICAgICAgICAgcmVzdWx0c190b190ZXN0LnJlbW92ZSh2YWwpCi0KLSAgICBpZiBub3Qgb3JkZXJlZDoKLSAgICAgICAgYXNzZXJ0X3RoYXQobGVuKHJlc3VsdHNfdG9fdGVzdCksIGlzXygwKSkKLQotCi1kZWYgX3RyYW5zbGF0ZSh0cmF2ZXJzYWxfKToKLSAgICByZXBsYWNlZCA9IHRyYXZlcnNhbF8ucmVwbGFjZSgiXG4iLCAiIikKLSAgICByZXBsYWNlZCA9IHJlZ2V4X2FsbC5zdWIociJQb3AuYWxsXyIsIHJlcGxhY2VkKQotICAgIHJlcGxhY2VkID0gcmVnZXhfY2FyZGxpc3Quc3ViKHIiQ2FyZGluYWxpdHkubGlzdF8iLCByZXBsYWNlZCkKLSAgICByZXBsYWNlZCA9IHJlZ2V4X2FuZC5zdWIociJcMWFuZF8oIiwgcmVwbGFjZWQpCi0gICAgcmVwbGFjZWQgPSByZWdleF9mcm9tLnN1YihyIlwxZnJvbV8oIiwgcmVwbGFjZWQpCi0gICAgcmVwbGFjZWQgPSByZWdleF9nbG9iYWwuc3ViKHIiXDFnbG9iYWxfIiwgcmVwbGFjZWQpCi0gICAgcmVwbGFjZWQgPSByZWdleF9hcy5zdWIociJcMWFzXygiLCByZXBsYWNlZCkKLSAgICByZXBsYWNlZCA9IHJlZ2V4X2lzLnN1YihyIlwxaXNfKCIsIHJlcGxhY2VkKQotICAgIHJlcGxhY2VkID0gcmVnZXhfbm90LnN1YihyIlwxbm90XygiLCByZXBsYWNlZCkKLSAgICByZXBsYWNlZCA9IHJlZ2V4X29yLnN1YihyIlwxb3JfKCIsIHJlcGxhY2VkKQotICAgIHJlcGxhY2VkID0gcmVnZXhfaW4uc3ViKHIiXDFpbl8oIiwgcmVwbGFjZWQpCi0gICAgcmVwbGFjZWQgPSByZWdleF93aXRoLnN1YihyIlwxd2l0aF8oIiwgcmVwbGFjZWQpCi0gICAgcmVwbGFjZWQgPSByZWdleF90cnVlLnN1YihyIlRydWUiLCByZXBsYWNlZCkKLSAgICByZXR1cm4gcmVnZXhfZmFsc2Uuc3ViKHIiRmFsc2UiLCByZXBsYWNlZCkKLQotCi1kZWYgX21ha2VfdHJhdmVyc2FsKGcsIHRyYXZlcnNhbF9zdHJpbmcsIHBhcmFtcyk6Ci0gICAgYiA9IHsiZyI6IGcsCi0gICAgICAgICAiX18iOiBfXywKLSAgICAgICAgICJCYXJyaWVyIjogQmFycmllciwKLSAgICAgICAgICJDYXJkaW5hbGl0eSI6IENhcmRpbmFsaXR5LAotICAgICAgICAgIkNvbHVtbiI6IENvbHVtbiwKLSAgICAgICAgICJEaXJlY3Rpb24iOiBEaXJlY3Rpb24sCi0gICAgICAgICAiT3JkZXIiOiBPcmRlciwKLSAgICAgICAgICJQIjogUCwKLSAgICAgICAgICJUZXh0UCI6IFRleHRQLAotICAgICAgICAgIklPIjogSU8sCi0gICAgICAgICAiUGljayI6IFBpY2ssCi0gICAgICAgICAiUG9wIjogUG9wLAotICAgICAgICAgIlNjb3BlIjogU2NvcGUsCi0gICAgICAgICAiT3BlcmF0b3IiOiBPcGVyYXRvciwKLSAgICAgICAgICJUIjogVCwKLSAgICAgICAgICJXaXRoT3B0aW9ucyI6IFdpdGhPcHRpb25zfQotCi0gICAgYi51cGRhdGUocGFyYW1zKQotCi0gICAgcmV0dXJuIGV2YWwoX3RyYW5zbGF0ZSh0cmF2ZXJzYWxfc3RyaW5nKSwgYikKLQotCi1kZWYgX19jcmVhdGVfbG9va3VwX3YocmVtb3RlKToKLSAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGUpCi0KLSAgICAjIGhvbGQgYSBtYXAgb2YgbmFtZS92ZXJ0ZXggZm9yIHVzZSBpbiBhc3NlcnRpbmcgcmVzdWx0cwotICAgIHJldHVybiBnLlYoKS5ncm91cCgpLmJ5KCduYW1lJykuYnkodGFpbCgpKS5uZXh0KCkKLQotCi1kZWYgX19jcmVhdGVfbG9va3VwX2UocmVtb3RlKToKLSAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGUpCi0KLSAgICAjIGhvbGQgYSBtYXAgb2YgdGhlICJuYW1lIi9lZGdlIGZvciB1c2UgaW4gYXNzZXJ0aW5nIHJlc3VsdHMgLSAibmFtZSIgaW4gdGhpcyBjb250ZXh0IGlzIGluIHRoZSBmb3JtIG9mCi0gICAgIyBvdXRnb2luZ1YtbGFiZWwtPmluY29taW5nVgotICAgIHJldHVybiBnLkUoKS5ncm91cCgpLiBcCi0gICAgICAgIGJ5KGxhbWJkYTogKCJpdC5vdXRWZXJ0ZXgoKS52YWx1ZSgnbmFtZScpICsgJy0nICsgaXQubGFiZWwoKSArICctPicgKyBpdC5pblZlcnRleCgpLnZhbHVlKCduYW1lJykiLCAiZ3JlbWxpbi1ncm9vdnkiKSkuIFwKLSAgICAgICAgYnkodGFpbCgpKS5uZXh0KCkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9yYWRpc2gvdGVycmFpbi5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9yYWRpc2gvdGVycmFpbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhMDFkMDIuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3JhZGlzaC90ZXJyYWluLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmFub255bW91c190cmF2ZXJzYWwgaW1wb3J0IHRyYXZlcnNhbAotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmdyYXBoX3RyYXZlcnNhbCBpbXBvcnQgX18KLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyIGltcG9ydCBzZXJpYWxpemVyCi1mcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb24gaW1wb3J0IERyaXZlclJlbW90ZUNvbm5lY3Rpb24KLWZyb20gcmFkaXNoIGltcG9ydCBiZWZvcmUsIGFmdGVyLCB3b3JsZAotCi1vdXRWID0gX18ub3V0VgotbGFiZWwgPSBfXy5sYWJlbAotaW5WID0gX18uaW5WCi1wcm9qZWN0ID0gX18ucHJvamVjdAotdGFpbCA9IF9fLnRhaWwKLQotCi1AYmVmb3JlLmFsbAotZGVmIHByZXBhcmVfc3RhdGljX3RyYXZlcnNhbF9zb3VyY2UoZmVhdHVyZXMsIG1hcmtlcik6Ci0gICAgIyBhcyB0aGUgdmFyaW91cyB0cmF2ZXJzYWwgc291cmNlcyBmb3IgdGVzdGluZyBkbyBub3QgY2hhbmdlIHRoZWlyIGRhdGEsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmUtY3JlYXRlIHJlbW90ZXMKLSAgICAjIGFuZCBjbGllbnQgc2lkZSBsb29rdXAgZGF0YSBvdmVyIGFuZCBvdmVyLiBpdCBjYW4gYmUgY3JlYXRlZCBvbmNlIGZvciBhbGwgdGVzdHMgYW5kIGJlIHJldXNlZC4KLSAgICBjYWNoZSA9IHt9Ci0gICAgZm9yIGdyYXBoX25hbWUgaW4gKCgibW9kZXJuIiwgImdtb2Rlcm4iKSwgKCJjbGFzc2ljIiwgImdjbGFzc2ljIiksICgiY3JldyIsICJnY3JldyIpLCAoImdyYXRlZnVsIiwgImdncmF0ZWZ1bCIpLCAoInNpbmsiLCAiZ3NpbmsiKSk6Ci0gICAgICAgIGNhY2hlW2dyYXBoX25hbWVbMF1dID0ge30KLSAgICAgICAgcmVtb3RlID0gX19jcmVhdGVfcmVtb3RlKGdyYXBoX25hbWVbMV0pCi0gICAgICAgIGNhY2hlW2dyYXBoX25hbWVbMF1dWyJyZW1vdGVfY29ubiJdID0gX19jcmVhdGVfcmVtb3RlKGdyYXBoX25hbWVbMV0pCi0gICAgICAgIGNhY2hlW2dyYXBoX25hbWVbMF1dWyJsb29rdXBfdiJdID0gX19jcmVhdGVfbG9va3VwX3YocmVtb3RlKQotICAgICAgICBjYWNoZVtncmFwaF9uYW1lWzBdXVsibG9va3VwX2UiXSA9IF9fY3JlYXRlX2xvb2t1cF9lKHJlbW90ZSkKLQotICAgICMgc3RvcmUgdGhlIGNhY2hlIG9uIHRoZSBnbG9iYWwgY29udGV4dCBzbyB0aGF0IHJlbW90ZXMgY2FuIGJlIHNodXRkb3duIGNsZWFubHkgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdHMKLSAgICB3b3JsZC5jYWNoZSA9IGNhY2hlCi0KLSAgICAjIGl0ZXJhdGUgZWFjaCBmZWF0dXJlIGFuZCBhcHBseSB0aGUgY2FjaGVkIHJlbW90ZXMvbG9va3VwcyB0byBlYWNoIHNjZW5hcmlvIGNvbnRleHQgc28gdGhhdCB0aGV5IGFyZQotICAgICMgYWNjZXNzaWJsZSB0byB0aGUgZmVhdHVyZSBzdGVwcyBmb3IgdGVzdCBsb2dpYwotICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgotICAgICAgICBmb3Igc2NlbmFyaW8gaW4gZmVhdHVyZS5hbGxfc2NlbmFyaW9zOgotICAgICAgICAgICAgc2NlbmFyaW8uY29udGV4dC5yZW1vdGVfY29ubiA9IHt9Ci0gICAgICAgICAgICBzY2VuYXJpby5jb250ZXh0Lmxvb2t1cF92ID0ge30KLSAgICAgICAgICAgIHNjZW5hcmlvLmNvbnRleHQubG9va3VwX2UgPSB7fQotCi0gICAgICAgICAgICBmb3IgZ3JhcGhfbmFtZSBpbiAoIm1vZGVybiIsICJjbGFzc2ljIiwgImNyZXciLCAiZ3JhdGVmdWwiLCAic2luayIpOgotICAgICAgICAgICAgICAgIHNjZW5hcmlvLmNvbnRleHQucmVtb3RlX2Nvbm5bZ3JhcGhfbmFtZV0gPSBjYWNoZVtncmFwaF9uYW1lXVsicmVtb3RlX2Nvbm4iXQotICAgICAgICAgICAgICAgIHNjZW5hcmlvLmNvbnRleHQubG9va3VwX3ZbZ3JhcGhfbmFtZV0gPSBjYWNoZVtncmFwaF9uYW1lXVsibG9va3VwX3YiXQotICAgICAgICAgICAgICAgIHNjZW5hcmlvLmNvbnRleHQubG9va3VwX2VbZ3JhcGhfbmFtZV0gPSBjYWNoZVtncmFwaF9uYW1lXVsibG9va3VwX2UiXQotCi0gICAgICAgICAgICAjIHNldHVwIHRoZSAiZW1wdHkiIGxvb2t1cHMgYXMgbmVlZGVkCi0gICAgICAgICAgICBzY2VuYXJpby5jb250ZXh0Lmxvb2t1cF92WyJlbXB0eSJdID0ge30KLSAgICAgICAgICAgIHNjZW5hcmlvLmNvbnRleHQubG9va3VwX2VbImVtcHR5Il0gPSB7fQotCi0KLUBiZWZvcmUuZWFjaF9zY2VuYXJpbwotZGVmIHByZXBhcmVfdHJhdmVyc2FsX3NvdXJjZShzY2VuYXJpbyk6Ci0gICAgIyBzb21lIHRlc3RzIGNyZWF0ZSBkYXRhIC0gY3JlYXRlIGEgZnJlc2ggcmVtb3RlIHRvIHRoZSBlbXB0eSBncmFwaCBhbmQgY2xlYXIgdGhhdCBncmFwaCBwcmlvciB0byBlYWNoIHRlc3QKLSAgICByZW1vdGUgPSBfX2NyZWF0ZV9yZW1vdGUoImdncmFwaCIpCi0gICAgc2NlbmFyaW8uY29udGV4dC5yZW1vdGVfY29ublsiZW1wdHkiXSA9IHJlbW90ZQotICAgIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHJlbW90ZSkKLSAgICBnLlYoKS5kcm9wKCkuaXRlcmF0ZSgpCi0KLQotQGFmdGVyLmVhY2hfc2NlbmFyaW8KLWRlZiBjbG9zZV90cmF2ZXJzYWxfc291cmNlKHNjZW5hcmlvKToKLSAgICBzY2VuYXJpby5jb250ZXh0LnJlbW90ZV9jb25uWyJlbXB0eSJdLmNsb3NlKCkKLQotCi1AYWZ0ZXIuYWxsCi1kZWYgY2xvc2Vfc3RhdGljX3RyYXZlcnNhbF9zb3VyY2UoZmVhdHVyZXMsIG1hcmtlcik6Ci0gICAgZm9yIGtleSwgdmFsdWUgaW4gd29ybGQuY2FjaGUuaXRlcml0ZW1zKCk6Ci0gICAgICAgIHZhbHVlWyJyZW1vdGVfY29ubiJdLmNsb3NlKCkKLQotCi1kZWYgX19jcmVhdGVfcmVtb3RlKHNlcnZlcl9ncmFwaF9uYW1lKToKLSAgICBpZiBub3QoInNlcmlhbGl6ZXIiIGluIHdvcmxkLmNvbmZpZy51c2VyX2RhdGEpOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0ZXN0IGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgc2V0dGluZyBvZiAtLXVzZXItZGF0YT0ic2VyaWFsaXplcj17bWltZS10eXBlfSInKQotCi0gICAgaWYgd29ybGQuY29uZmlnLnVzZXJfZGF0YVsic2VyaWFsaXplciJdID09ICJhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2pzb24iOgotICAgICAgICBzID0gc2VyaWFsaXplci5HcmFwaFNPTlNlcmlhbGl6ZXJzVjNkMCgpCi0gICAgZWxpZiB3b3JsZC5jb25maWcudXNlcl9kYXRhWyJzZXJpYWxpemVyIl0gPT0gImFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wIjoKLSAgICAgICAgcyA9IHNlcmlhbGl6ZXIuR3JhcGhCaW5hcnlTZXJpYWxpemVyc1YxKCkKLSAgICBlbHNlOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdzZXJpYWxpemVyIG5vdCBmb3VuZCAtICcgKyB3b3JsZC5jb25maWcudXNlcl9kYXRhWyJzZXJpYWxpemVyIl0pCi0KLSAgICByZXR1cm4gRHJpdmVyUmVtb3RlQ29ubmVjdGlvbignd3M6Ly9sb2NhbGhvc3Q6NDU5NDAvZ3JlbWxpbicsIHNlcnZlcl9ncmFwaF9uYW1lLCBtZXNzYWdlX3NlcmlhbGl6ZXI9cykKLQotCi1kZWYgX19jcmVhdGVfbG9va3VwX3YocmVtb3RlKToKLSAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGUpCi0KLSAgICAjIGhvbGQgYSBtYXAgb2YgbmFtZS92ZXJ0ZXggZm9yIHVzZSBpbiBhc3NlcnRpbmcgcmVzdWx0cwotICAgIHJldHVybiBnLlYoKS5ncm91cCgpLmJ5KCduYW1lJykuYnkodGFpbCgpKS5uZXh0KCkKLQotCi1kZWYgX19jcmVhdGVfbG9va3VwX2UocmVtb3RlKToKLSAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGUpCi0KLSAgICAjIGhvbGQgYSBtYXAgb2YgdGhlICJuYW1lIi9lZGdlIGZvciB1c2UgaW4gYXNzZXJ0aW5nIHJlc3VsdHMgLSAibmFtZSIgaW4gdGhpcyBjb250ZXh0IGlzIGluIHRoZSBmb3JtIG9mCi0gICAgIyBvdXRnb2luZ1YtbGFiZWwtPmluY29taW5nVgotICAgIHJldHVybiBnLkUoKS5ncm91cCgpLiBcCi0gICAgICAgIGJ5KGxhbWJkYTogKCJpdC5vdXRWZXJ0ZXgoKS52YWx1ZSgnbmFtZScpICsgJy0nICsgaXQubGFiZWwoKSArICctPicgKyBpdC5pblZlcnRleCgpLnZhbHVlKCduYW1lJykiLCAiZ3JlbWxpbi1ncm9vdnkiKSkuIFwKLSAgICAgICAgYnkodGFpbCgpKS5uZXh0KCkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9zZXR1cC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9zZXR1cC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2MzBlYy4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vc2V0dXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0iIiIKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0iIiIKLWltcG9ydCBjb2RlY3MKLWltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IHRpbWUKLWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKLQotIyBGb2xkZXIgY29udGFpbmluZyB0aGUgc2V0dXAucHkKLXJvb3QgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKLQotIyBQYXRoIHRvIF9fdmVyc2lvbl9fIG1vZHVsZQotdmVyc2lvbl9maWxlID0gb3MucGF0aC5qb2luKHJvb3QsICdncmVtbGluX3B5dGhvbicsICdfX3ZlcnNpb25fXy5weScpCi0KLSMgQ2hlY2sgaWYgdGhpcyBpcyBhIHNvdXJjZSBkaXN0cmlidXRpb24uCi0jIElmIG5vdCBjcmVhdGUgdGhlIF9fdmVyc2lvbl9fIG1vZHVsZSBjb250YWluaW5nIHRoZSB2ZXJzaW9uCi1pZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHJvb3QsICdQS0ctSU5GTycpKToKLSAgICB0aW1lc3RhbXAgPSBpbnQob3MuZ2V0ZW52KCdUSU1FU1RBTVAnLCB0aW1lLnRpbWUoKSAqIDEwMDApKSAvIDEwMDAKLSAgICBmZCA9IGNvZGVjcy5vcGVuKHZlcnNpb25fZmlsZSwgJ3cnLCAndXRmLTgnKQotICAgIGZkLndyaXRlKCInJyciKQotICAgIGZkLndyaXRlKF9fZG9jX18pCi0gICAgZmQud3JpdGUoIicnJ1xuIikKLSAgICBmZC53cml0ZSgndmVyc2lvbiAgID0gJXJcbicgJSBvcy5nZXRlbnYoJ1ZFUlNJT04nLCAnPycpLnJlcGxhY2UoJy1TTkFQU0hPVCcsICcuZGV2LSVkJyAlIHRpbWVzdGFtcCkpCi0gICAgZmQud3JpdGUoJ3RpbWVzdGFtcCA9ICVkXG4nICUgdGltZXN0YW1wKQotICAgIGZkLmNsb3NlKCkKLSMgTG9hZCB2ZXJzaW9uCi1mcm9tIGdyZW1saW5fcHl0aG9uIGltcG9ydCBfX3ZlcnNpb25fXwotCi12ZXJzaW9uID0gX192ZXJzaW9uX18udmVyc2lvbgotCi1pbnN0YWxsX3JlcXVpcmVzID0gWwotICAgICdhZW51bT49MS40LjUsPDMuMC4wJywKLSAgICAndG9ybmFkbz49NC40LjEsPDYuMCcsCi0gICAgJ3NpeD49MS4xMC4wLDwyLjAuMCcsCi0gICAgJ2lzb2RhdGU+PTAuNi4wLDwxLjAuMCcsCi0gICAgJ3B5cGFyc2luZz49Mi40LjcsPDMuMC4wJwotXQotCi1pZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDIpOgotICAgIGluc3RhbGxfcmVxdWlyZXMgKz0gWydmdXR1cmVzPj0zLjAuNSw8NC4wLjAnXQotCi1pZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDUpOgotICAgIGluc3RhbGxfcmVxdWlyZXMgKz0gWydweXBhcnNpbmc+PTIuNC42LDwzLjAuMCddCi0KLXNldHVwKAotICAgIG5hbWU9J2dyZW1saW5weXRob24nLAotICAgIHZlcnNpb249dmVyc2lvbiwKLSAgICBwYWNrYWdlcz1bJ2dyZW1saW5fcHl0aG9uJywgJ2dyZW1saW5fcHl0aG9uLmRyaXZlcicsCi0gICAgICAgICAgICAgICdncmVtbGluX3B5dGhvbi5kcml2ZXIudG9ybmFkbycsICdncmVtbGluX3B5dGhvbi5wcm9jZXNzJywKLSAgICAgICAgICAgICAgJ2dyZW1saW5fcHl0aG9uLnN0cnVjdHVyZScsICdncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8nXSwKLSAgICBsaWNlbnNlPSdBcGFjaGUgMicsCi0gICAgdXJsPSdodHRwOi8vdGlua2VycG9wLmFwYWNoZS5vcmcnLAotICAgIGRlc2NyaXB0aW9uPSdHcmVtbGluLVB5dGhvbiBmb3IgQXBhY2hlIFRpbmtlclBvcCcsCi0gICAgbG9uZ19kZXNjcmlwdGlvbj1jb2RlY3Mub3BlbigiUkVBRE1FLnJzdCIsICJyIiwgIlVURi04IikucmVhZCgpLAotICAgIGxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlPSd0ZXh0L3gtcnN0JywKLSAgICB0ZXN0X3N1aXRlPSJ0ZXN0cyIsCi0gICAgZGF0YV9maWxlcz1bKCIiLCBbIkxJQ0VOU0UiLCAiTk9USUNFIl0pXSwKLSAgICBzZXR1cF9yZXF1aXJlcz1bCi0gICAgICAgICdweXRlc3QtcnVubmVyJywKLSAgICBdLAotICAgIHRlc3RzX3JlcXVpcmU9WwotICAgICAgICAncHl0ZXN0Pj00LjYuNCw8NS4wLjAnLAotICAgICAgICAnbW9jaz49My4wLjUsPDQuMC4wJywKLSAgICAgICAgJ3JhZGlzaC1iZGQ9PTAuOC42JywKLSAgICAgICAgJ1B5SGFtY3Jlc3Q+PTEuOS4wLDwyLjAuMCcKLSAgICBdLAotICAgIGluc3RhbGxfcmVxdWlyZXM9aW5zdGFsbF9yZXF1aXJlcywKLSAgICBjbGFzc2lmaWVycz1bCi0gICAgICAgICJJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzIiwKLSAgICAgICAgIkxpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIiwKLSAgICAgICAgIk5hdHVyYWwgTGFuZ3VhZ2UgOjogRW5nbGlzaCIsCi0gICAgICAgICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43IiwKLSAgICAgICAgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQiLAotICAgICAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNSIsCi0gICAgXQotKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL2NvbmZ0ZXN0LnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL2NvbmZ0ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzM4NTVlLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9jb25mdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1pbXBvcnQgY29uY3VycmVudC5mdXR1cmVzCi1pbXBvcnQgcHl0ZXN0Ci0KLWZyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQotCi1mcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5jbGllbnQgaW1wb3J0IENsaWVudAotZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIuY29ubmVjdGlvbiBpbXBvcnQgQ29ubmVjdGlvbgotZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIgaW1wb3J0IHNlcmlhbGl6ZXIKLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLmRyaXZlcl9yZW1vdGVfY29ubmVjdGlvbiBpbXBvcnQgKAotICAgIERyaXZlclJlbW90ZUNvbm5lY3Rpb24pCi1mcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5wcm90b2NvbCBpbXBvcnQgR3JlbWxpblNlcnZlcldTUHJvdG9jb2wKLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLnNlcmlhbGl6ZXIgaW1wb3J0ICgKLSAgICBHcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyLCBHcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCwgR3JhcGhTT05TZXJpYWxpemVyc1YzZDAsCi0gICAgR3JhcGhCaW5hcnlTZXJpYWxpemVyc1YxKQotZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIudG9ybmFkby50cmFuc3BvcnQgaW1wb3J0IFRvcm5hZG9UcmFuc3BvcnQKLQotIyBkb2NrZXIgR3JlbWxpbiBTZXJ2ZXIgPSAxNzIuMTcuMC4yCi1ncmVtbGluX3NlcnZlcl9ob3N0ID0gImxvY2FsaG9zdCIKLWdyZW1saW5fc2VydmVyX3VybCA9ICd3czovLycgKyBncmVtbGluX3NlcnZlcl9ob3N0ICsgJzo0NTk0MC9ncmVtbGluJwotCi0KLUBweXRlc3QuZml4dHVyZQotZGVmIGNvbm5lY3Rpb24ocmVxdWVzdCk6Ci0gICAgcHJvdG9jb2wgPSBHcmVtbGluU2VydmVyV1NQcm90b2NvbCgKLSAgICAgICAgR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplcigpLAotICAgICAgICB1c2VybmFtZT0nc3RlcGhlbicsIHBhc3N3b3JkPSdwYXNzd29yZCcpCi0gICAgZXhlY3V0b3IgPSBjb25jdXJyZW50LmZ1dHVyZXMuVGhyZWFkUG9vbEV4ZWN1dG9yKDUpCi0gICAgcG9vbCA9IHF1ZXVlLlF1ZXVlKCkKLSAgICB0cnk6Ci0gICAgICAgIGNvbm4gPSBDb25uZWN0aW9uKGdyZW1saW5fc2VydmVyX3VybCwgJ2dtb2Rlcm4nLCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBUb3JuYWRvVHJhbnNwb3J0KCksIGV4ZWN1dG9yLCBwb29sKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpCi0gICAgICAgIHB5dGVzdC5za2lwKCdHcmVtbGluIFNlcnZlciBpcyBub3QgcnVubmluZycpCi0gICAgZWxzZToKLSAgICAgICAgZGVmIGZpbigpOgotICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKQotICAgICAgICAgICAgY29ubi5jbG9zZSgpCi0gICAgICAgIHJlcXVlc3QuYWRkZmluYWxpemVyKGZpbikKLSAgICAgICAgcmV0dXJuIGNvbm4KLQotCi1AcHl0ZXN0LmZpeHR1cmUKLWRlZiBjbGllbnQocmVxdWVzdCk6Ci0gICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBDbGllbnQoZ3JlbWxpbl9zZXJ2ZXJfdXJsLCAnZ21vZGVybicpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgIHB5dGVzdC5za2lwKCdHcmVtbGluIFNlcnZlciBpcyBub3QgcnVubmluZycpCi0gICAgZWxzZToKLSAgICAgICAgZGVmIGZpbigpOgotICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKLSAgICAgICAgcmVxdWVzdC5hZGRmaW5hbGl6ZXIoZmluKQotICAgICAgICByZXR1cm4gY2xpZW50Ci0KLQotQHB5dGVzdC5maXh0dXJlCi1kZWYgc2VjdXJlX2NsaWVudChyZXF1ZXN0KToKLSAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IENsaWVudCgnd3M6Ly8nICsgZ3JlbWxpbl9zZXJ2ZXJfaG9zdCArICc6NDU5NDEvZ3JlbWxpbicsICdnbW9kZXJuJywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPSdzdGVwaGVuJywgcGFzc3dvcmQ9J3Bhc3N3b3JkJykKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcHl0ZXN0LnNraXAoJ0dyZW1saW4gU2VydmVyIGlzIG5vdCBydW5uaW5nJykKLSAgICBlbHNlOgotICAgICAgICBkZWYgZmluKCk6Ci0gICAgICAgICAgICBjbGllbnQuY2xvc2UoKQotICAgICAgICByZXF1ZXN0LmFkZGZpbmFsaXplcihmaW4pCi0gICAgICAgIHJldHVybiBjbGllbnQKLQotCi1AcHl0ZXN0LmZpeHR1cmUocGFyYW1zPVsnZ3JhcGhzb252MicsICdncmFwaHNvbnYzJywgJ2dyYXBoYmluYXJ5djEnXSkKLWRlZiByZW1vdGVfY29ubmVjdGlvbihyZXF1ZXN0KToKLSAgICB0cnk6Ci0gICAgICAgIGlmIHJlcXVlc3QucGFyYW0gPT0gJ2dyYXBoYmluYXJ5djEnOgotICAgICAgICAgICAgcmVtb3RlX2Nvbm4gPSBEcml2ZXJSZW1vdGVDb25uZWN0aW9uKGdyZW1saW5fc2VydmVyX3VybCwgJ2dtb2Rlcm4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplcj1zZXJpYWxpemVyLkdyYXBoQmluYXJ5U2VyaWFsaXplcnNWMSgpKQotICAgICAgICBlbGlmIHJlcXVlc3QucGFyYW0gPT0gJ2dyYXBoc29udjInOgotICAgICAgICAgICAgcmVtb3RlX2Nvbm4gPSBEcml2ZXJSZW1vdGVDb25uZWN0aW9uKGdyZW1saW5fc2VydmVyX3VybCwgJ2dtb2Rlcm4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplcj1zZXJpYWxpemVyLkdyYXBoU09OU2VyaWFsaXplcnNWMmQwKCkpCi0gICAgICAgIGVsaWYgcmVxdWVzdC5wYXJhbSA9PSAnZ3JhcGhzb252Myc6Ci0gICAgICAgICAgICByZW1vdGVfY29ubiA9IERyaXZlclJlbW90ZUNvbm5lY3Rpb24oZ3JlbWxpbl9zZXJ2ZXJfdXJsLCAnZ21vZGVybicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9zZXJpYWxpemVyPXNlcmlhbGl6ZXIuR3JhcGhTT05TZXJpYWxpemVyc1YzZDAoKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VyaWFsaXplciBvcHRpb24gLSAiICsgcmVxdWVzdC5wYXJhbSkKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcHl0ZXN0LnNraXAoJ0dyZW1saW4gU2VydmVyIGlzIG5vdCBydW5uaW5nJykKLSAgICBlbHNlOgotICAgICAgICBkZWYgZmluKCk6Ci0gICAgICAgICAgICByZW1vdGVfY29ubi5jbG9zZSgpCi0gICAgICAgIHJlcXVlc3QuYWRkZmluYWxpemVyKGZpbikKLSAgICAgICAgcmV0dXJuIHJlbW90ZV9jb25uCi0KLQotQHB5dGVzdC5maXh0dXJlCi1kZWYgcmVtb3RlX2Nvbm5lY3Rpb25fdjIocmVxdWVzdCk6Ci0gICAgdHJ5OgotICAgICAgICByZW1vdGVfY29ubiA9IERyaXZlclJlbW90ZUNvbm5lY3Rpb24oZ3JlbWxpbl9zZXJ2ZXJfdXJsLCAnZycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9c2VyaWFsaXplci5HcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCgpKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBweXRlc3Quc2tpcCgnR3JlbWxpbiBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKQotICAgIGVsc2U6Ci0gICAgICAgIGRlZiBmaW4oKToKLSAgICAgICAgICAgIHJlbW90ZV9jb25uLmNsb3NlKCkKLSAgICAgICAgcmVxdWVzdC5hZGRmaW5hbGl6ZXIoZmluKQotICAgICAgICByZXR1cm4gcmVtb3RlX2Nvbm4KLQotCi1AcHl0ZXN0LmZpeHR1cmUKLWRlZiBncmFwaHNvbl9zZXJpYWxpemVyX3YyKHJlcXVlc3QpOgotICAgIHJldHVybiBHcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCgpCi0KLQotQHB5dGVzdC5maXh0dXJlCi1kZWYgZ3JhcGhzb25fc2VyaWFsaXplcl92MyhyZXF1ZXN0KToKLSAgICByZXR1cm4gR3JhcGhTT05TZXJpYWxpemVyc1YzZDAoKQotCi0KLUBweXRlc3QuZml4dHVyZQotZGVmIGdyYXBoYmluYXJ5X3NlcmlhbGl6ZXJfdjEocmVxdWVzdCk6Ci0gICAgcmV0dXJuIEdyYXBoQmluYXJ5U2VyaWFsaXplcnNWMSgpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfY2xpZW50LnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL2RyaXZlci90ZXN0X2NsaWVudC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NWI0OC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfY2xpZW50LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1pbXBvcnQgdGhyZWFkaW5nCi1pbXBvcnQgdXVpZAotCi1mcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5jbGllbnQgaW1wb3J0IENsaWVudAotZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIucHJvdG9jb2wgaW1wb3J0IEdyZW1saW5TZXJ2ZXJFcnJvcgotZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIucmVxdWVzdCBpbXBvcnQgUmVxdWVzdE1lc3NhZ2UKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5ncmFwaF90cmF2ZXJzYWwgaW1wb3J0IF9fCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3Muc3RyYXRlZ2llcyBpbXBvcnQgT3B0aW9uc1N0cmF0ZWd5Ci1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgR3JhcGgKLQotX19hdXRob3JfXyA9ICdEYXZpZCBNLiBCcm93biAoZGF2ZWJzaG93QGdtYWlsLmNvbSknCi0KLQotZGVmIHRlc3RfY29ubmVjdGlvbihjb25uZWN0aW9uKToKLSAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQotICAgIHQgPSBnLlYoKQotICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKLSAgICByZXN1bHRzX3NldCA9IGNvbm5lY3Rpb24ud3JpdGUobWVzc2FnZSkucmVzdWx0KCkKLSAgICBmdXR1cmUgPSByZXN1bHRzX3NldC5hbGwoKQotICAgIHJlc3VsdHMgPSBmdXR1cmUucmVzdWx0KCkKLSAgICBhc3NlcnQgbGVuKHJlc3VsdHMpID09IDYKLSAgICBhc3NlcnQgaXNpbnN0YW5jZShyZXN1bHRzLCBsaXN0KQotICAgIGFzc2VydCByZXN1bHRzX3NldC5kb25lLmRvbmUoKQotICAgIGFzc2VydCAnaG9zdCcgaW4gcmVzdWx0c19zZXQuc3RhdHVzX2F0dHJpYnV0ZXMKLQotCi1kZWYgdGVzdF9jbGllbnRfc2ltcGxlX2V2YWwoY2xpZW50KToKLSAgICBhc3NlcnQgY2xpZW50LnN1Ym1pdCgnMSArIDEnKS5hbGwoKS5yZXN1bHQoKVswXSA9PSAyCi0KLQotZGVmIHRlc3RfY2xpZW50X3NpbXBsZV9ldmFsX2JpbmRpbmdzKGNsaWVudCk6Ci0gICAgYXNzZXJ0IGNsaWVudC5zdWJtaXQoJ3ggKyB4Jywgeyd4JzogMn0pLmFsbCgpLnJlc3VsdCgpWzBdID09IDQKLQotCi1kZWYgdGVzdF9jbGllbnRfZXZhbF90cmF2ZXJzYWwoY2xpZW50KToKLSAgICBhc3NlcnQgbGVuKGNsaWVudC5zdWJtaXQoJ2cuVigpJykuYWxsKCkucmVzdWx0KCkpID09IDYKLQotCi1kZWYgdGVzdF9jbGllbnRfZXJyb3IoY2xpZW50KToKLSAgICB0cnk6Ci0gICAgICAgICMgc2hvdWxkIGZpcmUgYW4gZXhjZXB0aW9uCi0gICAgICAgIGNsaWVudC5zdWJtaXQoJzEvMCcpLmFsbCgpLnJlc3VsdCgpCi0gICAgICAgIGFzc2VydCBGYWxzZQotICAgIGV4Y2VwdCBHcmVtbGluU2VydmVyRXJyb3IgYXMgZXg6Ci0gICAgICAgIGFzc2VydCAnZXhjZXB0aW9ucycgaW4gZXguc3RhdHVzX2F0dHJpYnV0ZXMKLSAgICAgICAgYXNzZXJ0ICdzdGFja1RyYWNlJyBpbiBleC5zdGF0dXNfYXR0cmlidXRlcwotCi0KLWRlZiB0ZXN0X2NsaWVudF9jb25uZWN0aW9uX3Bvb2xfYWZ0ZXJfZXJyb3IoY2xpZW50KToKLSAgICAjIE92ZXJ3cml0ZSBmaXh0dXJlIHdpdGggcG9vbF9zaXplPTEgY2xpZW50Ci0gICAgY2xpZW50ID0gQ2xpZW50KCd3czovL2xvY2FsaG9zdDo0NTk0MC9ncmVtbGluJywgJ2dtb2Rlcm4nLCBwb29sX3NpemU9MSkKLQotICAgIHRyeToKLSAgICAgICAgIyBzaG91bGQgZmlyZSBhbiBleGNlcHRpb24KLSAgICAgICAgY2xpZW50LnN1Ym1pdCgnMS8wJykuYWxsKCkucmVzdWx0KCkKLSAgICAgICAgYXNzZXJ0IEZhbHNlCi0gICAgZXhjZXB0IEdyZW1saW5TZXJ2ZXJFcnJvciBhcyBnc2U6Ci0gICAgICAgICMgZXhwZWN0aW5nIHRoZSBwb29sIHNpemUgdG8gYmUgMSBhZ2FpbiBhZnRlciBxdWVyeSByZXR1cm5lZAotICAgICAgICBhc3NlcnQgZ3NlLnN0YXR1c19jb2RlID09IDU5NwotICAgICAgICBhc3NlcnQgY2xpZW50LmF2YWlsYWJsZV9wb29sX3NpemUgPT0gMQotCi0KLWRlZiB0ZXN0X2NsaWVudF9ieXRlY29kZShjbGllbnQpOgotICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCi0gICAgdCA9IGcuVigpCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQotICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCi0gICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2Ci0KLQotZGVmIHRlc3RfY2xpZW50X2J5dGVjb2RlX29wdGlvbnMoY2xpZW50KToKLSAgICAjIHNtb2tlIHRlc3QgdG8gdmFsaWRhdGUgc2VyaWFsaXphdGlvbiBvZiBPcHRpb25zU3RyYXRlZ3kuIG5vIHdheSB0byByZWFsbHkgdmFsaWRhdGUgdGhpcyBmcm9tIGFuIGludGVncmF0aW9uCi0gICAgIyB0ZXN0IHBlcnNwZWN0aXZlIGJlY2F1c2UgdGhlcmUncyBubyB3YXkgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHN0cmF0ZWd5IHZpYSBieXRlY29kZQotICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCi0gICAgdCA9IGcud2l0aFN0cmF0ZWdpZXMoT3B0aW9uc1N0cmF0ZWd5KG9wdGlvbnM9eyJ4IjogInRlc3QiLCAieSI6IFRydWV9KSkuVigpCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQotICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCi0gICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2Ci0gICAgIyMKLSAgICB0ID0gZy53aXRoXygieCIsICJ0ZXN0Iikud2l0aF8oInkiLCBUcnVlKS5WKCkKLSAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCi0gICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKLSAgICBhc3NlcnQgbGVuKHJlc3VsdF9zZXQuYWxsKCkucmVzdWx0KCkpID09IDYKLQotCi1kZWYgdGVzdF9pdGVyYXRlX3Jlc3VsdF9zZXQoY2xpZW50KToKLSAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQotICAgIHQgPSBnLlYoKQotICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKLSAgICByZXN1bHRfc2V0ID0gY2xpZW50LnN1Ym1pdChtZXNzYWdlKQotICAgIHJlc3VsdHMgPSBbXQotICAgIGZvciByZXN1bHQgaW4gcmVzdWx0X3NldDoKLSAgICAgICAgcmVzdWx0cyArPSByZXN1bHQKLSAgICBhc3NlcnQgbGVuKHJlc3VsdHMpID09IDYKLQotCi1kZWYgdGVzdF9jbGllbnRfYXN5bmMoY2xpZW50KToKLSAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQotICAgIHQgPSBnLlYoKQotICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKLSAgICBmdXR1cmUgPSBjbGllbnQuc3VibWl0QXN5bmMobWVzc2FnZSkKLSAgICByZXN1bHRfc2V0ID0gZnV0dXJlLnJlc3VsdCgpCi0gICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2Ci0KLQotZGVmIHRlc3RfY29ubmVjdGlvbl9zaGFyZShjbGllbnQpOgotICAgICMgT3ZlcndyaXRlIGZpeHR1cmUgd2l0aCBwb29sX3NpemU9MSBjbGllbnQKLSAgICBjbGllbnQgPSBDbGllbnQoJ3dzOi8vbG9jYWxob3N0OjQ1OTQwL2dyZW1saW4nLCAnZ21vZGVybicsIHBvb2xfc2l6ZT0xKQotICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCi0gICAgdCA9IGcuVigpCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQotICAgIG1lc3NhZ2UyID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCi0gICAgZnV0dXJlID0gY2xpZW50LnN1Ym1pdEFzeW5jKG1lc3NhZ2UpCi0gICAgZnV0dXJlMiA9IGNsaWVudC5zdWJtaXRBc3luYyhtZXNzYWdlMikKLQotICAgIHJlc3VsdF9zZXQyID0gZnV0dXJlMi5yZXN1bHQoKQotICAgIGFzc2VydCBsZW4ocmVzdWx0X3NldDIuYWxsKCkucmVzdWx0KCkpID09IDYKLQotICAgICMgVGhpcyBmdXR1cmUgaGFzIHRvIGZpbmlzaCBmb3IgdGhlIHNlY29uZCB0byB5aWVsZCByZXN1bHQgLSBwb29sX3NpemU9MQotICAgIGFzc2VydCBmdXR1cmUuZG9uZSgpCi0gICAgcmVzdWx0X3NldCA9IGZ1dHVyZS5yZXN1bHQoKQotICAgIGFzc2VydCBsZW4ocmVzdWx0X3NldC5hbGwoKS5yZXN1bHQoKSkgPT0gNgotCi0KLWRlZiB0ZXN0X211bHRpX2Nvbm5fcG9vbChjbGllbnQpOgotICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCi0gICAgdCA9IGcuVigpCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQotICAgIG1lc3NhZ2UyID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCi0gICAgY2xpZW50ID0gQ2xpZW50KCd3czovL2xvY2FsaG9zdDo0NTk0MC9ncmVtbGluJywgJ2cnLCBwb29sX3NpemU9MSkKLSAgICBmdXR1cmUgPSBjbGllbnQuc3VibWl0QXN5bmMobWVzc2FnZSkKLSAgICBmdXR1cmUyID0gY2xpZW50LnN1Ym1pdEFzeW5jKG1lc3NhZ2UyKQotCi0gICAgcmVzdWx0X3NldDIgPSBmdXR1cmUyLnJlc3VsdCgpCi0gICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0Mi5hbGwoKS5yZXN1bHQoKSkgPT0gNgotCi0gICAgIyB3aXRoIGNvbm5lY3Rpb24gcG9vbCBgZnV0dXJlYCBtYXkgb3IgbWF5IG5vdCBiZSBkb25lIGhlcmUKLSAgICByZXN1bHRfc2V0ID0gZnV0dXJlLnJlc3VsdCgpCi0gICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2Ci0KLQotZGVmIHRlc3RfbXVsdGlfdGhyZWFkX3Bvb2woY2xpZW50KToKLSAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQotICAgIHRyYXZlcnNhbHMgPSBbZy5WKCksCi0gICAgICAgICAgICAgICAgICBnLlYoKS5jb3VudCgpLAotICAgICAgICAgICAgICAgICAgZy5FKCksCi0gICAgICAgICAgICAgICAgICBnLkUoKS5jb3VudCgpCi0gICAgICAgICAgICAgICAgICBdCi0gICAgcmVzdWx0cyA9IFtbXSBmb3IgXyBpbiB0cmF2ZXJzYWxzXQotCi0gICAgIyBVc2UgYSBjb25kaXRpb24gdmFyaWFibGUgdG8gc3luY2hyb25pc2UgYSBncm91cCBvZiB0aHJlYWRzLCB3aGljaCBzaG91bGQgYWxzbyBpbmplY3Qgc29tZQotICAgICMgbm9uLWRldGVybWluaXNtIGludG8gdGhlIHJ1bi10aW1lIGV4ZWN1dGlvbiBvcmRlcgotICAgIGNvbmRpdGlvbiA9IHRocmVhZGluZy5Db25kaXRpb24oKQotCi0gICAgZGVmIHRocmVhZF9ydW4odHIsIHJlc3VsdF9saXN0KToKLSAgICAgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0ci5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKLSAgICAgICAgd2l0aCBjb25kaXRpb246Ci0gICAgICAgICAgICBjb25kaXRpb24ud2FpdCg1KQotICAgICAgICByZXN1bHRfc2V0ID0gY2xpZW50LnN1Ym1pdChtZXNzYWdlKQotICAgICAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6Ci0gICAgICAgICAgICByZXN1bHRfbGlzdC5hcHBlbmQocmVzdWx0KQotCi0gICAgdGhyZWFkcyA9IFtdCi0gICAgZm9yIGkgaW4gcmFuZ2UobGVuKHJlc3VsdHMpKToKLSAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9dGhyZWFkX3J1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSh0cmF2ZXJzYWxzW2ldLCByZXN1bHRzW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0ZXN0X211bHRpX3RocmVhZF9wb29sXyVkIiAlIGkpCi0gICAgICAgIHRocmVhZC5kYWVtb24gPSBUcnVlCi0gICAgICAgIHRocmVhZHMuYXBwZW5kKHRocmVhZCkKLSAgICAgICAgdGhyZWFkLnN0YXJ0KCkKLSAgICB3aXRoIGNvbmRpdGlvbjoKLSAgICAgICAgY29uZGl0aW9uLm5vdGlmeV9hbGwoKQotCi0gICAgZm9yIHQgaW4gdGhyZWFkczoKLSAgICAgICAgdC5qb2luKDUpCi0KLSAgICBhc3NlcnQgbGVuKHJlc3VsdHNbMF1bMF0pID09IDYKLSAgICBhc3NlcnQgcmVzdWx0c1sxXVswXVswXS5vYmplY3QgPT0gNgotICAgIGFzc2VydCBsZW4ocmVzdWx0c1syXVswXSkgPT0gNgotICAgIGFzc2VydCByZXN1bHRzWzNdWzBdWzBdLm9iamVjdCA9PSA2Ci0KLQotZGVmIHRlc3RfY2xpZW50X2J5dGVjb2RlX3dpdGhfaW50KGNsaWVudCk6Ci0gICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkKLSAgICB0ID0gZy5WKCkuaGFzKCdhZ2UnLCA4NTE0MDE5NzI1ODUxMjIpLmNvdW50KCkKLSAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCi0gICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKLSAgICByZXN1bHRzID0gW10KLSAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6Ci0gICAgICAgIHJlc3VsdHMgKz0gcmVzdWx0Ci0gICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxCi0KLQotZGVmIHRlc3RfbXVsdGlfcmVxdWVzdF9pbl9zZXNzaW9uKGNsaWVudCk6Ci0gICAgIyBPdmVyd3JpdGUgZml4dHVyZSB3aXRoIHNlc3Npb24gY2xpZW50Ci0gICAgc2Vzc2lvbl9pZCA9IHN0cih1dWlkLnV1aWQ0KCkpCi0gICAgY2xpZW50ID0gQ2xpZW50KCd3czovL2xvY2FsaG9zdDo0NTk0MC9ncmVtbGluJywgJ2cnLCBzZXNzaW9uPXNlc3Npb25faWQpCi0KLSAgICBhc3NlcnQgY2xpZW50LnN1Ym1pdCgneCA9IDEnKS5hbGwoKS5yZXN1bHQoKVswXSA9PSAxCi0gICAgYXNzZXJ0IGNsaWVudC5zdWJtaXQoJ3ggKyAyJykuYWxsKCkucmVzdWx0KClbMF0gPT0gMwotCi0gICAgY2xpZW50LmNsb3NlKCkKLQotICAgICMgYXR0ZW1wdCByZWNvbm5lY3QgdG8gc2Vzc2lvbiBhbmQgbWFrZSBzdXJlICJ4IiBpcyBubyBsb25nZXIgYSB0aGluZwotICAgIGNsaWVudCA9IENsaWVudCgnd3M6Ly9sb2NhbGhvc3Q6NDU5NDAvZ3JlbWxpbicsICdnJywgc2Vzc2lvbj1zZXNzaW9uX2lkKQotICAgIHRyeToKLSAgICAgICAgIyBzaG91bGQgZmlyZSBhbiBleGNlcHRpb24KLSAgICAgICAgY2xpZW50LnN1Ym1pdCgneCcpLmFsbCgpLnJlc3VsdCgpCi0gICAgICAgIGFzc2VydCBGYWxzZQotICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgIGFzc2VydCBUcnVlCi0KLQotZGVmIHRlc3RfY2xpZW50X3Bvb2xfaW5fc2Vzc2lvbihjbGllbnQpOgotICAgICMgT3ZlcndyaXRlIGZpeHR1cmUgd2l0aCBwb29sX3NpemU9MiBjbGllbnQKLSAgICB0cnk6Ci0gICAgICAgICMgc2hvdWxkIGZpcmUgYW4gZXhjZXB0aW9uCi0gICAgICAgIGNsaWVudCA9IENsaWVudCgnd3M6Ly9sb2NhbGhvc3Q6NDU5NDAvZ3JlbWxpbicsICdnJywgc2Vzc2lvbj1zdHIodXVpZC51dWlkNCgpKSwgcG9vbF9zaXplPTIpCi0gICAgICAgIGFzc2VydCBGYWxzZQotICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgIGFzc2VydCBUcnVlCi0KLQotZGVmIHRlc3RfYmlnX3Jlc3VsdF9zZXQoY2xpZW50KToKLSAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQotICAgIHQgPSBnLmluamVjdCgxKS5yZXBlYXQoX18uYWRkVigncGVyc29uJykucHJvcGVydHkoJ25hbWUnLCBfXy5sb29wcygpKSkudGltZXMoMjAwMDApLmNvdW50KCkKLSAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2cnfX0pCi0gICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKLSAgICByZXN1bHRzID0gW10KLSAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6Ci0gICAgICAgIHJlc3VsdHMgKz0gcmVzdWx0Ci0gICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxCi0KLSAgICB0ID0gZy5WKCkubGltaXQoMTApCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQotICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCi0gICAgcmVzdWx0cyA9IFtdCi0gICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgotICAgICAgICByZXN1bHRzICs9IHJlc3VsdAotICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAKLQotICAgIHQgPSBnLlYoKS5saW1pdCgxMDApCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQotICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCi0gICAgcmVzdWx0cyA9IFtdCi0gICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgotICAgICAgICByZXN1bHRzICs9IHJlc3VsdAotICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAwCi0KLSAgICB0ID0gZy5WKCkubGltaXQoMTAwMCkKLSAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2cnfX0pCi0gICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKLSAgICByZXN1bHRzID0gW10KLSAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6Ci0gICAgICAgIHJlc3VsdHMgKz0gcmVzdWx0Ci0gICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxMDAwCi0KLSAgICB0ID0gZy5WKCkubGltaXQoMTAwMDApCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQotICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCi0gICAgcmVzdWx0cyA9IFtdCi0gICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgotICAgICAgICByZXN1bHRzICs9IHJlc3VsdAotICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAwMDAKLQotCi1kZWYgdGVzdF9iaWdfcmVzdWx0X3NldF9zZWN1cmUoc2VjdXJlX2NsaWVudCk6Ci0gICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkKLSAgICB0ID0gZy5pbmplY3QoMSkucmVwZWF0KF9fLmFkZFYoJ3BlcnNvbicpLnByb3BlcnR5KCduYW1lJywgX18ubG9vcHMoKSkpLnRpbWVzKDIwMDAwKS5jb3VudCgpCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQotICAgIHJlc3VsdF9zZXQgPSBzZWN1cmVfY2xpZW50LnN1Ym1pdChtZXNzYWdlKQotICAgIHJlc3VsdHMgPSBbXQotICAgIGZvciByZXN1bHQgaW4gcmVzdWx0X3NldDoKLSAgICAgICAgcmVzdWx0cyArPSByZXN1bHQKLSAgICBhc3NlcnQgbGVuKHJlc3VsdHMpID09IDEKLQotICAgIHQgPSBnLlYoKS5saW1pdCgxMCkKLSAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2cnfX0pCi0gICAgcmVzdWx0X3NldCA9IHNlY3VyZV9jbGllbnQuc3VibWl0KG1lc3NhZ2UpCi0gICAgcmVzdWx0cyA9IFtdCi0gICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgotICAgICAgICByZXN1bHRzICs9IHJlc3VsdAotICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAKLQotICAgIHQgPSBnLlYoKS5saW1pdCgxMDApCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQotICAgIHJlc3VsdF9zZXQgPSBzZWN1cmVfY2xpZW50LnN1Ym1pdChtZXNzYWdlKQotICAgIHJlc3VsdHMgPSBbXQotICAgIGZvciByZXN1bHQgaW4gcmVzdWx0X3NldDoKLSAgICAgICAgcmVzdWx0cyArPSByZXN1bHQKLSAgICBhc3NlcnQgbGVuKHJlc3VsdHMpID09IDEwMAotCi0gICAgdCA9IGcuVigpLmxpbWl0KDEwMDApCi0gICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQotICAgIHJlc3VsdF9zZXQgPSBzZWN1cmVfY2xpZW50LnN1Ym1pdChtZXNzYWdlKQotICAgIHJlc3VsdHMgPSBbXQotICAgIGZvciByZXN1bHQgaW4gcmVzdWx0X3NldDoKLSAgICAgICAgcmVzdWx0cyArPSByZXN1bHQKLSAgICBhc3NlcnQgbGVuKHJlc3VsdHMpID09IDEwMDAKLQotICAgIHQgPSBnLlYoKS5saW1pdCgxMDAwMCkKLSAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2cnfX0pCi0gICAgcmVzdWx0X3NldCA9IHNlY3VyZV9jbGllbnQuc3VibWl0KG1lc3NhZ2UpCi0gICAgcmVzdWx0cyA9IFtdCi0gICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgotICAgICAgICByZXN1bHRzICs9IHJlc3VsdAotICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAwMDAKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9kcml2ZXIvdGVzdF9kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb24ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfZHJpdmVyX3JlbW90ZV9jb25uZWN0aW9uLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQ4ZGVhLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9kcml2ZXIvdGVzdF9kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb24ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLWltcG9ydCBweXRlc3QKLQotZnJvbSB0b3JuYWRvIGltcG9ydCBpb2xvb3AsIGdlbgotCi1mcm9tIGdyZW1saW5fcHl0aG9uIGltcG9ydCBzdGF0aWNzCi1mcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5wcm90b2NvbCBpbXBvcnQgR3JlbWxpblNlcnZlckVycm9yCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0YXRpY3MgaW1wb3J0IGxvbmcKLWZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLmRyaXZlcl9yZW1vdGVfY29ubmVjdGlvbiBpbXBvcnQgKAotICAgIERyaXZlclJlbW90ZUNvbm5lY3Rpb24pCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBUcmF2ZXJzZXIKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IFRyYXZlcnNhbFN0cmF0ZWd5Ci1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBCaW5kaW5ncwotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgUAotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmdyYXBoX3RyYXZlcnNhbCBpbXBvcnQgX18KLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5hbm9ueW1vdXNfdHJhdmVyc2FsIGltcG9ydCB0cmF2ZXJzYWwKLWZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBWZXJ0ZXgKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5zdHJhdGVnaWVzIGltcG9ydCBTdWJncmFwaFN0cmF0ZWd5LCBSZXNlcnZlZEtleXNWZXJpZmljYXRpb25TdHJhdGVneQotCi1fX2F1dGhvcl9fID0gJ01hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSknCi0KLQotY2xhc3MgVGVzdERyaXZlclJlbW90ZUNvbm5lY3Rpb24ob2JqZWN0KToKLSAgICBkZWYgdGVzdF90cmF2ZXJzYWxzKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uKToKLSAgICAgICAgc3RhdGljcy5sb2FkX3N0YXRpY3MoZ2xvYmFscygpKQotICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikKLQotICAgICAgICBhc3NlcnQgbG9uZyg2KSA9PSBnLlYoKS5jb3VudCgpLnRvTGlzdCgpWzBdCi0gICAgICAgICMgIwotICAgICAgICBhc3NlcnQgVmVydGV4KDEpID09IGcuVigxKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0IDEgPT0gZy5WKDEpLmlkKCkubmV4dCgpCi0gICAgICAgIGFzc2VydCBUcmF2ZXJzZXIoVmVydGV4KDEpKSA9PSBnLlYoMSkubmV4dFRyYXZlcnNlcigpCi0gICAgICAgIGFzc2VydCAxID09IGxlbihnLlYoMSkudG9MaXN0KCkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGcuVigxKS50b0xpc3QoKSwgbGlzdCkKLSAgICAgICAgcmVzdWx0cyA9IGcuVigpLnJlcGVhdChvdXQoKSkudGltZXMoMikubmFtZQotICAgICAgICByZXN1bHRzID0gcmVzdWx0cy50b0xpc3QoKQotICAgICAgICBhc3NlcnQgMiA9PSBsZW4ocmVzdWx0cykKLSAgICAgICAgYXNzZXJ0ICJsb3AiIGluIHJlc3VsdHMKLSAgICAgICAgYXNzZXJ0ICJyaXBwbGUiIGluIHJlc3VsdHMKLSAgICAgICAgIyAjCi0gICAgICAgIGFzc2VydCAxMCA9PSBnLlYoKS5yZXBlYXQoYm90aCgpKS50aW1lcyg1KVswOjEwXS5jb3VudCgpLm5leHQoKQotICAgICAgICBhc3NlcnQgMSA9PSBnLlYoKS5yZXBlYXQoYm90aCgpKS50aW1lcyg1KVswOjFdLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAwID09IGcuVigpLnJlcGVhdChib3RoKCkpLnRpbWVzKDUpWzA6MF0uY291bnQoKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0IDQgPT0gZy5WKClbMjpdLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAyID09IGcuVigpWzoyXS5jb3VudCgpLm5leHQoKQotICAgICAgICAjICMKLSAgICAgICAgcmVzdWx0cyA9IGcud2l0aFNpZGVFZmZlY3QoJ2EnLCBbJ2pvc2gnLCAncGV0ZXInXSkuVigxKS5vdXQoJ2NyZWF0ZWQnKS5pbl8oJ2NyZWF0ZWQnKS52YWx1ZXMoJ25hbWUnKS53aGVyZShQLndpdGhpbignYScpKS50b0xpc3QoKQotICAgICAgICBhc3NlcnQgMiA9PSBsZW4ocmVzdWx0cykKLSAgICAgICAgYXNzZXJ0ICdqb3NoJyBpbiByZXN1bHRzCi0gICAgICAgIGFzc2VydCAncGV0ZXInIGluIHJlc3VsdHMKLSAgICAgICAgIyAjCi0gICAgICAgIHJlc3VsdHMgPSBnLlYoKS5vdXQoKS5wcm9maWxlKCkudG9MaXN0KCkKLSAgICAgICAgYXNzZXJ0IDEgPT0gbGVuKHJlc3VsdHMpCi0gICAgICAgIGFzc2VydCAnbWV0cmljcycgaW4gcmVzdWx0c1swXQotICAgICAgICBhc3NlcnQgJ2R1cicgaW4gcmVzdWx0c1swXQotICAgICAgICAjICMKLSAgICAgICAgcmVzdWx0cyA9IGcuVigpLmhhcygnbmFtZScsICdwZXRlcicpLmFzXygnYScpLm91dCgnY3JlYXRlZCcpLmFzXygnYicpLnNlbGVjdCgnYScsICdiJykuYnkoCi0gICAgICAgICAgICBfXy52YWx1ZU1hcCgpKS50b0xpc3QoKQotICAgICAgICBhc3NlcnQgMSA9PSBsZW4ocmVzdWx0cykKLSAgICAgICAgYXNzZXJ0ICdwZXRlcicgPT0gcmVzdWx0c1swXVsnYSddWyduYW1lJ11bMF0KLSAgICAgICAgYXNzZXJ0IDM1ID09IHJlc3VsdHNbMF1bJ2EnXVsnYWdlJ11bMF0KLSAgICAgICAgYXNzZXJ0ICdsb3AnID09IHJlc3VsdHNbMF1bJ2InXVsnbmFtZSddWzBdCi0gICAgICAgIGFzc2VydCAnamF2YScgPT0gcmVzdWx0c1swXVsnYiddWydsYW5nJ11bMF0KLSAgICAgICAgYXNzZXJ0IDIgPT0gbGVuKHJlc3VsdHNbMF1bJ2EnXSkKLSAgICAgICAgYXNzZXJ0IDIgPT0gbGVuKHJlc3VsdHNbMF1bJ2InXSkKLSAgICAgICAgIyAjCi0gICAgICAgIHJlc3VsdHMgPSBnLlYoMSkuaW5qZWN0KGcuVigyKS5uZXh0KCkpLnZhbHVlcygnbmFtZScpLnRvTGlzdCgpCi0gICAgICAgIGFzc2VydCAyID09IGxlbihyZXN1bHRzKQotICAgICAgICBhc3NlcnQgJ21hcmtvJyBpbiByZXN1bHRzCi0gICAgICAgIGFzc2VydCAndmFkYXMnIGluIHJlc3VsdHMKLSAgICAgICAgIyAjCi0gICAgICAgIHJlc3VsdHMgPSBnLlYoKS5oYXMoJ3BlcnNvbicsICduYW1lJywgJ21hcmtvJykubWFwKGxhbWJkYTogKCJpdC5nZXQoKS52YWx1ZSgnbmFtZScpIiwgImdyZW1saW4tZ3Jvb3Z5IikpLnRvTGlzdCgpCi0gICAgICAgIGFzc2VydCAxID09IGxlbihyZXN1bHRzKQotICAgICAgICBhc3NlcnQgJ21hcmtvJyBpbiByZXN1bHRzCi0gICAgICAgICMgIwotICAgICAgICAjIHRoaXMgdGVzdCBqdXN0IHZhbGlkYXRlcyB0aGF0IHRoZSB1bmRlcnNjb3JlZCB2ZXJzaW9ucyBvZiBzdGVwcyBjb25mbGljdGluZyB3aXRoIEdyZW1saW4gd29yawotICAgICAgICAjIHByb3Blcmx5IGFuZCBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSBvbGQgc3RlcHMgYXJlIHJlbW92ZWQgLSBUSU5LRVJQT1AtMjI3MgotICAgICAgICByZXN1bHRzID0gZy5WKCkuZmlsdGVyXyhfXy52YWx1ZXMoJ2FnZScpLnN1bV8oKS5hbmRfKAotICAgICAgICAgICAgX18ubWF4XygpLmlzXyhndCgwKSksIF9fLm1pbl8oKS5pc18oZ3QoMCkpKSkucmFuZ2VfKDAsIDEpLmlkXygpLm5leHQoKQotICAgICAgICBhc3NlcnQgMSA9PSByZXN1bHRzCi0gICAgICAgICMgIwotICAgICAgICAjIHRlc3QgYmluZGluZyBpbiBQCi0gICAgICAgIHJlc3VsdHMgPSBnLlYoKS5oYXMoJ3BlcnNvbicsICdhZ2UnLCBCaW5kaW5ncy5vZigneCcsIGx0KDMwKSkpLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAyID09IHJlc3VsdHMKLQotCi0gICAgZGVmIHRlc3RfbGFtYmRhX3RyYXZlcnNhbHMoc2VsZiwgcmVtb3RlX2Nvbm5lY3Rpb24pOgotICAgICAgICBzdGF0aWNzLmxvYWRfc3RhdGljcyhnbG9iYWxzKCkpCi0gICAgICAgIGFzc2VydCAicmVtb3RlY29ubmVjdGlvblt3czovL2xvY2FsaG9zdDo0NTk0MC9ncmVtbGluLGdtb2Rlcm5dIiA9PSBzdHIocmVtb3RlX2Nvbm5lY3Rpb24pCi0gICAgICAgIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHJlbW90ZV9jb25uZWN0aW9uKQotCi0gICAgICAgIGFzc2VydCAyNC4wID09IGcud2l0aFNhY2soMS4wLCBsYW1iZGE6ICgieCAtPiB4ICsgMSIsICJncmVtbGluLWdyb292eSIpKS5WKCkuYm90aCgpLnNhY2soKS5zdW0oKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0IDI0LjAgPT0gZy53aXRoU2FjayhsYW1iZGE6ICgiezEuMGR9IiwgImdyZW1saW4tZ3Jvb3Z5IiksIGxhbWJkYTogKCJ4IC0+IHggKyAxIiwgImdyZW1saW4tZ3Jvb3Z5IikpLlYoKS5ib3RoKCkuc2FjaygpLnN1bSgpLm5leHQoKQotCi0gICAgICAgIGFzc2VydCA0OC4wID09IGcud2l0aFNhY2soMS4wLCBsYW1iZGE6ICgieCwgeSAtPiAgeCArIHkgKyAxIiwgImdyZW1saW4tZ3Jvb3Z5IikpLlYoKS5ib3RoKCkuc2FjaygpLnN1bSgpLm5leHQoKQotICAgICAgICBhc3NlcnQgNDguMCA9PSBnLndpdGhTYWNrKGxhbWJkYTogKCJ7MS4wZH0iLCAiZ3JlbWxpbi1ncm9vdnkiKSwgbGFtYmRhOiAoIngsIHkgLT4gIHggKyB5ICsgMSIsICJncmVtbGluLWdyb292eSIpKS5WKCkuYm90aCgpLnNhY2soKS5zdW0oKS5uZXh0KCkKLQotICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmLCByZW1vdGVfY29ubmVjdGlvbik6Ci0gICAgICAgIHN0YXRpY3MubG9hZF9zdGF0aWNzKGdsb2JhbHMoKSkKLSAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCi0KLSAgICAgICAgdCA9IGcuVigpLmNvdW50KCkKLSAgICAgICAgYXNzZXJ0IHQuaGFzTmV4dCgpCi0gICAgICAgIGFzc2VydCB0Lmhhc05leHQoKQotICAgICAgICBhc3NlcnQgdC5oYXNOZXh0KCkKLSAgICAgICAgYXNzZXJ0IHQuaGFzTmV4dCgpCi0gICAgICAgIGFzc2VydCB0Lmhhc05leHQoKQotICAgICAgICBhc3NlcnQgNiA9PSB0Lm5leHQoKQotICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQotICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQotICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQotICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQotICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQotCi0gICAgICAgIHQgPSBnLlYoKS5oYXMoJ25hbWUnLCBQLndpdGhpbignbWFya28nLCAncGV0ZXInKSkudmFsdWVzKCduYW1lJykub3JkZXIoKQotICAgICAgICBhc3NlcnQgIm1hcmtvIiA9PSB0Lm5leHQoKQotICAgICAgICBhc3NlcnQgdC5oYXNOZXh0KCkKLSAgICAgICAgYXNzZXJ0IHQuaGFzTmV4dCgpCi0gICAgICAgIGFzc2VydCB0Lmhhc05leHQoKQotICAgICAgICBhc3NlcnQgdC5oYXNOZXh0KCkKLSAgICAgICAgYXNzZXJ0IHQuaGFzTmV4dCgpCi0gICAgICAgIGFzc2VydCAicGV0ZXIiID09IHQubmV4dCgpCi0gICAgICAgIGFzc2VydCBub3QodC5oYXNOZXh0KCkpCi0gICAgICAgIGFzc2VydCBub3QodC5oYXNOZXh0KCkpCi0gICAgICAgIGFzc2VydCBub3QodC5oYXNOZXh0KCkpCi0gICAgICAgIGFzc2VydCBub3QodC5oYXNOZXh0KCkpCi0gICAgICAgIGFzc2VydCBub3QodC5oYXNOZXh0KCkpCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdC5uZXh0KCkKLSAgICAgICAgICAgIGFzc2VydCBGYWxzZQotICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKLSAgICAgICAgICAgIGFzc2VydCBUcnVlCi0KLSAgICBkZWYgdGVzdF9zdHJhdGVnaWVzKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uKToKLSAgICAgICAgc3RhdGljcy5sb2FkX3N0YXRpY3MoZ2xvYmFscygpKQotICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikuIFwKLSAgICAgICAgICAgIHdpdGhTdHJhdGVnaWVzKFRyYXZlcnNhbFN0cmF0ZWd5KCJTdWJncmFwaFN0cmF0ZWd5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmVydGljZXMiOiBfXy5oYXNMYWJlbCgicGVyc29uIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVkZ2VzIjogX18uaGFzTGFiZWwoImNyZWF0ZWQiKX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5TdWJncmFwaFN0cmF0ZWd5IikpCi0gICAgICAgIGFzc2VydCA0ID09IGcuVigpLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAwID09IGcuRSgpLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAxID09IGcuVigpLmxhYmVsKCkuZGVkdXAoKS5jb3VudCgpLm5leHQoKQotICAgICAgICBhc3NlcnQgNCA9PSBnLlYoKS5maWx0ZXIobGFtYmRhOiAoImxhbWJkYSB4OiBUcnVlIiwgImdyZW1saW4tcHl0aG9uIikpLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAicGVyc29uIiA9PSBnLlYoKS5sYWJlbCgpLmRlZHVwKCkubmV4dCgpCi0gICAgICAgICMKLSAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pLiBcCi0gICAgICAgICAgICB3aXRoU3RyYXRlZ2llcyhTdWJncmFwaFN0cmF0ZWd5KHZlcnRpY2VzPV9fLmhhc0xhYmVsKCJwZXJzb24iKSwgZWRnZXM9X18uaGFzTGFiZWwoImNyZWF0ZWQiKSkpCi0gICAgICAgIGFzc2VydCA0ID09IGcuVigpLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAwID09IGcuRSgpLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAxID09IGcuVigpLmxhYmVsKCkuZGVkdXAoKS5jb3VudCgpLm5leHQoKQotICAgICAgICBhc3NlcnQgInBlcnNvbiIgPT0gZy5WKCkubGFiZWwoKS5kZWR1cCgpLm5leHQoKQotICAgICAgICAjCi0gICAgICAgIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHJlbW90ZV9jb25uZWN0aW9uKS4gXAotICAgICAgICAgICAgd2l0aFN0cmF0ZWdpZXMoU3ViZ3JhcGhTdHJhdGVneShlZGdlcz1fXy5oYXNMYWJlbCgiY3JlYXRlZCIpKSkKLSAgICAgICAgYXNzZXJ0IDYgPT0gZy5WKCkuY291bnQoKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0IDQgPT0gZy5FKCkuY291bnQoKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0IDEgPT0gZy5FKCkubGFiZWwoKS5kZWR1cCgpLmNvdW50KCkubmV4dCgpCi0gICAgICAgIGFzc2VydCAiY3JlYXRlZCIgPT0gZy5FKCkubGFiZWwoKS5kZWR1cCgpLm5leHQoKQotICAgICAgICAjCi0gICAgICAgIGcgPSBnLndpdGhvdXRTdHJhdGVnaWVzKFN1YmdyYXBoU3RyYXRlZ3kpLiBcCi0gICAgICAgICAgICB3aXRoQ29tcHV0ZXIodmVydGljZXM9X18uaGFzKCJuYW1lIiwgIm1hcmtvIiksIGVkZ2VzPV9fLmxpbWl0KDApKQotICAgICAgICBhc3NlcnQgMSA9PSBnLlYoKS5jb3VudCgpLm5leHQoKQotICAgICAgICBhc3NlcnQgMCA9PSBnLkUoKS5jb3VudCgpLm5leHQoKQotICAgICAgICBhc3NlcnQgInBlcnNvbiIgPT0gZy5WKCkubGFiZWwoKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0ICJtYXJrbyIgPT0gZy5WKCkubmFtZS5uZXh0KCkKLSAgICAgICAgIwotICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikud2l0aENvbXB1dGVyKCkKLSAgICAgICAgYXNzZXJ0IDYgPT0gZy5WKCkuY291bnQoKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0IDYgPT0gZy5FKCkuY291bnQoKS5uZXh0KCkKLSAgICAgICAgIwotICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikuIFwKLSAgICAgICAgICAgIHdpdGhTdHJhdGVnaWVzKFJlc2VydmVkS2V5c1ZlcmlmaWNhdGlvblN0cmF0ZWd5KHRocm93X2V4Y2VwdGlvbj1UcnVlKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiaWQiLCAicGxlYXNlLWRvbid0LXVzZS1pZCIpLml0ZXJhdGUoKQotICAgICAgICAgICAgYXNzZXJ0IEZhbHNlCi0gICAgICAgIGV4Y2VwdCBHcmVtbGluU2VydmVyRXJyb3IgYXMgZ3NlOgotICAgICAgICAgICAgYXNzZXJ0IGdzZS5zdGF0dXNfY29kZSA9PSA1MDAKLQotICAgIGRlZiB0ZXN0X3NpZGVfZWZmZWN0cyhzZWxmLCByZW1vdGVfY29ubmVjdGlvbik6Ci0gICAgICAgIHN0YXRpY3MubG9hZF9zdGF0aWNzKGdsb2JhbHMoKSkKLSAgICAgICAgIwotICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikKLSAgICAgICAgIyMjCi0gICAgICAgIHQgPSBnLlYoKS5oYXNMYWJlbCgicHJvamVjdCIpLm5hbWUuaXRlcmF0ZSgpCi0gICAgICAgIGFzc2VydCAwID09IGxlbih0LnNpZGVfZWZmZWN0cy5rZXlzKCkpCi0gICAgICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhFeGNlcHRpb24pOgotICAgICAgICAgICAgbSA9IHQuc2lkZV9lZmZlY3RzWyJtIl0KLSAgICAgICAgIyMjCi0gICAgICAgIHQgPSBnLlYoKS5vdXQoImNyZWF0ZWQiKS5ncm91cENvdW50KCJtIikuYnkoIm5hbWUiKQotICAgICAgICByZXN1bHRzID0gdC50b1NldCgpCi0gICAgICAgIGFzc2VydCAyID09IGxlbihyZXN1bHRzKQotICAgICAgICBhc3NlcnQgVmVydGV4KDMpIGluIHJlc3VsdHMKLSAgICAgICAgYXNzZXJ0IFZlcnRleCg1KSBpbiByZXN1bHRzCi0gICAgICAgIGFzc2VydCAxID09IGxlbih0LnNpZGVfZWZmZWN0cy5rZXlzKCkpCi0gICAgICAgIGFzc2VydCAibSIgaW4gdC5zaWRlX2VmZmVjdHMua2V5cygpCi0gICAgICAgIG0gPSB0LnNpZGVfZWZmZWN0c1sibSJdCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG0sIGRpY3QpCi0gICAgICAgIGFzc2VydCAyID09IGxlbihtKQotICAgICAgICBhc3NlcnQgMyA9PSBtWyJsb3AiXQotICAgICAgICBhc3NlcnQgMSA9PSBtWyJyaXBwbGUiXQotCi0gICAgICAgICMgY2hlY2sgc3RhdHVzIGF0dHJpYnV0ZXMKLSAgICAgICAgYXNzZXJ0ICJob3N0IiBpbiB0LnNpZGVfZWZmZWN0cy5zdGF0dXNfYXR0cmlidXRlcwotCi0gICAgICAgICMjCi0gICAgICAgIHQgPSBnLlYoKS5vdXQoImNyZWF0ZWQiKS5ncm91cENvdW50KCJtIikuYnkoIm5hbWUiKS5uYW1lLmFnZ3JlZ2F0ZSgibiIpCi0gICAgICAgIHJlc3VsdHMgPSB0LnRvU2V0KCkKLSAgICAgICAgYXNzZXJ0IDIgPT0gbGVuKHJlc3VsdHMpCi0gICAgICAgIGFzc2VydCAibG9wIiBpbiByZXN1bHRzCi0gICAgICAgIGFzc2VydCAicmlwcGxlIiBpbiByZXN1bHRzCi0gICAgICAgIGFzc2VydCAyID09IGxlbih0LnNpZGVfZWZmZWN0cy5rZXlzKCkpCi0gICAgICAgIGFzc2VydCAibSIgaW4gdC5zaWRlX2VmZmVjdHMua2V5cygpCi0gICAgICAgIGFzc2VydCAibiIgaW4gdC5zaWRlX2VmZmVjdHMua2V5cygpCi0gICAgICAgIG4gPSB0LnNpZGVfZWZmZWN0cy5nZXQoIm4iKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuLCBkaWN0KQotICAgICAgICBhc3NlcnQgMiA9PSBsZW4obikKLSAgICAgICAgYXNzZXJ0ICJsb3AiIGluIG4ua2V5cygpCi0gICAgICAgIGFzc2VydCAicmlwcGxlIiBpbiBuLmtleXMoKQotICAgICAgICBhc3NlcnQgMyA9PSBuWyJsb3AiXQotICAgICAgICBhc3NlcnQgMSA9PSBuWyJyaXBwbGUiXQotCi0gICAgICAgIHQgPSBnLndpdGhTaWRlRWZmZWN0KCdtJywgMzIpLlYoKS5tYXAobGFtYmRhOiAieDogeC5zaWRlRWZmZWN0cygnbScpIikKLSAgICAgICAgcmVzdWx0cyA9IHQudG9TZXQoKQotICAgICAgICBhc3NlcnQgMSA9PSBsZW4ocmVzdWx0cykKLSAgICAgICAgYXNzZXJ0IDMyID09IGxpc3QocmVzdWx0cylbMF0KLSAgICAgICAgYXNzZXJ0IDMyID09IHQuc2lkZV9lZmZlY3RzWydtJ10KLSAgICAgICAgYXNzZXJ0IDEgPT0gbGVuKHQuc2lkZV9lZmZlY3RzLmtleXMoKSkKLSAgICAgICAgd2l0aCBweXRlc3QucmFpc2VzKEV4Y2VwdGlvbik6Ci0gICAgICAgICAgICB4ID0gdC5zaWRlX2VmZmVjdHNbIngiXQotCi0gICAgICAgIGEgPSBnLlYoKS5oYXMoIm5hbWUiLCAibWFya28iKS5uZXh0KCkKLSAgICAgICAgYiA9IGcuVigpLmhhcygibmFtZSIsICJwZXRlciIpLm5leHQoKQotICAgICAgICBlZGdlID0gZy53aXRoU2lkZUVmZmVjdCgiYiIsIGIpLlYoYSkuYWRkRSgia25vd3MiKS50bygiYiIpLm5leHQoKQotICAgICAgICBhc3NlcnQgImtub3dzIiA9PSBlZGdlLmxhYmVsCi0gICAgICAgIGFzc2VydCBhID09IGVkZ2Uub3V0VgotICAgICAgICBhc3NlcnQgYiA9PSBlZGdlLmluVgotICAgICAgICBnLlYoKS5oYXMoIm5hbWUiLCAibWFya28iKS5vdXRFKCJrbm93cyIpLndoZXJlKF9fLmluVigpLmhhcygibmFtZSIsICJwZXRlciIpKS5kcm9wKCkuaXRlcmF0ZSgpCi0gICAgICAgICMjCi0gICAgICAgIGVkZ2UgPSBnLndpdGhTaWRlRWZmZWN0KCJhIiwgYSkud2l0aFNpZGVFZmZlY3QoImIiLCBiKS5WKCkubGltaXQoMSkuYWRkRSgia25vd3MiKS5mcm9tXygiYSIpLnRvKCJiIikubmV4dCgpCi0gICAgICAgIGFzc2VydCAia25vd3MiID09IGVkZ2UubGFiZWwKLSAgICAgICAgYXNzZXJ0IGEgPT0gZWRnZS5vdXRWCi0gICAgICAgIGFzc2VydCBiID09IGVkZ2UuaW5WCi0gICAgICAgIGcuVigpLmhhcygibmFtZSIsICJtYXJrbyIpLm91dEUoImtub3dzIikud2hlcmUoX18uaW5WKCkuaGFzKCJuYW1lIiwgInBldGVyIikpLmRyb3AoKS5pdGVyYXRlKCkKLQotICAgIGRlZiB0ZXN0X3NpZGVfZWZmZWN0X2Nsb3NlKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uKToKLSAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCi0gICAgICAgIHQgPSBnLlYoKS5hZ2dyZWdhdGUoJ2EnKS5hZ2dyZWdhdGUoJ2InKQotICAgICAgICB0LnRvTGlzdCgpCi0KLSAgICAgICAgIyBUaGUgJ2EnIGtleSBzaG91bGQgcmV0dXJuIHNvbWUgc2lkZSBlZmZlY3RzCi0gICAgICAgIHJlc3VsdHMgPSB0LnNpZGVfZWZmZWN0cy5nZXQoJ2EnKQotICAgICAgICBhc3NlcnQgcmVzdWx0cwotCi0gICAgICAgICMgQ2xvc2UgcmVzdWx0IGlzIE5vbmUKLSAgICAgICAgcmVzdWx0cyA9IHQuc2lkZV9lZmZlY3RzLmNsb3NlKCkKLSAgICAgICAgYXNzZXJ0IG5vdCByZXN1bHRzCi0KLSAgICAgICAgIyBTaG91bGRuJ3QgZ2V0IGFueSBuZXcgaW5mbyBmcm9tIHNlcnZlcgotICAgICAgICAjICdiJyBpc24ndCBpbiBsb2NhbCBjYWNoZQotICAgICAgICByZXN1bHRzID0gdC5zaWRlX2VmZmVjdHMuZ2V0KCdiJykKLSAgICAgICAgYXNzZXJ0IG5vdCByZXN1bHRzCi0KLSAgICAgICAgIyBCdXQgJ2EnIHNob3VsZCBzdGlsbCBiZSBjYWNoZWQgbG9jYWxseQotICAgICAgICByZXN1bHRzID0gdC5zaWRlX2VmZmVjdHMuZ2V0KCdhJykKLSAgICAgICAgYXNzZXJ0IHJlc3VsdHMKLQotICAgICAgICAjICdhJyBzaG91bGQgaGF2ZSBiZWVuIGFkZGVkIHRvIGxvY2FsIGtleXMgY2FjaGUsIGJ1dCBub3QgJ2InCi0gICAgICAgIHJlc3VsdHMgPSB0LnNpZGVfZWZmZWN0cy5rZXlzKCkKLSAgICAgICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxCi0gICAgICAgIGEsID0gcmVzdWx0cwotICAgICAgICBhc3NlcnQgYSA9PSAnYScKLQotICAgICAgICAjIFRyeSB0byBnZXQgJ2InIGRpcmVjdGx5IGZyb20gc2VydmVyLCBzaG91bGQgdGhyb3cgZXJyb3IKLSAgICAgICAgd2l0aCBweXRlc3QucmFpc2VzKEV4Y2VwdGlvbik6Ci0gICAgICAgICAgICB0LnNpZGVfZWZmZWN0cy52YWx1ZV9sYW1iZGEoJ2InKQotCi0gICAgZGVmIHRlc3RfcHJvbWlzZShzZWxmLCByZW1vdGVfY29ubmVjdGlvbik6Ci0gICAgICAgIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHJlbW90ZV9jb25uZWN0aW9uKQotICAgICAgICBmdXR1cmUgPSBnLlYoKS5hZ2dyZWdhdGUoJ2EnKS5wcm9taXNlKCkKLSAgICAgICAgdCA9IGZ1dHVyZS5yZXN1bHQoKQotICAgICAgICBhc3NlcnQgbGVuKHQudG9MaXN0KCkpID09IDYKLSAgICAgICAgYSwgPSB0LnNpZGVfZWZmZWN0cy5rZXlzKCkKLSAgICAgICAgYXNzZXJ0IGEgPT0gJ2EnCi0gICAgICAgIHJlc3VsdHMgPSB0LnNpZGVfZWZmZWN0cy5nZXQoJ2EnKQotICAgICAgICBhc3NlcnQgcmVzdWx0cwotICAgICAgICByZXN1bHRzID0gdC5zaWRlX2VmZmVjdHMuY2xvc2UoKQotICAgICAgICBhc3NlcnQgbm90IHJlc3VsdHMKLQotICAgIGRlZiB0ZXN0X2Nsb25lKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uKToKLSAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCi0gICAgICAgIHQgPSBnLlYoKS5jb3VudCgpCi0gICAgICAgIGFzc2VydCA2ID09IHQubmV4dCgpCi0gICAgICAgIGFzc2VydCA2ID09IHQuY2xvbmUoKS5uZXh0KCkKLSAgICAgICAgYXNzZXJ0IDYgPT0gdC5jbG9uZSgpLm5leHQoKQotCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvcHJvY2Vzcy90ZXN0X3RyYXZlcnNhbC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9wcm9jZXNzL3Rlc3RfdHJhdmVyc2FsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjliNjE5Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9wcm9jZXNzL3Rlc3RfdHJhdmVyc2FsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJwotCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgR3JhcGgKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5hbm9ueW1vdXNfdHJhdmVyc2FsIGltcG9ydCB0cmF2ZXJzYWwKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IFAKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IEJpbmRpbmcsIEJpbmRpbmdzCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBfXwotCi0KLWNsYXNzIFRlc3RUcmF2ZXJzYWwob2JqZWN0KToKLSAgICBkZWYgdGVzdF9ieXRlY29kZShzZWxmKToKLSAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhHcmFwaChHcmFwaCgpKQotICAgICAgICBieXRlY29kZSA9IGcuVigpLm91dCgiY3JlYXRlZCIpLmJ5dGVjb2RlCi0gICAgICAgIGFzc2VydCAwID09IGxlbihieXRlY29kZS5iaW5kaW5ncy5rZXlzKCkpCi0gICAgICAgIGFzc2VydCAwID09IGxlbihieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zKQotICAgICAgICBhc3NlcnQgMiA9PSBsZW4oYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMpCi0gICAgICAgIGFzc2VydCAiViIgPT0gYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMF1bMF0KLSAgICAgICAgYXNzZXJ0ICJvdXQiID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzFdWzBdCi0gICAgICAgIGFzc2VydCAiY3JlYXRlZCIgPT0gYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV1bMV0KLSAgICAgICAgYXNzZXJ0IDEgPT0gbGVuKGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzBdKQotICAgICAgICBhc3NlcnQgMiA9PSBsZW4oYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV0pCi0gICAgICAgICMjCi0gICAgICAgIGJ5dGVjb2RlID0gZy53aXRoU2FjaygxKS5FKCkuZ3JvdXBDb3VudCgpLmJ5KCJ3ZWlnaHQiKS5ieXRlY29kZQotICAgICAgICBhc3NlcnQgMCA9PSBsZW4oYnl0ZWNvZGUuYmluZGluZ3Mua2V5cygpKQotICAgICAgICBhc3NlcnQgMSA9PSBsZW4oYnl0ZWNvZGUuc291cmNlX2luc3RydWN0aW9ucykKLSAgICAgICAgYXNzZXJ0ICJ3aXRoU2FjayIgPT0gYnl0ZWNvZGUuc291cmNlX2luc3RydWN0aW9uc1swXVswXQotICAgICAgICBhc3NlcnQgMSA9PSBieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zWzBdWzFdCi0gICAgICAgIGFzc2VydCAzID09IGxlbihieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKLSAgICAgICAgYXNzZXJ0ICJFIiA9PSBieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1swXVswXQotICAgICAgICBhc3NlcnQgImdyb3VwQ291bnQiID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzFdWzBdCi0gICAgICAgIGFzc2VydCAiYnkiID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzJdWzBdCi0gICAgICAgIGFzc2VydCAid2VpZ2h0IiA9PSBieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1syXVsxXQotICAgICAgICBhc3NlcnQgMSA9PSBsZW4oYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMF0pCi0gICAgICAgIGFzc2VydCAxID09IGxlbihieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1sxXSkKLSAgICAgICAgYXNzZXJ0IDIgPT0gbGVuKGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzJdKQotICAgICAgICAjIwotICAgICAgICBieXRlY29kZSA9IGcuVihCaW5kaW5ncy5vZignYScsIFsxLDIsM10pKSBcCi0gICAgICAgICAgICAub3V0KEJpbmRpbmdzLm9mKCdiJywnY3JlYXRlZCcpKSBcCi0gICAgICAgICAgICAud2hlcmUoX18uaW5fKEJpbmRpbmdzLm9mKCdjJywnY3JlYXRlZCcpLCBCaW5kaW5ncy5vZignZCcsJ2tub3dzJykpIFwKLSAgICAgICAgICAgIC5jb3VudCgpLmlzXyhCaW5kaW5ncy5vZignZScsUC5ndCgyKSkpKS5ieXRlY29kZQotICAgICAgICBhc3NlcnQgNSA9PSBsZW4oYnl0ZWNvZGUuYmluZGluZ3Mua2V5cygpKQotICAgICAgICBhc3NlcnQgWzEsMiwzXSA9PSBieXRlY29kZS5iaW5kaW5nc1snYSddCi0gICAgICAgIGFzc2VydCAnY3JlYXRlZCcgPT0gYnl0ZWNvZGUuYmluZGluZ3NbJ2InXQotICAgICAgICBhc3NlcnQgJ2NyZWF0ZWQnID09IGJ5dGVjb2RlLmJpbmRpbmdzWydjJ10KLSAgICAgICAgYXNzZXJ0ICdrbm93cycgPT0gYnl0ZWNvZGUuYmluZGluZ3NbJ2QnXQotICAgICAgICBhc3NlcnQgUC5ndCgyKSA9PSBieXRlY29kZS5iaW5kaW5nc1snZSddCi0gICAgICAgIGFzc2VydCBCaW5kaW5nKCdiJywnY3JlYXRlZCcpID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzFdWzFdCi0gICAgICAgIGFzc2VydCAnYmluZGluZ1tiPWNyZWF0ZWRdJyA9PSBzdHIoYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV1bMV0pCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGhhc2goYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV1bMV0pLGludCkKLQotICAgIGRlZiB0ZXN0X1Aoc2VsZik6Ci0gICAgICAgICMgdmVyaWZ5IHRoYXQgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgcmVzcGVjdGVkCi0gICAgICAgIGFzc2VydCAiYW5kKGVxKGEpLGx0KGIpKSIgPT0gc3RyKFAuZXEoImEiKS5hbmRfKFAubHQoImIiKSkpCi0gICAgICAgIGFzc2VydCAiYW5kKG9yKGx0KGIpLGd0KGMpKSxuZXEoZCkpIiA9PSBzdHIoUC5sdCgiYiIpLm9yXyhQLmd0KCJjIikpLmFuZF8oUC5uZXEoImQiKSkpCi0gICAgICAgIGFzc2VydCAiYW5kKG9yKGx0KGIpLGd0KGMpKSxvcihuZXEoZCksZ3RlKGUpKSkiID09IHN0cigKLSAgICAgICAgICAgIFAubHQoImIiKS5vcl8oUC5ndCgiYyIpKS5hbmRfKFAubmVxKCJkIikub3JfKFAuZ3RlKCJlIikpKSkKLQotICAgIGRlZiB0ZXN0X2Fub255bW91c190cmF2ZXJzYWwoc2VsZik6Ci0gICAgICAgIGJ5dGVjb2RlID0gX18uX18oMSkuYnl0ZWNvZGUKLSAgICAgICAgYXNzZXJ0IDAgPT0gbGVuKGJ5dGVjb2RlLmJpbmRpbmdzLmtleXMoKSkKLSAgICAgICAgYXNzZXJ0IDAgPT0gbGVuKGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMpCi0gICAgICAgIGFzc2VydCAxID09IGxlbihieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKLSAgICAgICAgYXNzZXJ0ICJpbmplY3QiID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzBdWzBdCi0gICAgICAgIGFzc2VydCAxID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzBdWzFdCi0gICAgICAgICMjCi0gICAgICAgIGJ5dGVjb2RlID0gX18uc3RhcnQoKS5ieXRlY29kZQotICAgICAgICBhc3NlcnQgMCA9PSBsZW4oYnl0ZWNvZGUuYmluZGluZ3Mua2V5cygpKQotICAgICAgICBhc3NlcnQgMCA9PSBsZW4oYnl0ZWNvZGUuc291cmNlX2luc3RydWN0aW9ucykKLSAgICAgICAgYXNzZXJ0IDAgPT0gbGVuKGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zKQotCi0gICAgZGVmIHRlc3RfY2xvbmVfdHJhdmVyc2FsKHNlbGYpOgotICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aEdyYXBoKEdyYXBoKCkpCi0gICAgICAgIG9yaWdpbmFsID0gZy5WKCkub3V0KCJjcmVhdGVkIikKLSAgICAgICAgY2xvbmUgPSBvcmlnaW5hbC5jbG9uZSgpLm91dCgia25vd3MiKQotICAgICAgICBjbG9uZUNsb25lID0gY2xvbmUuY2xvbmUoKS5vdXQoImNyZWF0ZWQiKQotCi0gICAgICAgIGFzc2VydCAyID09IGxlbihvcmlnaW5hbC5ieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKLSAgICAgICAgYXNzZXJ0IDMgPT0gbGVuKGNsb25lLmJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zKQotICAgICAgICBhc3NlcnQgNCA9PSBsZW4oY2xvbmVDbG9uZS5ieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKLQotICAgICAgICBvcmlnaW5hbC5oYXMoInBlcnNvbiIsICJuYW1lIiwgIm1hcmtvIikKLSAgICAgICAgY2xvbmUuVigpLm91dCgpCi0KLSAgICAgICAgYXNzZXJ0IDMgPT0gbGVuKG9yaWdpbmFsLmJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zKQotICAgICAgICBhc3NlcnQgNSA9PSBsZW4oY2xvbmUuYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMpCi0gICAgICAgIGFzc2VydCA0ID09IGxlbihjbG9uZUNsb25lLmJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zKQotCi0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9mdW5jdGlvbmFsaXR5aW8ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZnVuY3Rpb25hbGl0eWlvLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmE2MmEyLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9mdW5jdGlvbmFsaXR5aW8ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0nJycKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0nJycKLQotaW1wb3J0IGRhdGV0aW1lCi1pbXBvcnQgdXVpZAotCi1mcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5zZXJpYWxpemVyIGltcG9ydCBHcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMAotZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IEdyYXBoCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0YXRpY3MgaW1wb3J0ICoKLQotCi1kZWYgdGVzdF90aW1lc3RhbXAocmVtb3RlX2Nvbm5lY3Rpb24pOgotICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCi0gICAgdHMgPSB0aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDApCi0gICAgcmVzcCA9IGcuYWRkVigndGVzdF92ZXJ0ZXgnKS5wcm9wZXJ0eSgndHMnLCB0cykKLSAgICByZXNwID0gcmVzcC50b0xpc3QoKQotICAgIHZpZCA9IHJlc3BbMF0uaWQKLSAgICB0cnk6Ci0gICAgICAgIHRzX3Byb3AgPSBnLlYodmlkKS5wcm9wZXJ0aWVzKCd0cycpLnRvTGlzdCgpWzBdCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRzX3Byb3AudmFsdWUsIHRpbWVzdGFtcCkKLSAgICAgICAgYXNzZXJ0IHRzX3Byb3AudmFsdWUgPT0gdHMKLSAgICBmaW5hbGx5OgotICAgICAgICBnLlYodmlkKS5kcm9wKCkuaXRlcmF0ZSgpCi0KLQotZGVmIHRlc3RfZGF0ZXRpbWUocmVtb3RlX2Nvbm5lY3Rpb24pOgotICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCi0gICAgZHQgPSBkYXRldGltZS5kYXRldGltZS51dGNmcm9tdGltZXN0YW1wKDE0ODE3NTAwNzYyOTUgLyAxMDAwKQotICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ2R0JywgZHQpLnRvTGlzdCgpCi0gICAgdmlkID0gcmVzcFswXS5pZAotICAgIHRyeToKLSAgICAgICAgZHRfcHJvcCA9IGcuVih2aWQpLnByb3BlcnRpZXMoJ2R0JykudG9MaXN0KClbMF0KLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZHRfcHJvcC52YWx1ZSwgZGF0ZXRpbWUuZGF0ZXRpbWUpCi0gICAgICAgIGFzc2VydCBkdF9wcm9wLnZhbHVlID09IGR0Ci0gICAgZmluYWxseToKLSAgICAgICAgZy5WKHZpZCkuZHJvcCgpLml0ZXJhdGUoKQotCi0KLWRlZiB0ZXN0X3V1aWQocmVtb3RlX2Nvbm5lY3Rpb24pOgotICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCi0gICAgdWlkID0gdXVpZC5VVUlEKCI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiKQotICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ3V1aWQnLCB1aWQpLnRvTGlzdCgpCi0gICAgdmlkID0gcmVzcFswXS5pZAotICAgIHRyeToKLSAgICAgICAgdWlkX3Byb3AgPSBnLlYodmlkKS5wcm9wZXJ0aWVzKCd1dWlkJykudG9MaXN0KClbMF0KLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodWlkX3Byb3AudmFsdWUsIHV1aWQuVVVJRCkKLSAgICAgICAgYXNzZXJ0IHVpZF9wcm9wLnZhbHVlID09IHVpZAotICAgIGZpbmFsbHk6Ci0gICAgICAgIGcuVih2aWQpLmRyb3AoKS5pdGVyYXRlKCkKLQotCi1kZWYgdGVzdF9vZGRfYml0cyhyZW1vdGVfY29ubmVjdGlvbik6Ci0gICAgaWYgbm90IGlzaW5zdGFuY2UocmVtb3RlX2Nvbm5lY3Rpb24uX2NsaWVudC5fbWVzc2FnZV9zZXJpYWxpemVyLCBHcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCk6Ci0gICAgICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCi0gICAgICAgIGNoYXJfbG93ZXIgPSBzdHIuX19uZXdfXyhTaW5nbGVDaGFyLCBjaHIoNzgpKQotICAgICAgICByZXNwID0gZy5hZGRWKCd0ZXN0X3ZlcnRleCcpLnByb3BlcnR5KCdjaGFyX2xvd2VyJywgY2hhcl9sb3dlcikudG9MaXN0KCkKLSAgICAgICAgdmlkID0gcmVzcFswXS5pZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB2ID0gZy5WKHZpZCkudmFsdWVzKCdjaGFyX2xvd2VyJykudG9MaXN0KClbMF0KLSAgICAgICAgICAgIGFzc2VydCB2ID09IGNoYXJfbG93ZXIKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGcuVih2aWQpLmRyb3AoKS5pdGVyYXRlKCkKLQotICAgICAgICBpZiBzaXguUFkzOgotICAgICAgICAgICAgY2hhcl91cHBlciA9IHN0ci5fX25ld19fKFNpbmdsZUNoYXIsIGNocig1NzM0NCkpCi0gICAgICAgICAgICByZXNwID0gZy5hZGRWKCd0ZXN0X3ZlcnRleCcpLnByb3BlcnR5KCdjaGFyX3VwcGVyJywgY2hhcl91cHBlcikudG9MaXN0KCkKLSAgICAgICAgICAgIHZpZCA9IHJlc3BbMF0uaWQKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB2ID0gZy5WKHZpZCkudmFsdWVzKCdjaGFyX3VwcGVyJykudG9MaXN0KClbMF0KLSAgICAgICAgICAgICAgICBhc3NlcnQgdiA9PSBjaGFyX3VwcGVyCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIGcuVih2aWQpLmRyb3AoKS5pdGVyYXRlKCkKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgZHVyID0gZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9MTAwMCwgbWljcm9zZWNvbmRzPTEwMDApCi0gICAgICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ2R1cicsIGR1cikudG9MaXN0KCkKLSAgICAgICAgdmlkID0gcmVzcFswXS5pZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB2ID0gZy5WKHZpZCkudmFsdWVzKCdkdXInKS50b0xpc3QoKVswXQotICAgICAgICAgICAgYXNzZXJ0IHYgPT0gZHVyCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBnLlYodmlkKS5kcm9wKCkuaXRlcmF0ZSgpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZ3JhcGhiaW5hcnlWMS5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9ncmFwaGJpbmFyeVYxLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjMyMGJjLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9ncmFwaGJpbmFyeVYxLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLSIiIgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSIiIgotCi1pbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBjYWxlbmRhcgotaW1wb3J0IHRpbWUKLWltcG9ydCB1dWlkCi1pbXBvcnQgbWF0aAotZnJvbSBkZWNpbWFsIGltcG9ydCAqCi0KLWZyb20gbW9jayBpbXBvcnQgTW9jawotCi1pbXBvcnQgc2l4Ci0KLWZyb20gZ3JlbWxpbl9weXRob24uc3RhdGljcyBpbXBvcnQgdGltZXN0YW1wLCBsb25nLCBTaW5nbGVCeXRlLCBTaW5nbGVDaGFyLCBCeXRlQnVmZmVyVHlwZQotZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFZlcnRleCwgRWRnZSwgUHJvcGVydHksIFZlcnRleFByb3BlcnR5LCBHcmFwaCwgUGF0aAotZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhiaW5hcnlWMSBpbXBvcnQgR3JhcGhCaW5hcnlXcml0ZXIsIEdyYXBoQmluYXJ5UmVhZGVyLCBEYXRhVHlwZQotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgUCwgQmFycmllciwgQmluZGluZywgQnl0ZWNvZGUKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5zdHJhdGVnaWVzIGltcG9ydCBTdWJncmFwaFN0cmF0ZWd5Ci1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBfXwotCi0KLWNsYXNzIFRlc3RHcmFwaEJpbmFyeVJlYWRlcihvYmplY3QpOgotICAgIGdyYXBoYmluYXJ5X3JlYWRlciA9IEdyYXBoQmluYXJ5UmVhZGVyKCkKLQotCi1jbGFzcyBUZXN0R3JhcGhTT05Xcml0ZXIob2JqZWN0KToKLSAgICBncmFwaGJpbmFyeV93cml0ZXIgPSBHcmFwaEJpbmFyeVdyaXRlcigpCi0gICAgZ3JhcGhiaW5hcnlfcmVhZGVyID0gR3JhcGhCaW5hcnlSZWFkZXIoKQotCi0gICAgZGVmIHRlc3RfaW50KHNlbGYpOgotICAgICAgICB4ID0gMTAwCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKLSAgICAgICAgeCA9IGxvbmcoMTAwKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgotICAgICAgICB4ID0gZmxvYXQoMTAwLjAwMSkKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0Ci0KLSAgICAgICAgeCA9IGZsb2F0KCduYW4nKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgbWF0aC5pc25hbihvdXRwdXQpCi0KLSAgICAgICAgeCA9IGZsb2F0KCctaW5mJykKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IG1hdGguaXNpbmYob3V0cHV0KSBhbmQgb3V0cHV0IDwgMAotCi0gICAgICAgIHggPSBmbG9hdCgnaW5mJykKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IG1hdGguaXNpbmYob3V0cHV0KSBhbmQgb3V0cHV0ID4gMAotCi0gICAgZGVmIHRlc3RfZG91YmxlKHNlbGYpOgotICAgICAgICB4ID0gMTAwLjAwMQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2RhdGUoc2VsZik6Ci0gICAgICAgIHggPSBkYXRldGltZS5kYXRldGltZSgyMDE2LCAxMiwgMTQsIDE2LCAxNCwgMzYsIDI5NTAwMCkKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0Ci0KLSAgICBkZWYgdGVzdF90aW1lc3RhbXAoc2VsZik6Ci0gICAgICAgIHggPSB0aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDApCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3Rfc3RyaW5nKHNlbGYpOgotICAgICAgICB4ID0gInNlcmlhbGl6ZSB0aGlzISIKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0Ci0KLSAgICBkZWYgdGVzdF9ob21vZ2VuZW91c19saXN0KHNlbGYpOgotICAgICAgICB4ID0gWyJzZXJpYWxpemUgdGhpcyEiLCAic2VyaWFsaXplIHRoYXQhIiwgInNlcmlhbGl6ZSB0aGF0ISIsInN0b3AgdGVsbGluZyBtZSB3aGF0IHRvIHNlcmlhbGl6ZSJdCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfaGV0ZXJvZ2VuZW91c19saXN0KHNlbGYpOgotICAgICAgICB4ID0gWyJzZXJpYWxpemUgdGhpcyEiLCAwLCAic2VyaWFsaXplIHRoYXQhIiwgInNlcmlhbGl6ZSB0aGF0ISIsIDEsICJzdG9wIHRlbGxpbmcgbWUgd2hhdCB0byBzZXJpYWxpemUiLCAyXQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2hvbW9nZW5lb3VzX3NldChzZWxmKToKLSAgICAgICAgeCA9IHsic2VyaWFsaXplIHRoaXMhIiwgInNlcmlhbGl6ZSB0aGF0ISIsICJzdG9wIHRlbGxpbmcgbWUgd2hhdCB0byBzZXJpYWxpemUifQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2hldGVyb2dlbmVvdXNfc2V0KHNlbGYpOgotICAgICAgICB4ID0geyJzZXJpYWxpemUgdGhpcyEiLCAwLCAic2VyaWFsaXplIHRoYXQhIiwgMSwgInN0b3AgdGVsbGluZyBtZSB3aGF0IHRvIHNlcmlhbGl6ZSIsIDJ9Ci0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfZGljdChzZWxmKToKLSAgICAgICAgeCA9IHsieW8iOiAid2hhdD8iLAotICAgICAgICAgICAgICJnbyI6ICJubyEiLAotICAgICAgICAgICAgICJudW1iZXIiOiAxMjMsCi0gICAgICAgICAgICAgMzIxOiAiY3Jhenkgd2l0aCB0aGUgbnVtYmVyIGZvciBhIGtleSIsCi0gICAgICAgICAgICAgOTg3OiBbImdvIiwgImRlZXAiLCB7ImhlcmUiOiAiISJ9XX0KLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0Ci0KLSAgICAgICAgeCA9IHsibWFya28iOiBbNjY2XSwgIm5vb25lIjogWyJibGFoIl19Ci0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgICAgIHggPSB7InJpcHBsZSI6IFtdLCAicGV0ZXIiOiBbImNyZWF0ZWQiXSwgIm5vb25lIjogWyJibGFoIl0sICJ2YWRhcyI6IFtdLAotICAgICAgICAgICAgICJqb3NoIjogWyJjcmVhdGVkIiwgImNyZWF0ZWQiXSwgImxvcCI6IFtdLCAibWFya28iOiBbNjY2LCAiY3JlYXRlZCIsICJrbm93cyIsICJrbm93cyJdfQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X3V1aWQoc2VsZik6Ci0gICAgICAgIHggPSB1dWlkLlVVSUQoIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiIpCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfZWRnZShzZWxmKToKLSAgICAgICAgeCA9IEVkZ2UoMTIzLCBWZXJ0ZXgoMSwgJ3BlcnNvbicpLCAiZGV2ZWxvcGVkIiwgVmVydGV4KDEwLCAic29mdHdhcmUiKSkKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0Ci0gICAgICAgIGFzc2VydCB4LmluViA9PSBvdXRwdXQuaW5WCi0gICAgICAgIGFzc2VydCB4Lm91dFYgPT0gb3V0cHV0Lm91dFYKLQotICAgIGRlZiB0ZXN0X3BhdGgoc2VsZik6Ci0gICAgICAgIHggPSBQYXRoKFsieCIsICJ5IiwgInoiXSwgWzEsIDIsIDNdKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X3Byb3BlcnR5KHNlbGYpOgotICAgICAgICB4ID0gUHJvcGVydHkoIm5hbWUiLCAic3RlcGhlbiIsIE5vbmUpCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfdmVydGV4KHNlbGYpOgotICAgICAgICB4ID0gVmVydGV4KDEyMywgInBlcnNvbiIpCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfdmVydGV4cHJvcGVydHkoc2VsZik6Ci0gICAgICAgIHggPSBWZXJ0ZXhQcm9wZXJ0eSgxMjMsICJuYW1lIiwgInN0ZXBoZW4iLCBOb25lKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLSAgICAgICAgCi0gICAgZGVmIHRlc3RfYmFycmllcihzZWxmKToKLSAgICAgICAgeCA9IEJhcnJpZXIubm9ybVNhY2sKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKLSAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0Ci0KLSAgICBkZWYgdGVzdF9iaW5kaW5nKHNlbGYpOgotICAgICAgICB4ID0gQmluZGluZygibmFtZSIsICJtYXJrbyIpCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfYnl0ZWNvZGUoc2VsZik6Ci0gICAgICAgIHggPSBCeXRlY29kZSgpCi0gICAgICAgIHguc291cmNlX2luc3RydWN0aW9ucy5hcHBlbmQoWyJ3aXRoU3RyYXRlZ2llcyIsICJTdWJncmFwaFN0cmF0ZWd5Il0pCi0gICAgICAgIHguc3RlcF9pbnN0cnVjdGlvbnMuYXBwZW5kKFsiViIsIDEsIDIsIDNdKQotICAgICAgICB4LnN0ZXBfaW5zdHJ1Y3Rpb25zLmFwcGVuZChbIm91dCJdKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2J5dGUoc2VsZik6Ci0gICAgICAgIHggPSBpbnQuX19uZXdfXyhTaW5nbGVCeXRlLCAxKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2J5dGVidWZmZXIoc2VsZik6Ci0gICAgICAgIHggPSBCeXRlQnVmZmVyVHlwZSgiYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxIiwgInV0ZjgiKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2Jvb2xlYW4oc2VsZik6Ci0gICAgICAgIHggPSBUcnVlCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCi0gICAgICAgIGFzc2VydCB4ID09IG91dHB1dAotCi0gICAgICAgIHggPSBGYWxzZQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6Ci0gICAgICAgIHggPSBzdHIuX19uZXdfXyhTaW5nbGVDaGFyLCBjaHIoNzYpKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLQotICAgICAgICBpZiBzaXguUFkzOgotICAgICAgICAgICAgeCA9IHN0ci5fX25ld19fKFNpbmdsZUNoYXIsIGNocig1NzM0NCkpCi0gICAgICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0Ci0KLSAgICBkZWYgdGVzdF9kdXJhdGlvbihzZWxmKToKLSAgICAgICAgeCA9IGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTEwMDAsIG1pY3Jvc2Vjb25kcz0xMDAwKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQotICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKLSAgICAgICAgCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZ3JhcGhzb25WMmQwLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9pby90ZXN0X2dyYXBoc29uVjJkMC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2ZDU3Yy4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZ3JhcGhzb25WMmQwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJwotCi1pbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBjYWxlbmRhcgotaW1wb3J0IGpzb24KLWltcG9ydCB1dWlkCi1pbXBvcnQgbWF0aAotZnJvbSBkZWNpbWFsIGltcG9ydCAqCi0KLWZyb20gbW9jayBpbXBvcnQgTW9jawotCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0YXRpY3MgaW1wb3J0ICoKLWZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBWZXJ0ZXgsIEVkZ2UsIFByb3BlcnR5LCBWZXJ0ZXhQcm9wZXJ0eSwgR3JhcGgsIFBhdGgKLWZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjJkMCBpbXBvcnQgR3JhcGhTT05Xcml0ZXIsIEdyYXBoU09OUmVhZGVyLCBHcmFwaFNPTlV0aWwKLWltcG9ydCBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WMmQwCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBQCi1mcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3Muc3RyYXRlZ2llcyBpbXBvcnQgU3ViZ3JhcGhTdHJhdGVneQotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmdyYXBoX3RyYXZlcnNhbCBpbXBvcnQgX18KLQotCi1jbGFzcyBUZXN0R3JhcGhTT05SZWFkZXIob2JqZWN0KToKLSAgICBncmFwaHNvbl9yZWFkZXIgPSBHcmFwaFNPTlJlYWRlcigpCi0KLSAgICBkZWYgdGVzdF9udW1iZXJfaW5wdXQoc2VsZik6Ci0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImd4OkJ5dGUiLAotICAgICAgICAgICAgIkB2YWx1ZSI6IDEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIFNpbmdsZUJ5dGUpCi0gICAgICAgIGFzc2VydCAxID09IHgKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZzpJbnQzMiIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMzEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGludCkKLSAgICAgICAgYXNzZXJ0IDMxID09IHgKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZzpJbnQ2NCIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMzEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGxvbmcpCi0gICAgICAgIGFzc2VydCBsb25nKDMxKSA9PSB4Ci0gICAgICAgICMjCi0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImc6RmxvYXQiLAotICAgICAgICAgICAgIkB2YWx1ZSI6IDMxLjMKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQotICAgICAgICBhc3NlcnQgMzEuMyA9PSB4Ci0gICAgICAgICMjCi0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAzMS4yCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBmbG9hdCkKLSAgICAgICAgYXNzZXJ0IDMxLjIgPT0geAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJnOkRvdWJsZSIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIk5hTiIKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQotICAgICAgICBhc3NlcnQgbWF0aC5pc25hbih4KQotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJnOkRvdWJsZSIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIkluZmluaXR5IgotICAgICAgICB9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCi0gICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4ID4gMAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJnOkRvdWJsZSIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIi1JbmZpbml0eSIKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQotICAgICAgICBhc3NlcnQgbWF0aC5pc2luZih4KSBhbmQgeCA8IDAKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMzEuMgotICAgICAgICB9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgRGVjaW1hbCkKLSAgICAgICAgYXNzZXJ0IERlY2ltYWwoMzEuMikgPT0geAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCi0gICAgICAgIGFzc2VydCBEZWNpbWFsKCcxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEnKSA9PSB4Ci0gICAgICAgICMjCi0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLAotICAgICAgICAgICAgIkB2YWx1ZSI6ICJOYU4iCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBEZWNpbWFsKQotICAgICAgICBhc3NlcnQgbWF0aC5pc25hbih4KQotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAiSW5maW5pdHkiCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBEZWNpbWFsKQotICAgICAgICBhc3NlcnQgbWF0aC5pc2luZih4KSBhbmQgeCA+IDAKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIi1JbmZpbml0eSIKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCi0gICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4IDwgMAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdJbnRlZ2VyIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAzMQotICAgICAgICB9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgbG9uZykKLSAgICAgICAgYXNzZXJ0IDMxID09IHgKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnSW50ZWdlciIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBsb25nKQotICAgICAgICBhc3NlcnQgMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxID09IHgKLQotICAgIGRlZiB0ZXN0X2dyYXBoKHNlbGYpOgotICAgICAgICB2ZXJ0ZXggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgotICAgICAgICB7IkB0eXBlIjoiZzpWZXJ0ZXgiLCAiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6MX0sImxhYmVsIjoicGVyc29uIiwib3V0RSI6eyJjcmVhdGVkIjpbeyJpZCI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjl9LCJpblYiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjozfSwicHJvcGVydGllcyI6eyJ3ZWlnaHQiOnsiQHR5cGUiOiJnOkRvdWJsZSIsIkB2YWx1ZSI6MC40fX19XSwia25vd3MiOlt7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6N30sImluViI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjJ9LCJwcm9wZXJ0aWVzIjp7IndlaWdodCI6eyJAdHlwZSI6Imc6RG91YmxlIiwiQHZhbHVlIjowLjV9fX0seyJpZCI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjh9LCJpblYiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjo0fSwicHJvcGVydGllcyI6eyJ3ZWlnaHQiOnsiQHR5cGUiOiJnOkRvdWJsZSIsIkB2YWx1ZSI6MS4wfX19XX0sInByb3BlcnRpZXMiOnsibmFtZSI6W3siaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjowfSwidmFsdWUiOiJtYXJrbyJ9XSwiYWdlIjpbeyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjF9LCJ2YWx1ZSI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjI5fX1dfX19IiIiKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXgsIFZlcnRleCkKLSAgICAgICAgYXNzZXJ0ICJwZXJzb24iID09IHZlcnRleC5sYWJlbAotICAgICAgICBhc3NlcnQgMSA9PSB2ZXJ0ZXguaWQKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4LmlkLCBpbnQpCi0gICAgICAgIGFzc2VydCB2ZXJ0ZXggPT0gVmVydGV4KDEpCi0gICAgICAgICMjCi0gICAgICAgIHZlcnRleCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoIiIiCi0gICAgICAgIHsiQHR5cGUiOiJnOlZlcnRleCIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkZsb2F0IiwiQHZhbHVlIjo0NS4yM319fSIiIikKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4LCBWZXJ0ZXgpCi0gICAgICAgIGFzc2VydCA0NS4yMyA9PSB2ZXJ0ZXguaWQKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4LmlkLCBGbG9hdFR5cGUpCi0gICAgICAgIGFzc2VydCAidmVydGV4IiA9PSB2ZXJ0ZXgubGFiZWwKLSAgICAgICAgYXNzZXJ0IHZlcnRleCA9PSBWZXJ0ZXgoNDUuMjMpCi0gICAgICAgICMjCi0gICAgICAgIHZlcnRleF9wcm9wZXJ0eSA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoIiIiCi0gICAgICAgIHsiQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwgIkB2YWx1ZSI6eyJpZCI6ImFuSWQiLCJsYWJlbCI6ImFLZXkiLCJ2YWx1ZSI6dHJ1ZSwidmVydGV4Ijp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6OX19fSIiIikKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4X3Byb3BlcnR5LCBWZXJ0ZXhQcm9wZXJ0eSkKLSAgICAgICAgYXNzZXJ0ICJhbklkIiA9PSB2ZXJ0ZXhfcHJvcGVydHkuaWQKLSAgICAgICAgYXNzZXJ0ICJhS2V5IiA9PSB2ZXJ0ZXhfcHJvcGVydHkubGFiZWwKLSAgICAgICAgYXNzZXJ0IHZlcnRleF9wcm9wZXJ0eS52YWx1ZQotICAgICAgICBhc3NlcnQgdmVydGV4X3Byb3BlcnR5LnZlcnRleCA9PSBWZXJ0ZXgoOSkKLSAgICAgICAgIyMKLSAgICAgICAgdmVydGV4X3Byb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKLSAgICAgICAgeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCAiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6MX0sImxhYmVsIjoibmFtZSIsInZhbHVlIjoibWFya28ifX0iIiIpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZlcnRleF9wcm9wZXJ0eSwgVmVydGV4UHJvcGVydHkpCi0gICAgICAgIGFzc2VydCAxID09IHZlcnRleF9wcm9wZXJ0eS5pZAotICAgICAgICBhc3NlcnQgIm5hbWUiID09IHZlcnRleF9wcm9wZXJ0eS5sYWJlbAotICAgICAgICBhc3NlcnQgIm1hcmtvIiA9PSB2ZXJ0ZXhfcHJvcGVydHkudmFsdWUKLSAgICAgICAgYXNzZXJ0IHZlcnRleF9wcm9wZXJ0eS52ZXJ0ZXggaXMgTm9uZQotICAgICAgICAjIwotICAgICAgICBlZGdlID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKLSAgICAgICAgeyJAdHlwZSI6Imc6RWRnZSIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjoxN30sImxhYmVsIjoia25vd3MiLCJpblYiOiJ4Iiwib3V0ViI6InkiLCJpblZMYWJlbCI6InhMYWIiLCJwcm9wZXJ0aWVzIjp7ImFLZXkiOiJhVmFsdWUiLCJiS2V5Ijp0cnVlfX19IiIiKQotICAgICAgICAjIHByaW50IGVkZ2UKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZWRnZSwgRWRnZSkKLSAgICAgICAgYXNzZXJ0IDE3ID09IGVkZ2UuaWQKLSAgICAgICAgYXNzZXJ0ICJrbm93cyIgPT0gZWRnZS5sYWJlbAotICAgICAgICBhc3NlcnQgZWRnZS5pblYgPT0gVmVydGV4KCJ4IiwgInhMYWJlbCIpCi0gICAgICAgIGFzc2VydCBlZGdlLm91dFYgPT0gVmVydGV4KCJ5IiwgInZlcnRleCIpCi0gICAgICAgICMjCi0gICAgICAgIHByb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKLSAgICAgICAgeyJAdHlwZSI6Imc6UHJvcGVydHkiLCAiQHZhbHVlIjp7ImtleSI6ImFLZXkiLCJ2YWx1ZSI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjE3fSwiZWxlbWVudCI6eyJAdHlwZSI6Imc6RWRnZSIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjEyMn0sImxhYmVsIjoia25vd3MiLCJpblYiOiJ4Iiwib3V0ViI6InkiLCJpblZMYWJlbCI6InhMYWIifX19fSIiIikKLSAgICAgICAgIyBwcmludCBwcm9wZXJ0eQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwcm9wZXJ0eSwgUHJvcGVydHkpCi0gICAgICAgIGFzc2VydCAiYUtleSIgPT0gcHJvcGVydHkua2V5Ci0gICAgICAgIGFzc2VydCAxNyA9PSBwcm9wZXJ0eS52YWx1ZQotICAgICAgICBhc3NlcnQgRWRnZSgxMjIsIFZlcnRleCgieCIpLCAia25vd3MiLCBWZXJ0ZXgoInkiKSkgPT0gcHJvcGVydHkuZWxlbWVudAotCi0gICAgZGVmIHRlc3RfcGF0aChzZWxmKToKLSAgICAgICAgcGF0aCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCi0gICAgICAgICAgICAiIiJ7IkB0eXBlIjoiZzpQYXRoIiwiQHZhbHVlIjp7ImxhYmVscyI6W1siYSJdLFsiYiIsImMiXSxbXV0sIm9iamVjdHMiOlt7IkB0eXBlIjoiZzpWZXJ0ZXgiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoxfSwibGFiZWwiOiJwZXJzb24iLCJwcm9wZXJ0aWVzIjp7Im5hbWUiOlt7IkB0eXBlIjoiZzpWZXJ0ZXhQcm9wZXJ0eSIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjB9LCJ2YWx1ZSI6Im1hcmtvIiwibGFiZWwiOiJuYW1lIn19XSwiYWdlIjpbeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjoxfSwidmFsdWUiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoyOX0sImxhYmVsIjoiYWdlIn19XX19fSx7IkB0eXBlIjoiZzpWZXJ0ZXgiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjozfSwibGFiZWwiOiJzb2Z0d2FyZSIsInByb3BlcnRpZXMiOnsibmFtZSI6W3siQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6NH0sInZhbHVlIjoibG9wIiwibGFiZWwiOiJuYW1lIn19XSwibGFuZyI6W3siQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6NX0sInZhbHVlIjoiamF2YSIsImxhYmVsIjoibGFuZyJ9fV19fX0sImxvcCJdfX0iIiIKLSAgICAgICAgKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwYXRoLCBQYXRoKQotICAgICAgICBhc3NlcnQgInBhdGhbdlsxXSwgdlszXSwgbG9wXSIgPT0gc3RyKHBhdGgpCi0gICAgICAgIGFzc2VydCBWZXJ0ZXgoMSkgPT0gcGF0aFswXQotICAgICAgICBhc3NlcnQgVmVydGV4KDEpID09IHBhdGhbImEiXQotICAgICAgICBhc3NlcnQgImxvcCIgPT0gcGF0aFsyXQotICAgICAgICBhc3NlcnQgMyA9PSBsZW4ocGF0aCkKLQotICAgIGRlZiB0ZXN0X2N1c3RvbV9tYXBwaW5nKHNlbGYpOgotCi0gICAgICAgICMgZXh0ZW5kZWQgbWFwcGluZwotICAgICAgICBjbGFzcyBYKG9iamVjdCk6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgdHlwZV9zdHJpbmcgPSAidGVzdDpYdHlwZSIKLSAgICAgICAgb3ZlcnJpZGVfc3RyaW5nID0gImc6SW50NjQiCi0gICAgICAgIHNlcmRlcyA9IE1vY2soKQotCi0gICAgICAgIHJlYWRlciA9IEdyYXBoU09OUmVhZGVyKGRlc2VyaWFsaXplcl9tYXA9e3R5cGVfc3RyaW5nOiBzZXJkZXN9KQotICAgICAgICBhc3NlcnQgdHlwZV9zdHJpbmcgaW4gcmVhZGVyLmRlc2VyaWFsaXplcnMKLQotICAgICAgICAjIGJhc2UgZGljdHMgYXJlIG5vdCBtb2RpZmllZAotICAgICAgICBhc3NlcnQgdHlwZV9zdHJpbmcgbm90IGluIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYyZDAuX2Rlc2VyaWFsaXplcnMKLQotICAgICAgICB4ID0gWCgpCi0gICAgICAgIG8gPSByZWFkZXIudG9PYmplY3Qoe0dyYXBoU09OVXRpbC5UWVBFX0tFWTogdHlwZV9zdHJpbmcsIEdyYXBoU09OVXRpbC5WQUxVRV9LRVk6IHh9KQotICAgICAgICBzZXJkZXMub2JqZWN0aWZ5LmFzc2VydF9jYWxsZWRfb25jZV93aXRoKHgsIHJlYWRlcikKLSAgICAgICAgYXNzZXJ0IG8gaXMgc2VyZGVzLm9iamVjdGlmeSgpCi0KLSAgICAgICAgIyBvdmVycmlkZGVuIG1hcHBpbmcKLSAgICAgICAgdHlwZV9zdHJpbmcgPSAiZzpJbnQ2NCIKLSAgICAgICAgc2VyZGVzID0gTW9jaygpCi0gICAgICAgIHJlYWRlciA9IEdyYXBoU09OUmVhZGVyKGRlc2VyaWFsaXplcl9tYXA9e3R5cGVfc3RyaW5nOiBzZXJkZXMsIG92ZXJyaWRlX3N0cmluZzogc2VyZGVzfSkKLSAgICAgICAgYXNzZXJ0IGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYyZDAuX2Rlc2VyaWFsaXplcnNbdHlwZV9zdHJpbmddIGlzIG5vdCByZWFkZXIuZGVzZXJpYWxpemVyc1t0eXBlX3N0cmluZ10KLQotICAgICAgICB2YWx1ZSA9IDMKLSAgICAgICAgbyA9IHJlYWRlci50b09iamVjdCh7R3JhcGhTT05VdGlsLlRZUEVfS0VZOiB0eXBlX3N0cmluZywgR3JhcGhTT05VdGlsLlZBTFVFX0tFWTogdmFsdWV9KQotICAgICAgICBzZXJkZXMub2JqZWN0aWZ5LmFzc2VydF9jYWxsZWRfb25jZV93aXRoKHZhbHVlLCByZWFkZXIpCi0gICAgICAgIGFzc2VydCBvIGlzIHNlcmRlcy5vYmplY3RpZnkoKQotCi0gICAgZGVmIHRlc3RfZGF0ZXRpbWUoc2VsZik6Ci0gICAgICAgIGV4cGVjdGVkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxNiwgMTIsIDE0LCAxNiwgMTQsIDM2LCAyOTUwMDApCi0gICAgICAgIHB0cyA9IGNhbGVuZGFyLnRpbWVnbShleHBlY3RlZC51dGN0aW1ldHVwbGUoKSkgKyBleHBlY3RlZC5taWNyb3NlY29uZCAvIDFlNgotICAgICAgICB0cyA9IGludChyb3VuZChwdHMgKiAxMDAwKSkKLSAgICAgICAgZHQgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOkRhdGUiLCAiQHZhbHVlIjogdHN9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZHQsIGRhdGV0aW1lLmRhdGV0aW1lKQotICAgICAgICAjIFRJTktFUlBPUC0xODQ4Ci0gICAgICAgIGFzc2VydCBkdCA9PSBleHBlY3RlZAotCi0gICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYpOgotICAgICAgICBkdCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7IkB0eXBlIjogImc6VGltZXN0YW1wIiwgIkB2YWx1ZSI6IDE0ODE3NTAwNzYyOTV9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZHQsIHRpbWVzdGFtcCkKLSAgICAgICAgYXNzZXJ0IGZsb2F0KGR0KSA9PSAxNDgxNzUwMDc2LjI5NQotCi0gICAgZGVmIHRlc3RfZHVyYXRpb24oc2VsZik6Ci0gICAgICAgIGQgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeyJAdHlwZSI6ICJneDpEdXJhdGlvbiIsICJAdmFsdWUiOiAiUFQxMjBIIn0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkLCBkYXRldGltZS50aW1lZGVsdGEpCi0gICAgICAgIGFzc2VydCBkID09IGRhdGV0aW1lLnRpbWVkZWx0YShob3Vycz0xMjApCi0KLSAgICBkZWYgdGVzdF91dWlkKHNlbGYpOgotICAgICAgICBwcm9wID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKLSAgICAgICAgICAgIGpzb24uZHVtcHMoeydAdHlwZSc6ICdnOlVVSUQnLCAnQHZhbHVlJzogIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiJ9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocHJvcCwgdXVpZC5VVUlEKQotICAgICAgICBhc3NlcnQgc3RyKHByb3ApID09ICc0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYnCi0KLSAgICBkZWYgdGVzdF9tZXRyaWNzKHNlbGYpOgotICAgICAgICBwcm9wID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKLSAgICAgICAgICAgIGpzb24uZHVtcHMoW3snQHR5cGUnOiAnZzpUcmF2ZXJzYWxNZXRyaWNzJywgJ0B2YWx1ZSc6IHsnZHVyJzogMS40Njg1OTQsICdtZXRyaWNzJzogWwotICAgICAgICAgICAgICAgIHsnQHR5cGUnOiAnZzpNZXRyaWNzJywgJ0B2YWx1ZSc6IHsnZHVyJzogMS4zODA5NTcsICdjb3VudHMnOiB7fSwgJ25hbWUnOiAnR3JhcGhTdGVwKF9fLlYoKSknLCAnYW5ub3RhdGlvbnMnOiB7J3BlcmNlbnREdXInOiA5NC4wMzI1OTE3MTY5NzU1Nn0sICdpZCc6ICc0LjAuMCgpJ319LAotICAgICAgICAgICAgICAgIHsnQHR5cGUnOiAnZzpNZXRyaWNzJywgJ0B2YWx1ZSc6IHsnZHVyJzogMC4wODc2MzcsICdjb3VudHMnOiB7fSwgJ25hbWUnOiAnUmVmZXJlbmNlRWxlbWVudFN0ZXAnLCAnYW5ub3RhdGlvbnMnOiB7J3BlcmNlbnREdXInOiA1Ljk2NzQwODI4MzAyNDQ0NH0sICdpZCc6ICczLjAuMCgpJ319Ci0gICAgICAgICAgICBdfX1dKSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocHJvcCwgbGlzdCkKLSAgICAgICAgYXNzZXJ0IHByb3AgPT0gW3snZHVyJzogMS40Njg1OTQsICdtZXRyaWNzJzogWwotICAgICAgICAgICAgICAgIHsnZHVyJzogMS4zODA5NTcsICdjb3VudHMnOiB7fSwgJ25hbWUnOiAnR3JhcGhTdGVwKF9fLlYoKSknLCAnYW5ub3RhdGlvbnMnOiB7J3BlcmNlbnREdXInOiA5NC4wMzI1OTE3MTY5NzU1Nn0sICdpZCc6ICc0LjAuMCgpJ30sCi0gICAgICAgICAgICAgICAgeydkdXInOiAwLjA4NzYzNywgJ2NvdW50cyc6IHt9LCAnbmFtZSc6ICdSZWZlcmVuY2VFbGVtZW50U3RlcCcsICdhbm5vdGF0aW9ucyc6IHsncGVyY2VudER1cic6IDUuOTY3NDA4MjgzMDI0NDQ0fSwgJ2lkJzogJzMuMC4wKCknfQotICAgICAgICAgICAgICAgIF19XQotCi0gICAgZGVmIHRlc3RfYnl0ZWJ1ZmZlcihzZWxmKToKLSAgICAgICAgYmIgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAotICAgICAgICAgICAganNvbi5kdW1wcyh7IkB0eXBlIjogImd4OkJ5dGVCdWZmZXIiLCAiQHZhbHVlIjogImMyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSJ9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYmIsIEJ5dGVCdWZmZXJUeXBlKQotICAgICAgICBhc3NlcnQgQnl0ZUJ1ZmZlclR5cGUoImMyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSIsICJ1dGY4IikgPT0gYmIKLQotICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6Ci0gICAgICAgIGMgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeyJAdHlwZSI6ICJneDpDaGFyIiwgIkB2YWx1ZSI6ICJMIn0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjLCBTaW5nbGVDaGFyKQotICAgICAgICBhc3NlcnQgY2hyKDc2KSA9PSBjCi0KLQotY2xhc3MgVGVzdEdyYXBoU09OV3JpdGVyKG9iamVjdCk6Ci0gICAgZ3JhcGhzb25fd3JpdGVyID0gR3JhcGhTT05Xcml0ZXIoKQotICAgIGdyYXBoc29uX3JlYWRlciA9IEdyYXBoU09OUmVhZGVyKCkKLQotICAgIGRlZiB0ZXN0X251bWJlcnMoc2VsZik6Ci0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJ5dGUiLCAiQHZhbHVlIjogMX0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChpbnQuX19uZXdfXyhTaW5nbGVCeXRlLCAxKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChsb25nKDIpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiA4NTE0MDE5NzI1ODUxMjJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobG9uZyg4NTE0MDE5NzI1ODUxMjIpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAtMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChsb25nKC0yKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogLTg1MTQwMTk3MjU4NTEyMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChsb25nKC04NTE0MDE5NzI1ODUxMjIpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KDEpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IC0xfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KC0xKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiA4NTE0MDE5NzI1ODUxMjJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoODUxNDAxOTcyNTg1MTIyKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpEb3VibGUiLCAiQHZhbHVlIjogMy4yfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KDMuMikpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6RG91YmxlIiwgIkB2YWx1ZSI6ICJOYU4ifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGZsb2F0KCduYW4nKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6RG91YmxlIiwgIkB2YWx1ZSI6ICJJbmZpbml0eSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoZmxvYXQoJ2luZicpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpEb3VibGUiLCAiQHZhbHVlIjogIi1JbmZpbml0eSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoZmxvYXQoJy1pbmYnKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLCAiQHZhbHVlIjogIjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRGVjaW1hbCgnMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxJykpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwgIkB2YWx1ZSI6ICJOYU4ifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KERlY2ltYWwoJ25hbicpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsICJAdmFsdWUiOiAiSW5maW5pdHkifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KERlY2ltYWwoJ2luZicpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsICJAdmFsdWUiOiAiLUluZmluaXR5In0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChEZWNpbWFsKCctaW5mJykpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdJbnRlZ2VyIiwgIkB2YWx1ZSI6ICIxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0ludGVnZXIiLCAiQHZhbHVlIjogIjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxKSkKLSAgICAgICAgYXNzZXJ0ICIiInRydWUiIiIgPT0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVHJ1ZSkKLQotICAgIGRlZiB0ZXN0X1Aoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IHsnQHR5cGUnOiAnZzpQJywKLSAgICAgICAgICAgICAgICAgICdAdmFsdWUnOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgJ3ByZWRpY2F0ZSc6ICdhbmQnLAotICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IFt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICdAdHlwZSc6ICdnOlAnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnQHZhbHVlJzogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWRpY2F0ZSc6ICdvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBbewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAdHlwZSc6ICdnOlAnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6ICdsdCcsICd2YWx1ZSc6ICdiJ30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydAdHlwZSc6ICdnOlAnLCAnQHZhbHVlJzogeydwcmVkaWNhdGUnOiAnZ3QnLCAndmFsdWUnOiAnYyd9fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeydAdHlwZSc6ICdnOlAnLCAnQHZhbHVlJzogeydwcmVkaWNhdGUnOiAnbmVxJywgJ3ZhbHVlJzogJ2QnfX1dfX0KLQotICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGpzb24ubG9hZHMoCi0gICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQLmx0KCJiIikub3JfKFAuZ3QoImMiKSkuYW5kXyhQLm5lcSgiZCIpKSkpCi0KLSAgICAgICAgcmVzdWx0ID0geydAdHlwZSc6ICdnOlAnLCAnQHZhbHVlJzogeydwcmVkaWNhdGUnOid3aXRoaW4nLCd2YWx1ZSc6IFt7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0seyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDJ9XX19Ci0gICAgICAgIGFzc2VydCByZXN1bHQgPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQLndpdGhpbihbMSwgMl0pKSkKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAud2l0aGluKDEsIDIpKSkKLQotICAgICAgICByZXN1bHQgPSB7J0B0eXBlJzogJ2c6UCcsICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6J3dpdGhpbicsJ3ZhbHVlJzogW3siQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfV19fQotICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC53aXRoaW4oWzFdKSkpCi0gICAgICAgIGFzc2VydCByZXN1bHQgPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQLndpdGhpbigxKSkpCi0KLSAgICBkZWYgdGVzdF9zdHJhdGVnaWVzKHNlbGYpOgotICAgICAgICAjIHdlIGhhdmUgYSBwcm94eSBtb2RlbCBmb3Igbm93IGdpdmVuIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvIGhhdmUgZzpYWFggYWxsIHJlZ2lzdGVyZWQgb24gdGhlIEdyZW1saW4gdHJhdmVyc2FsIG1hY2hpbmUgKHlldCkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpTdWJncmFwaFN0cmF0ZWd5IiwgIkB2YWx1ZSI6IHt9fSA9PSBqc29uLmxvYWRzKAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoU3ViZ3JhcGhTdHJhdGVneSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6U3ViZ3JhcGhTdHJhdGVneSIsICJAdmFsdWUiOiB7Ci0gICAgICAgICAgICAidmVydGljZXMiOiB7IkB0eXBlIjogImc6Qnl0ZWNvZGUiLCAiQHZhbHVlIjogeyJzdGVwIjogW1siaGFzIiwgIm5hbWUiLCAibWFya28iXV19fX19ID09IGpzb24ubG9hZHMoCi0gICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChTdWJncmFwaFN0cmF0ZWd5KHZlcnRpY2VzPV9fLmhhcygibmFtZSIsICJtYXJrbyIpKSkpCi0KLSAgICBkZWYgdGVzdF9ncmFwaChzZWxmKToKLSAgICAgICAgIyBUT0RPOiB0aGlzIGFzc2VydCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHB5dGhvbiAzIGFuZCBub3cgdGhhdCB3ZSB0ZXN0IHdpdGggYm90aCAyIGFuZCAzIGl0IGZhaWxzCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6VmVydGV4IiwgIkB2YWx1ZSI6IHsiaWQiOiB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogMTJ9LCAibGFiZWwiOiAicGVyc29uIn19ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVmVydGV4KGxvbmcoMTIpLCAicGVyc29uIikpKQotCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6RWRnZSIsICJAdmFsdWUiOiB7ImlkIjogeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRWIjogeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRWTGFiZWwiOiAicGVyc29uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAia25vd3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpblYiOiB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluVkxhYmVsIjogImRvZyJ9fSA9PSBqc29uLmxvYWRzKAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRWRnZSg3LCBWZXJ0ZXgoMCwgInBlcnNvbiIpLCAia25vd3MiLCBWZXJ0ZXgoMSwgImRvZyIpKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6VmVydGV4UHJvcGVydHkiLCAiQHZhbHVlIjogeyJpZCI6ICJibGFoIiwgImxhYmVsIjogImtleUEiLCAidmFsdWUiOiBUcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydGV4IjogInN0ZXBoZW4ifX0gPT0ganNvbi5sb2FkcygKLSAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFZlcnRleFByb3BlcnR5KCJibGFoIiwgImtleUEiLCBUcnVlLCBWZXJ0ZXgoInN0ZXBoZW4iKSkpKQotCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6UHJvcGVydHkiLAotICAgICAgICAgICAgICAgICJAdmFsdWUiOiB7ImtleSI6ICJuYW1lIiwgInZhbHVlIjogIm1hcmtvIiwgImVsZW1lbnQiOiB7IkB0eXBlIjogImc6VmVydGV4UHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkB2YWx1ZSI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydGV4IjogInZlcnRleElkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMTIzNH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogImFLZXkifX19fSA9PSBqc29uLmxvYWRzKAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoCi0gICAgICAgICAgICAgICAgUHJvcGVydHkoIm5hbWUiLCAibWFya28iLCBWZXJ0ZXhQcm9wZXJ0eSgxMjM0LCAiYUtleSIsIDIxMzQ1LCBWZXJ0ZXgoInZlcnRleElkIikpKSkpCi0KLSAgICAgICAgdmVydGV4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChWZXJ0ZXgoMSwgInBlcnNvbiIpKSkKLSAgICAgICAgYXNzZXJ0IDEgPT0gdmVydGV4LmlkCi0gICAgICAgIGFzc2VydCAicGVyc29uIiA9PSB2ZXJ0ZXgubGFiZWwKLQotICAgICAgICBlZGdlID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKLSAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KEVkZ2UoMywgVmVydGV4KDEsICJwZXJzb24iKSwgImtub3dzIiwgVmVydGV4KDIsICJkb2ciKSkpKQotICAgICAgICBhc3NlcnQgImtub3dzIiA9PSBlZGdlLmxhYmVsCi0gICAgICAgIGFzc2VydCAzID09IGVkZ2UuaWQKLSAgICAgICAgYXNzZXJ0IDEgPT0gZWRnZS5vdXRWLmlkCi0gICAgICAgIGFzc2VydCAyID09IGVkZ2UuaW5WLmlkCi0KLSAgICAgICAgdmVydGV4X3Byb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKLSAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFZlcnRleFByb3BlcnR5KDEsICJhZ2UiLCAzMiwgVmVydGV4KDEpKSkpCi0gICAgICAgIGFzc2VydCAxID09IHZlcnRleF9wcm9wZXJ0eS5pZAotICAgICAgICBhc3NlcnQgImFnZSIgPT0gdmVydGV4X3Byb3BlcnR5LmtleQotICAgICAgICBhc3NlcnQgMzIgPT0gdmVydGV4X3Byb3BlcnR5LnZhbHVlCi0KLSAgICAgICAgcHJvcGVydHkgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFByb3BlcnR5KCJhZ2UiLCAzMi4yLCBFZGdlKDEsVmVydGV4KDIpLCJrbm93cyIsVmVydGV4KDMpKSkpKQotICAgICAgICBhc3NlcnQgImFnZSIgPT0gcHJvcGVydHkua2V5Ci0gICAgICAgIGFzc2VydCAzMi4yID09IHByb3BlcnR5LnZhbHVlCi0KLSAgICBkZWYgdGVzdF9jdXN0b21fbWFwcGluZyhzZWxmKToKLSAgICAgICAgIyBleHRlbmRlZCBtYXBwaW5nCi0gICAgICAgIGNsYXNzIFgob2JqZWN0KToKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICBzZXJkZXMgPSBNb2NrKCkKLSAgICAgICAgd3JpdGVyID0gR3JhcGhTT05Xcml0ZXIoc2VyaWFsaXplcl9tYXA9e1g6IHNlcmRlc30pCi0gICAgICAgIGFzc2VydCBYIGluIHdyaXRlci5zZXJpYWxpemVycwotCi0gICAgICAgICMgYmFzZSBkaWN0cyBhcmUgbm90IG1vZGlmaWVkCi0gICAgICAgIGFzc2VydCBYIG5vdCBpbiBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WMmQwLl9zZXJpYWxpemVycwotCi0gICAgICAgIG9iaiA9IFgoKQotICAgICAgICBkID0gd3JpdGVyLnRvRGljdChvYmopCi0gICAgICAgIHNlcmRlcy5kaWN0aWZ5LmFzc2VydF9jYWxsZWRfb25jZV93aXRoKG9iaiwgd3JpdGVyKQotICAgICAgICBhc3NlcnQgZCBpcyBzZXJkZXMuZGljdGlmeSgpCi0KLSAgICAgICAgIyBvdmVycmlkZGVuIG1hcHBpbmcKLSAgICAgICAgc2VyZGVzID0gTW9jaygpCi0gICAgICAgIHdyaXRlciA9IEdyYXBoU09OV3JpdGVyKHNlcmlhbGl6ZXJfbWFwPXtpbnQ6IHNlcmRlc30pCi0gICAgICAgIGFzc2VydCBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WMmQwLl9zZXJpYWxpemVyc1tpbnRdIGlzIG5vdCB3cml0ZXIuc2VyaWFsaXplcnNbaW50XQotCi0gICAgICAgIHZhbHVlID0gMwotICAgICAgICBkID0gd3JpdGVyLnRvRGljdCh2YWx1ZSkKLSAgICAgICAgc2VyZGVzLmRpY3RpZnkuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgodmFsdWUsIHdyaXRlcikKLSAgICAgICAgYXNzZXJ0IGQgaXMgc2VyZGVzLmRpY3RpZnkoKQotCi0gICAgZGVmIHRlc3Rfd3JpdGVfbG9uZyhzZWxmKToKLSAgICAgICAgbWFwcGluZyA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLnRvRGljdCgxKQotICAgICAgICBhc3NlcnQgbWFwcGluZ1snQHR5cGUnXSA9PSAnZzpJbnQzMicKLSAgICAgICAgYXNzZXJ0IG1hcHBpbmdbJ0B2YWx1ZSddID09IDEKLQotICAgICAgICBtYXBwaW5nID0gc2VsZi5ncmFwaHNvbl93cml0ZXIudG9EaWN0KGxvbmcoMSkpCi0gICAgICAgIGFzc2VydCBtYXBwaW5nWydAdHlwZSddID09ICdnOkludDY0JwotICAgICAgICBhc3NlcnQgbWFwcGluZ1snQHZhbHVlJ10gPT0gMQotCi0gICAgZGVmIHRlc3RfZGF0ZXRpbWUoc2VsZik6Ci0gICAgICAgIGV4cGVjdGVkID0ganNvbi5kdW1wcyh7IkB0eXBlIjogImc6RGF0ZSIsICJAdmFsdWUiOiAxNDgxNzUwMDc2Mjk1fSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQotICAgICAgICBkdCA9IGRhdGV0aW1lLmRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDAuMCkKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoZHQpCi0gICAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X3RpbWVzdGFtcChzZWxmKToKLSAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpUaW1lc3RhbXAiLCAiQHZhbHVlIjogMTQ4MTc1MDA3NjI5NX0sIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKLSAgICAgICAgdHMgPSB0aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDAuMCkKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QodHMpCi0gICAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X2R1cmF0aW9uKHNlbGYpOgotICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeyJAdHlwZSI6ICJneDpEdXJhdGlvbiIsICJAdmFsdWUiOiAiUDVEIn0sIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKLSAgICAgICAgZCA9IGRhdGV0aW1lLnRpbWVkZWx0YShob3Vycz0xMjApCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGQpCi0gICAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBvdXRwdXQKLQotICAgIGRlZiB0ZXN0X3V1aWQoc2VsZik6Ci0gICAgICAgIGV4cGVjdGVkID0ganNvbi5kdW1wcyh7J0B0eXBlJzogJ2c6VVVJRCcsICdAdmFsdWUnOiAiNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2In0sIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKLSAgICAgICAgcHJvcCA9IHV1aWQuVVVJRCgiNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2IikKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QocHJvcCkKLSAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfYnl0ZWJ1ZmZlcihzZWxmKToKLSAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsnQHR5cGUnOiAnZ3g6Qnl0ZUJ1ZmZlcicsICdAdmFsdWUnOiAnYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxJ30sIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKLSAgICAgICAgYmIgPSBCeXRlQnVmZmVyVHlwZSgiYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxIiwgInV0ZjgiKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChiYikKLSAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfY2hhcihzZWxmKToKLSAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsnQHR5cGUnOiAnZ3g6Q2hhcicsICdAdmFsdWUnOiAnTCd9LCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCi0gICAgICAgIGMgPSBzdHIuX19uZXdfXyhTaW5nbGVDaGFyLCBjaHIoNzYpKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChjKQotICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0Ci0KLQotY2xhc3MgVGVzdEZ1bmN0aW9uYWxHcmFwaFNPTklPKG9iamVjdCk6Ci0gICAgIiIiRnVuY3Rpb25hbCBJTyB0ZXN0cyIiIgotCi0gICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uX3YyKToKLSAgICAgICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbl92MikKLSAgICAgICAgdHMgPSB0aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDApCi0gICAgICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ3RzJywgdHMpCi0gICAgICAgIHJlc3AgPSByZXNwLnRvTGlzdCgpCi0gICAgICAgIHZpZCA9IHJlc3BbMF0uaWQKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdHNfcHJvcCA9IGcuVih2aWQpLnByb3BlcnRpZXMoJ3RzJykudG9MaXN0KClbMF0KLSAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRzX3Byb3AudmFsdWUsIHRpbWVzdGFtcCkKLSAgICAgICAgICAgIGFzc2VydCB0c19wcm9wLnZhbHVlID09IHRzCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiRXJyb3IgbWFraW5nIHJlcXVlc3QiCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBnLlYodmlkKS5kcm9wKCkuaXRlcmF0ZSgpCi0KLSAgICBkZWYgdGVzdF9kYXRldGltZShzZWxmLCByZW1vdGVfY29ubmVjdGlvbl92Mik6Ci0gICAgICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb25fdjIpCi0gICAgICAgIGR0ID0gZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCgxNDgxNzUwMDc2Mjk1IC8gMTAwMCkKLSAgICAgICAgcmVzcCA9IGcuYWRkVigndGVzdF92ZXJ0ZXgnKS5wcm9wZXJ0eSgnZHQnLCBkdCkudG9MaXN0KCkKLSAgICAgICAgdmlkID0gcmVzcFswXS5pZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkdF9wcm9wID0gZy5WKHZpZCkucHJvcGVydGllcygnZHQnKS50b0xpc3QoKVswXQotICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZHRfcHJvcC52YWx1ZSwgZGF0ZXRpbWUuZGF0ZXRpbWUpCi0gICAgICAgICAgICBhc3NlcnQgZHRfcHJvcC52YWx1ZSA9PSBkdAotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIkVycm9yIG1ha2luZyByZXF1ZXN0IgotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgZy5WKHZpZCkuZHJvcCgpLml0ZXJhdGUoKQotCi0gICAgZGVmIHRlc3RfdXVpZChzZWxmLCByZW1vdGVfY29ubmVjdGlvbl92Mik6Ci0gICAgICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb25fdjIpCi0gICAgICAgIHVpZCA9IHV1aWQuVVVJRCgiNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2IikKLSAgICAgICAgcmVzcCA9IGcuYWRkVigndGVzdF92ZXJ0ZXgnKS5wcm9wZXJ0eSgndXVpZCcsIHVpZCkudG9MaXN0KCkKLSAgICAgICAgdmlkID0gcmVzcFswXS5pZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB1aWRfcHJvcCA9IGcuVih2aWQpLnByb3BlcnRpZXMoJ3V1aWQnKS50b0xpc3QoKVswXQotICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodWlkX3Byb3AudmFsdWUsIHV1aWQuVVVJRCkKLSAgICAgICAgICAgIGFzc2VydCB1aWRfcHJvcC52YWx1ZSA9PSB1aWQKLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJFcnJvciBtYWtpbmcgcmVxdWVzdCIKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGcuVih2aWQpLmRyb3AoKS5pdGVyYXRlKCkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9ncmFwaHNvblYzZDAucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZ3JhcGhzb25WM2QwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzk0OGZkLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9ncmFwaHNvblYzZDAucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1fX2F1dGhvcl9fID0gJ01hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSknCi0KLWltcG9ydCBkYXRldGltZQotaW1wb3J0IGNhbGVuZGFyCi1pbXBvcnQganNvbgotaW1wb3J0IHV1aWQKLWltcG9ydCBtYXRoCi1mcm9tIGRlY2ltYWwgaW1wb3J0ICoKLQotZnJvbSBtb2NrIGltcG9ydCBNb2NrCi0KLWltcG9ydCBzaXgKLQotZnJvbSBncmVtbGluX3B5dGhvbi5zdGF0aWNzIGltcG9ydCAqCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgVmVydGV4LCBFZGdlLCBQcm9wZXJ0eSwgVmVydGV4UHJvcGVydHksIEdyYXBoLCBQYXRoCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYzZDAgaW1wb3J0IEdyYXBoU09OV3JpdGVyLCBHcmFwaFNPTlJlYWRlciwgR3JhcGhTT05VdGlsCi1pbXBvcnQgZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMAotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgUAotZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnN0cmF0ZWdpZXMgaW1wb3J0IFN1YmdyYXBoU3RyYXRlZ3kKLWZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5ncmFwaF90cmF2ZXJzYWwgaW1wb3J0IF9fCi0KLQotY2xhc3MgVGVzdEdyYXBoU09OUmVhZGVyKG9iamVjdCk6Ci0gICAgZ3JhcGhzb25fcmVhZGVyID0gR3JhcGhTT05SZWFkZXIoKQotCi0gICAgZGVmIHRlc3RfY29sbGVjdGlvbnMoc2VsZik6Ci0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAotICAgICAgICAgICAganNvbi5kdW1wcyh7IkB0eXBlIjogImc6TGlzdCIsICJAdmFsdWUiOiBbeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMiXX0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBsaXN0KQotICAgICAgICBhc3NlcnQgeFswXSA9PSAxCi0gICAgICAgIGFzc2VydCB4WzFdID09IDIKLSAgICAgICAgYXNzZXJ0IHhbMl0gPT0gIjMiCi0gICAgICAgICMjCi0KLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCi0gICAgICAgICAgICBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpTZXQiLCAiQHZhbHVlIjogW3siQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyJdfSkpCi0gICAgICAgICMgcmV0dXJuIGEgc2V0IGFzIG5vcm1hbAotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBzZXQpCi0gICAgICAgIGFzc2VydCB4ID09IHNldChbMSwgMiwgIjMiXSkKLQotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKLSAgICAgICAgICAgIGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOlNldCIsICJAdmFsdWUiOiBbeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkB0eXBlIjogImc6RmxvYXQiLCAiQHZhbHVlIjogMi4wfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyJdfSkpCi0gICAgICAgICMgY29lcmNlIHRvIGxpc3QgaGVyZSBiZWNhdXNlIEphdmEgbWlnaHQgcmV0dXJuIG51bWVyaWNzIG9mIGRpZmZlcmVudCB0eXBlcyB3aGljaCBweXRob24gd29uJ3QgcmVjb2duaXplCi0gICAgICAgICMgc2VlIGNvbW1lbnRzIG9mIFRJTktFUlBPUC0xODQ0IGZvciBtb3JlIGRldGFpbHMKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgbGlzdCkKLSAgICAgICAgYXNzZXJ0IHggPT0gbGlzdChbMSwgMiwgMi4wLCAiMyJdKQotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKLSAgICAgICAgICAgIGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOk1hcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQHZhbHVlIjogWydhJywgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9LCAnYicsICJtYXJrbyJdfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGRpY3QpCi0gICAgICAgIGFzc2VydCB4WydhJ10gPT0gMQotICAgICAgICBhc3NlcnQgeFsnYiddID09ICJtYXJrbyIKLSAgICAgICAgYXNzZXJ0IGxlbih4KSA9PSAyCi0KLSAgICAgICAgIyBCdWxrU2V0IGdldHMgY29lcmNlZCB0byBhIExpc3QgLSBib3RoIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCi0gICAgICAgICAgICBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpCdWxrU2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJAdmFsdWUiOiBbIm1hcmtvIiwgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IDF9LCAiam9zaCIsIHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAzfV19KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgbGlzdCkKLSAgICAgICAgYXNzZXJ0IGxlbih4KSA9PSA0Ci0gICAgICAgIGFzc2VydCB4LmNvdW50KCJtYXJrbyIpID09IDEKLSAgICAgICAgYXNzZXJ0IHguY291bnQoImpvc2giKSA9PSAzCi0KLSAgICBkZWYgdGVzdF9udW1iZXJfaW5wdXQoc2VsZik6Ci0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImd4OkJ5dGUiLAotICAgICAgICAgICAgIkB2YWx1ZSI6IDEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIFNpbmdsZUJ5dGUpCi0gICAgICAgIGFzc2VydCAxID09IHgKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZzpJbnQzMiIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMzEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGludCkKLSAgICAgICAgYXNzZXJ0IDMxID09IHgKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZzpJbnQ2NCIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMzEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGxvbmcpCi0gICAgICAgIGFzc2VydCBsb25nKDMxKSA9PSB4Ci0gICAgICAgICMjCi0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImc6RmxvYXQiLAotICAgICAgICAgICAgIkB2YWx1ZSI6IDMxLjMKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQotICAgICAgICBhc3NlcnQgMzEuMyA9PSB4Ci0gICAgICAgICMjCi0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAzMS4yCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBmbG9hdCkKLSAgICAgICAgYXNzZXJ0IDMxLjIgPT0geAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJnOkRvdWJsZSIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIk5hTiIKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQotICAgICAgICBhc3NlcnQgbWF0aC5pc25hbih4KQotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJnOkRvdWJsZSIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIkluZmluaXR5IgotICAgICAgICB9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCi0gICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4ID4gMAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJnOkRvdWJsZSIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIi1JbmZpbml0eSIKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQotICAgICAgICBhc3NlcnQgbWF0aC5pc2luZih4KSBhbmQgeCA8IDAKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMzEuMgotICAgICAgICB9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgRGVjaW1hbCkKLSAgICAgICAgYXNzZXJ0IERlY2ltYWwoMzEuMikgPT0geAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCi0gICAgICAgIGFzc2VydCBEZWNpbWFsKCcxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEnKSA9PSB4Ci0gICAgICAgICMjCi0gICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoewotICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLAotICAgICAgICAgICAgIkB2YWx1ZSI6ICJOYU4iCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBEZWNpbWFsKQotICAgICAgICBhc3NlcnQgbWF0aC5pc25hbih4KQotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAiSW5maW5pdHkiCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBEZWNpbWFsKQotICAgICAgICBhc3NlcnQgbWF0aC5pc2luZih4KSBhbmQgeCA+IDAKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsCi0gICAgICAgICAgICAiQHZhbHVlIjogIi1JbmZpbml0eSIKLSAgICAgICAgfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCi0gICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4IDwgMAotICAgICAgICAjIwotICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKLSAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdJbnRlZ2VyIiwKLSAgICAgICAgICAgICJAdmFsdWUiOiAzMQotICAgICAgICB9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgbG9uZykKLSAgICAgICAgYXNzZXJ0IDMxID09IHgKLSAgICAgICAgIyMKLSAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7Ci0gICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnSW50ZWdlciIsCi0gICAgICAgICAgICAiQHZhbHVlIjogMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxCi0gICAgICAgIH0pKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBsb25nKQotICAgICAgICBhc3NlcnQgMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxID09IHgKLQotICAgIGRlZiB0ZXN0X2dyYXBoKHNlbGYpOgotICAgICAgICB2ZXJ0ZXggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgotICAgICAgICB7IkB0eXBlIjoiZzpWZXJ0ZXgiLCAiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6MX0sImxhYmVsIjoicGVyc29uIiwib3V0RSI6eyJjcmVhdGVkIjpbeyJpZCI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjl9LCJpblYiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjozfSwicHJvcGVydGllcyI6eyJ3ZWlnaHQiOnsiQHR5cGUiOiJnOkRvdWJsZSIsIkB2YWx1ZSI6MC40fX19XSwia25vd3MiOlt7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6N30sImluViI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjJ9LCJwcm9wZXJ0aWVzIjp7IndlaWdodCI6eyJAdHlwZSI6Imc6RG91YmxlIiwiQHZhbHVlIjowLjV9fX0seyJpZCI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjh9LCJpblYiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjo0fSwicHJvcGVydGllcyI6eyJ3ZWlnaHQiOnsiQHR5cGUiOiJnOkRvdWJsZSIsIkB2YWx1ZSI6MS4wfX19XX0sInByb3BlcnRpZXMiOnsibmFtZSI6W3siaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjowfSwidmFsdWUiOiJtYXJrbyJ9XSwiYWdlIjpbeyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjF9LCJ2YWx1ZSI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjI5fX1dfX19IiIiKQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXgsIFZlcnRleCkKLSAgICAgICAgYXNzZXJ0ICJwZXJzb24iID09IHZlcnRleC5sYWJlbAotICAgICAgICBhc3NlcnQgMSA9PSB2ZXJ0ZXguaWQKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4LmlkLCBpbnQpCi0gICAgICAgIGFzc2VydCB2ZXJ0ZXggPT0gVmVydGV4KDEpCi0gICAgICAgICMjCi0gICAgICAgIHZlcnRleCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoIiIiCi0gICAgICAgIHsiQHR5cGUiOiJnOlZlcnRleCIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkZsb2F0IiwiQHZhbHVlIjo0NS4yM319fSIiIikKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4LCBWZXJ0ZXgpCi0gICAgICAgIGFzc2VydCA0NS4yMyA9PSB2ZXJ0ZXguaWQKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4LmlkLCBGbG9hdFR5cGUpCi0gICAgICAgIGFzc2VydCAidmVydGV4IiA9PSB2ZXJ0ZXgubGFiZWwKLSAgICAgICAgYXNzZXJ0IHZlcnRleCA9PSBWZXJ0ZXgoNDUuMjMpCi0gICAgICAgICMjCi0gICAgICAgIHZlcnRleF9wcm9wZXJ0eSA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoIiIiCi0gICAgICAgIHsiQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwgIkB2YWx1ZSI6eyJpZCI6ImFuSWQiLCJsYWJlbCI6ImFLZXkiLCJ2YWx1ZSI6dHJ1ZSwidmVydGV4Ijp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6OX19fSIiIikKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4X3Byb3BlcnR5LCBWZXJ0ZXhQcm9wZXJ0eSkKLSAgICAgICAgYXNzZXJ0ICJhbklkIiA9PSB2ZXJ0ZXhfcHJvcGVydHkuaWQKLSAgICAgICAgYXNzZXJ0ICJhS2V5IiA9PSB2ZXJ0ZXhfcHJvcGVydHkubGFiZWwKLSAgICAgICAgYXNzZXJ0IHZlcnRleF9wcm9wZXJ0eS52YWx1ZQotICAgICAgICBhc3NlcnQgdmVydGV4X3Byb3BlcnR5LnZlcnRleCA9PSBWZXJ0ZXgoOSkKLSAgICAgICAgIyMKLSAgICAgICAgdmVydGV4X3Byb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKLSAgICAgICAgeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCAiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6MX0sImxhYmVsIjoibmFtZSIsInZhbHVlIjoibWFya28ifX0iIiIpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZlcnRleF9wcm9wZXJ0eSwgVmVydGV4UHJvcGVydHkpCi0gICAgICAgIGFzc2VydCAxID09IHZlcnRleF9wcm9wZXJ0eS5pZAotICAgICAgICBhc3NlcnQgIm5hbWUiID09IHZlcnRleF9wcm9wZXJ0eS5sYWJlbAotICAgICAgICBhc3NlcnQgIm1hcmtvIiA9PSB2ZXJ0ZXhfcHJvcGVydHkudmFsdWUKLSAgICAgICAgYXNzZXJ0IHZlcnRleF9wcm9wZXJ0eS52ZXJ0ZXggaXMgTm9uZQotICAgICAgICAjIwotICAgICAgICBlZGdlID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKLSAgICAgICAgeyJAdHlwZSI6Imc6RWRnZSIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjoxN30sImxhYmVsIjoia25vd3MiLCJpblYiOiJ4Iiwib3V0ViI6InkiLCJpblZMYWJlbCI6InhMYWIiLCJwcm9wZXJ0aWVzIjp7ImFLZXkiOiJhVmFsdWUiLCJiS2V5Ijp0cnVlfX19IiIiKQotICAgICAgICAjIHByaW50IGVkZ2UKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZWRnZSwgRWRnZSkKLSAgICAgICAgYXNzZXJ0IDE3ID09IGVkZ2UuaWQKLSAgICAgICAgYXNzZXJ0ICJrbm93cyIgPT0gZWRnZS5sYWJlbAotICAgICAgICBhc3NlcnQgZWRnZS5pblYgPT0gVmVydGV4KCJ4IiwgInhMYWJlbCIpCi0gICAgICAgIGFzc2VydCBlZGdlLm91dFYgPT0gVmVydGV4KCJ5IiwgInZlcnRleCIpCi0gICAgICAgICMjCi0gICAgICAgIHByb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKLSAgICAgICAgeyJAdHlwZSI6Imc6UHJvcGVydHkiLCAiQHZhbHVlIjp7ImtleSI6ImFLZXkiLCJ2YWx1ZSI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjE3fSwiZWxlbWVudCI6eyJAdHlwZSI6Imc6RWRnZSIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjEyMn0sImxhYmVsIjoia25vd3MiLCJpblYiOiJ4Iiwib3V0ViI6InkiLCJpblZMYWJlbCI6InhMYWIifX19fSIiIikKLSAgICAgICAgIyBwcmludCBwcm9wZXJ0eQotICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwcm9wZXJ0eSwgUHJvcGVydHkpCi0gICAgICAgIGFzc2VydCAiYUtleSIgPT0gcHJvcGVydHkua2V5Ci0gICAgICAgIGFzc2VydCAxNyA9PSBwcm9wZXJ0eS52YWx1ZQotICAgICAgICBhc3NlcnQgRWRnZSgxMjIsIFZlcnRleCgieCIpLCAia25vd3MiLCBWZXJ0ZXgoInkiKSkgPT0gcHJvcGVydHkuZWxlbWVudAotCi0gICAgZGVmIHRlc3RfcGF0aChzZWxmKToKLSAgICAgICAgcGF0aCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCi0gICAgICAgICAgICAiIiJ7IkB0eXBlIjoiZzpQYXRoIiwiQHZhbHVlIjp7ImxhYmVscyI6eyJAdHlwZSI6Imc6TGlzdCIsIkB2YWx1ZSI6W3siQHR5cGUiOiJnOlNldCIsIkB2YWx1ZSI6WyJhIl19LHsiQHR5cGUiOiJnOlNldCIsIkB2YWx1ZSI6WyJiIiwiYyJdfSx7IkB0eXBlIjoiZzpTZXQiLCJAdmFsdWUiOltdfV19LCJvYmplY3RzIjp7IkB0eXBlIjoiZzpMaXN0IiwiQHZhbHVlIjpbeyJAdHlwZSI6Imc6VmVydGV4IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6MX0sImxhYmVsIjoicGVyc29uIiwicHJvcGVydGllcyI6eyJuYW1lIjpbeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjowfSwidmFsdWUiOiJtYXJrbyIsImxhYmVsIjoibmFtZSJ9fV0sImFnZSI6W3siQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MX0sInZhbHVlIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6Mjl9LCJsYWJlbCI6ImFnZSJ9fV19fX0seyJAdHlwZSI6Imc6VmVydGV4IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6M30sImxhYmVsIjoic29mdHdhcmUiLCJwcm9wZXJ0aWVzIjp7Im5hbWUiOlt7IkB0eXBlIjoiZzpWZXJ0ZXhQcm9wZXJ0eSIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjR9LCJ2YWx1ZSI6ImxvcCIsImxhYmVsIjoibmFtZSJ9fV0sImxhbmciOlt7IkB0eXBlIjoiZzpWZXJ0ZXhQcm9wZXJ0eSIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjV9LCJ2YWx1ZSI6ImphdmEiLCJsYWJlbCI6ImxhbmcifX1dfX19LCJsb3AiXX19fSIiIgotICAgICAgICApCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhdGgsIFBhdGgpCi0gICAgICAgIGFzc2VydCAicGF0aFt2WzFdLCB2WzNdLCBsb3BdIiA9PSBzdHIocGF0aCkKLSAgICAgICAgYXNzZXJ0IFZlcnRleCgxKSA9PSBwYXRoWzBdCi0gICAgICAgIGFzc2VydCBWZXJ0ZXgoMSkgPT0gcGF0aFsiYSJdCi0gICAgICAgIGFzc2VydCAibG9wIiA9PSBwYXRoWzJdCi0gICAgICAgIGFzc2VydCAzID09IGxlbihwYXRoKQotCi0gICAgZGVmIHRlc3RfY3VzdG9tX21hcHBpbmcoc2VsZik6Ci0KLSAgICAgICAgIyBleHRlbmRlZCBtYXBwaW5nCi0gICAgICAgIGNsYXNzIFgob2JqZWN0KToKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICB0eXBlX3N0cmluZyA9ICJ0ZXN0Olh0eXBlIgotICAgICAgICBvdmVycmlkZV9zdHJpbmcgPSAiZzpJbnQ2NCIKLSAgICAgICAgc2VyZGVzID0gTW9jaygpCi0KLSAgICAgICAgcmVhZGVyID0gR3JhcGhTT05SZWFkZXIoZGVzZXJpYWxpemVyX21hcD17dHlwZV9zdHJpbmc6IHNlcmRlc30pCi0gICAgICAgIGFzc2VydCB0eXBlX3N0cmluZyBpbiByZWFkZXIuZGVzZXJpYWxpemVycwotCi0gICAgICAgICMgYmFzZSBkaWN0cyBhcmUgbm90IG1vZGlmaWVkCi0gICAgICAgIGFzc2VydCB0eXBlX3N0cmluZyBub3QgaW4gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMC5fZGVzZXJpYWxpemVycwotCi0gICAgICAgIHggPSBYKCkKLSAgICAgICAgbyA9IHJlYWRlci50b09iamVjdCh7R3JhcGhTT05VdGlsLlRZUEVfS0VZOiB0eXBlX3N0cmluZywgR3JhcGhTT05VdGlsLlZBTFVFX0tFWTogeH0pCi0gICAgICAgIHNlcmRlcy5vYmplY3RpZnkuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgoeCwgcmVhZGVyKQotICAgICAgICBhc3NlcnQgbyBpcyBzZXJkZXMub2JqZWN0aWZ5KCkKLQotICAgICAgICAjIG92ZXJyaWRkZW4gbWFwcGluZwotICAgICAgICB0eXBlX3N0cmluZyA9ICJnOkludDY0IgotICAgICAgICBzZXJkZXMgPSBNb2NrKCkKLSAgICAgICAgcmVhZGVyID0gR3JhcGhTT05SZWFkZXIoZGVzZXJpYWxpemVyX21hcD17dHlwZV9zdHJpbmc6IHNlcmRlcywgb3ZlcnJpZGVfc3RyaW5nOiBzZXJkZXN9KQotICAgICAgICBhc3NlcnQgZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMC5fZGVzZXJpYWxpemVyc1t0eXBlX3N0cmluZ10gaXMgbm90IHJlYWRlci5kZXNlcmlhbGl6ZXJzWwotICAgICAgICAgICAgdHlwZV9zdHJpbmddCi0KLSAgICAgICAgdmFsdWUgPSAzCi0gICAgICAgIG8gPSByZWFkZXIudG9PYmplY3Qoe0dyYXBoU09OVXRpbC5UWVBFX0tFWTogdHlwZV9zdHJpbmcsIEdyYXBoU09OVXRpbC5WQUxVRV9LRVk6IHZhbHVlfSkKLSAgICAgICAgc2VyZGVzLm9iamVjdGlmeS5hc3NlcnRfY2FsbGVkX29uY2Vfd2l0aCh2YWx1ZSwgcmVhZGVyKQotICAgICAgICBhc3NlcnQgbyBpcyBzZXJkZXMub2JqZWN0aWZ5KCkKLQotICAgIGRlZiB0ZXN0X2RhdGV0aW1lKHNlbGYpOgotICAgICAgICBleHBlY3RlZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMTYsIDEyLCAxNCwgMTYsIDE0LCAzNiwgMjk1MDAwKQotICAgICAgICBwdHMgPSBjYWxlbmRhci50aW1lZ20oZXhwZWN0ZWQudXRjdGltZXR1cGxlKCkpICsgZXhwZWN0ZWQubWljcm9zZWNvbmQgLyAxZTYKLSAgICAgICAgdHMgPSBpbnQocm91bmQocHRzICogMTAwMCkpCi0gICAgICAgIGR0ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpEYXRlIiwgIkB2YWx1ZSI6IHRzfSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGR0LCBkYXRldGltZS5kYXRldGltZSkKLSAgICAgICAgIyBUSU5LRVJQT1AtMTg0OAotICAgICAgICBhc3NlcnQgZHQgPT0gZXhwZWN0ZWQKLQotICAgIGRlZiB0ZXN0X3RpbWVzdGFtcChzZWxmKToKLSAgICAgICAgZHQgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOlRpbWVzdGFtcCIsICJAdmFsdWUiOiAxNDgxNzUwMDc2Mjk1fSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGR0LCB0aW1lc3RhbXApCi0gICAgICAgIGFzc2VydCBmbG9hdChkdCkgPT0gMTQ4MTc1MDA3Ni4yOTUKLQotICAgIGRlZiB0ZXN0X2R1cmF0aW9uKHNlbGYpOgotICAgICAgICBkID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsiQHR5cGUiOiAiZ3g6RHVyYXRpb24iLCAiQHZhbHVlIjogIlBUMTIwSCJ9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZCwgZGF0ZXRpbWUudGltZWRlbHRhKQotICAgICAgICBhc3NlcnQgZCA9PSBkYXRldGltZS50aW1lZGVsdGEoaG91cnM9MTIwKQotCi0gICAgZGVmIHRlc3RfdXVpZChzZWxmKToKLSAgICAgICAgcHJvcCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCi0gICAgICAgICAgICBqc29uLmR1bXBzKHsnQHR5cGUnOiAnZzpVVUlEJywgJ0B2YWx1ZSc6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYifSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHByb3AsIHV1aWQuVVVJRCkKLSAgICAgICAgYXNzZXJ0IHN0cihwcm9wKSA9PSAnNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2JwotCi0gICAgZGVmIHRlc3RfbWV0cmljcyhzZWxmKToKLSAgICAgICAgcHJvcCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCi0gICAgICAgICAgICBqc29uLmR1bXBzKFt7J0B0eXBlJzogJ2c6VHJhdmVyc2FsTWV0cmljcycsICdAdmFsdWUnOiB7J2R1cic6IDEuNDY4NTk0LCAnbWV0cmljcyc6IFsKLSAgICAgICAgICAgICAgICB7J0B0eXBlJzogJ2c6TWV0cmljcycsICdAdmFsdWUnOiB7J2R1cic6IDEuMzgwOTU3LCAnY291bnRzJzoge30sICduYW1lJzogJ0dyYXBoU3RlcChfXy5WKCkpJywgJ2Fubm90YXRpb25zJzogeydwZXJjZW50RHVyJzogOTQuMDMyNTkxNzE2OTc1NTZ9LCAnaWQnOiAnNC4wLjAoKSd9fSwKLSAgICAgICAgICAgICAgICB7J0B0eXBlJzogJ2c6TWV0cmljcycsICdAdmFsdWUnOiB7J2R1cic6IDAuMDg3NjM3LCAnY291bnRzJzoge30sICduYW1lJzogJ1JlZmVyZW5jZUVsZW1lbnRTdGVwJywgJ2Fubm90YXRpb25zJzogeydwZXJjZW50RHVyJzogNS45Njc0MDgyODMwMjQ0NDR9LCAnaWQnOiAnMy4wLjAoKSd9fQotICAgICAgICAgICAgXX19XSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHByb3AsIGxpc3QpCi0gICAgICAgIGFzc2VydCBwcm9wID09IFt7J2R1cic6IDEuNDY4NTk0LCAnbWV0cmljcyc6IFsKLSAgICAgICAgICAgICAgICB7J2R1cic6IDEuMzgwOTU3LCAnY291bnRzJzoge30sICduYW1lJzogJ0dyYXBoU3RlcChfXy5WKCkpJywgJ2Fubm90YXRpb25zJzogeydwZXJjZW50RHVyJzogOTQuMDMyNTkxNzE2OTc1NTZ9LCAnaWQnOiAnNC4wLjAoKSd9LAotICAgICAgICAgICAgICAgIHsnZHVyJzogMC4wODc2MzcsICdjb3VudHMnOiB7fSwgJ25hbWUnOiAnUmVmZXJlbmNlRWxlbWVudFN0ZXAnLCAnYW5ub3RhdGlvbnMnOiB7J3BlcmNlbnREdXInOiA1Ljk2NzQwODI4MzAyNDQ0NH0sICdpZCc6ICczLjAuMCgpJ30KLSAgICAgICAgICAgICAgICBdfV0KLQotICAgIGRlZiB0ZXN0X2J5dGVidWZmZXIoc2VsZik6Ci0gICAgICAgIGJiID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKLSAgICAgICAgICAgIGpzb24uZHVtcHMoeyJAdHlwZSI6ICJneDpCeXRlQnVmZmVyIiwgIkB2YWx1ZSI6ICJjMjl0WlNCaWVYUmxjeUJtYjNJZ2VXOTEifSkpCi0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJiLCBCeXRlQnVmZmVyVHlwZSkKLSAgICAgICAgYXNzZXJ0IEJ5dGVCdWZmZXJUeXBlKCJjMjl0WlNCaWVYUmxjeUJtYjNJZ2VXOTEiLCAidXRmOCIpID09IGJiCi0KLSAgICBkZWYgdGVzdF9jaGFyKHNlbGYpOgotICAgICAgICBjID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsiQHR5cGUiOiAiZ3g6Q2hhciIsICJAdmFsdWUiOiAiTCJ9KSkKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYywgU2luZ2xlQ2hhcikKLSAgICAgICAgYXNzZXJ0IGNocig3NikgPT0gYwotCi0KLWNsYXNzIFRlc3RHcmFwaFNPTldyaXRlcihvYmplY3QpOgotICAgIGdyYXBoc29uX3dyaXRlciA9IEdyYXBoU09OV3JpdGVyKCkKLSAgICBncmFwaHNvbl9yZWFkZXIgPSBHcmFwaFNPTlJlYWRlcigpCi0KLSAgICBkZWYgdGVzdF9jb2xsZWN0aW9ucyhzZWxmKToKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpMaXN0IiwgIkB2YWx1ZSI6IFt7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAzfV19ID09IGpzb24ubG9hZHMoCi0gICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChbMSwgMiwgM10pKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOlNldCIsICJAdmFsdWUiOiBbeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDN9XX0gPT0ganNvbi5sb2FkcygKLSAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KHNldChbMSwgMiwgMywgM10pKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpNYXAiLAotICAgICAgICAgICAgICAgICJAdmFsdWUiOiBbJ2EnLCB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX1dfSA9PSBqc29uLmxvYWRzKAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoeydhJzogMX0pKQotCi0gICAgZGVmIHRlc3RfbnVtYmVycyhzZWxmKToKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6Qnl0ZSIsICJAdmFsdWUiOiAxfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGludC5fX25ld19fKFNpbmdsZUJ5dGUsIDEpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAyfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoMikpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IDg1MTQwMTk3MjU4NTEyMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChsb25nKDg1MTQwMTk3MjU4NTEyMikpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IC0yfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoLTIpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAtODUxNDAxOTcyNTg1MTIyfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoLTg1MTQwMTk3MjU4NTEyMikpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogLTF9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoLTEpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IDg1MTQwMTk3MjU4NTEyMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCg4NTE0MDE5NzI1ODUxMjIpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkRvdWJsZSIsICJAdmFsdWUiOiAzLjJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMy4yKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpEb3VibGUiLCAiQHZhbHVlIjogIk5hTiJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoZmxvYXQoJ25hbicpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpEb3VibGUiLCAiQHZhbHVlIjogIkluZmluaXR5In0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChmbG9hdCgnaW5mJykpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkRvdWJsZSIsICJAdmFsdWUiOiAiLUluZmluaXR5In0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChmbG9hdCgnLWluZicpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsICJAdmFsdWUiOiAiMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxIn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChEZWNpbWFsKCcxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEnKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLCAiQHZhbHVlIjogIk5hTiJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRGVjaW1hbCgnbmFuJykpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwgIkB2YWx1ZSI6ICJJbmZpbml0eSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRGVjaW1hbCgnaW5mJykpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwgIkB2YWx1ZSI6ICItSW5maW5pdHkifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KERlY2ltYWwoJy1pbmYnKSkpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0ludGVnZXIiLCAiQHZhbHVlIjogIjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobG9uZygxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnSW50ZWdlciIsICJAdmFsdWUiOiAiMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxIn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEpKQotICAgICAgICBhc3NlcnQgIiIidHJ1ZSIiIiA9PSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChUcnVlKQotCi0gICAgZGVmIHRlc3RfUChzZWxmKToKLSAgICAgICAgcmVzdWx0ID0geydAdHlwZSc6ICdnOlAnLAotICAgICAgICAgICAgICAgICAgJ0B2YWx1ZSc6IHsKLSAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJzogJ2FuZCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogW3sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ2c6UCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdAdmFsdWUnOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJzogJ29yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IFt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ2c6UCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B2YWx1ZSc6IHsncHJlZGljYXRlJzogJ2x0JywgJ3ZhbHVlJzogJ2InfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J0B0eXBlJzogJ2c6UCcsICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6ICdndCcsICd2YWx1ZSc6ICdjJ319Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7J0B0eXBlJzogJ2c6UCcsICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6ICduZXEnLCAndmFsdWUnOiAnZCd9fV19fQotCi0gICAgICAgIGFzc2VydCByZXN1bHQgPT0ganNvbi5sb2FkcygKLSAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAubHQoImIiKS5vcl8oUC5ndCgiYyIpKS5hbmRfKFAubmVxKCJkIikpKSkKLQotICAgICAgICByZXN1bHQgPSB7J0B0eXBlJzogJ2c6UCcsICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6ICd3aXRoaW4nLCAndmFsdWUnOiB7J0B0eXBlJzogJ2c6TGlzdCcsICdAdmFsdWUnOiBbCi0gICAgICAgICAgICB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0sIHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAyfV19fX0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAud2l0aGluKFsxLCAyXSkpKQotICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC53aXRoaW4oMSwgMikpKQotCi0gICAgICAgIHJlc3VsdCA9IHsnQHR5cGUnOiAnZzpQJywgJ0B2YWx1ZSc6IHsncHJlZGljYXRlJzogJ3dpdGhpbicsICd2YWx1ZSc6IHsnQHR5cGUnOiAnZzpMaXN0JywgJ0B2YWx1ZSc6IFsKLSAgICAgICAgICAgIHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfV19fX0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAud2l0aGluKFsxXSkpKQotICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC53aXRoaW4oMSkpKQotCi0gICAgZGVmIHRlc3Rfc3RyYXRlZ2llcyhzZWxmKToKLSAgICAgICAgIyB3ZSBoYXZlIGEgcHJveHkgbW9kZWwgZm9yIG5vdyBnaXZlbiB0aGF0IHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byBoYXZlIGc6WFhYIGFsbCByZWdpc3RlcmVkIG9uIHRoZSAKLSAgICAgICAgIyBHcmVtbGluIHRyYXZlcnNhbCBtYWNoaW5lICh5ZXQpCi0gICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6U3ViZ3JhcGhTdHJhdGVneSIsICJAdmFsdWUiOiB7fX0gPT0ganNvbi5sb2FkcygKLSAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFN1YmdyYXBoU3RyYXRlZ3kpKQotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOlN1YmdyYXBoU3RyYXRlZ3kiLCAiQHZhbHVlIjogewotICAgICAgICAgICAgInZlcnRpY2VzIjogeyJAdHlwZSI6ICJnOkJ5dGVjb2RlIiwgIkB2YWx1ZSI6IHsic3RlcCI6IFtbImhhcyIsICJuYW1lIiwgIm1hcmtvIl1dfX19fSA9PSBqc29uLmxvYWRzKAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoU3ViZ3JhcGhTdHJhdGVneSh2ZXJ0aWNlcz1fXy5oYXMoIm5hbWUiLCAibWFya28iKSkpKQotCi0gICAgZGVmIHRlc3RfZ3JhcGgoc2VsZik6Ci0gICAgICAgICMgVE9ETzogdGhpcyBhc3NlcnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBweXRob24gMyBhbmQgbm93IHRoYXQgd2UgdGVzdCB3aXRoIGJvdGggMiBhbmQgMyBpdCBmYWlscwotICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOlZlcnRleCIsCi0gICAgICAgICAgICAgICAgIkB2YWx1ZSI6IHsiaWQiOiB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogMTJ9LCAibGFiZWwiOiAicGVyc29uIn19ID09IGpzb24ubG9hZHMoCi0gICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChWZXJ0ZXgobG9uZygxMiksICJwZXJzb24iKSkpCi0KLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpFZGdlIiwgIkB2YWx1ZSI6IHsiaWQiOiB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogN30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dFYiOiB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dFZMYWJlbCI6ICJwZXJzb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJrbm93cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluViI6IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5WTGFiZWwiOiAiZG9nIn19ID09IGpzb24ubG9hZHMoCi0gICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChFZGdlKDcsIFZlcnRleCgwLCAicGVyc29uIiksICJrbm93cyIsIFZlcnRleCgxLCAiZG9nIikpKSkKLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsICJAdmFsdWUiOiB7ImlkIjogImJsYWgiLCAibGFiZWwiOiAia2V5QSIsICJ2YWx1ZSI6IFRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0ZXgiOiAic3RlcGhlbiJ9fSA9PSBqc29uLmxvYWRzKAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVmVydGV4UHJvcGVydHkoImJsYWgiLCAia2V5QSIsIFRydWUsIFZlcnRleCgic3RlcGhlbiIpKSkpCi0KLSAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgIkB2YWx1ZSI6IHsia2V5IjogIm5hbWUiLCAidmFsdWUiOiAibWFya28iLCAiZWxlbWVudCI6IHsiQHR5cGUiOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQHZhbHVlIjogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0ZXgiOiAidmVydGV4SWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxMjM0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiYUtleSJ9fX19ID09IGpzb24ubG9hZHMoCi0gICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eSgibmFtZSIsICJtYXJrbyIsIFZlcnRleFByb3BlcnR5KDEyMzQsICJhS2V5IiwgMjEzNDUsIFZlcnRleCgidmVydGV4SWQiKSkpKSkKLQotICAgICAgICB2ZXJ0ZXggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFZlcnRleCgxLCAicGVyc29uIikpKQotICAgICAgICBhc3NlcnQgMSA9PSB2ZXJ0ZXguaWQKLSAgICAgICAgYXNzZXJ0ICJwZXJzb24iID09IHZlcnRleC5sYWJlbAotCi0gICAgICAgIGVkZ2UgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRWRnZSgzLCBWZXJ0ZXgoMSwgInBlcnNvbiIpLCAia25vd3MiLCBWZXJ0ZXgoMiwgImRvZyIpKSkpCi0gICAgICAgIGFzc2VydCAia25vd3MiID09IGVkZ2UubGFiZWwKLSAgICAgICAgYXNzZXJ0IDMgPT0gZWRnZS5pZAotICAgICAgICBhc3NlcnQgMSA9PSBlZGdlLm91dFYuaWQKLSAgICAgICAgYXNzZXJ0IDIgPT0gZWRnZS5pblYuaWQKLQotICAgICAgICB2ZXJ0ZXhfcHJvcGVydHkgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAotICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVmVydGV4UHJvcGVydHkoMSwgImFnZSIsIDMyLCBWZXJ0ZXgoMSkpKSkKLSAgICAgICAgYXNzZXJ0IDEgPT0gdmVydGV4X3Byb3BlcnR5LmlkCi0gICAgICAgIGFzc2VydCAiYWdlIiA9PSB2ZXJ0ZXhfcHJvcGVydHkua2V5Ci0gICAgICAgIGFzc2VydCAzMiA9PSB2ZXJ0ZXhfcHJvcGVydHkudmFsdWUKLQotICAgICAgICBwcm9wZXJ0eSA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUHJvcGVydHkoImFnZSIsIDMyLjIsIEVkZ2UoMSxWZXJ0ZXgoMiksImtub3dzIixWZXJ0ZXgoMykpKSkpCi0gICAgICAgIGFzc2VydCAiYWdlIiA9PSBwcm9wZXJ0eS5rZXkKLSAgICAgICAgYXNzZXJ0IDMyLjIgPT0gcHJvcGVydHkudmFsdWUKLQotICAgIGRlZiB0ZXN0X2N1c3RvbV9tYXBwaW5nKHNlbGYpOgotICAgICAgICAjIGV4dGVuZGVkIG1hcHBpbmcKLSAgICAgICAgY2xhc3MgWChvYmplY3QpOgotICAgICAgICAgICAgcGFzcwotCi0gICAgICAgIHNlcmRlcyA9IE1vY2soKQotICAgICAgICB3cml0ZXIgPSBHcmFwaFNPTldyaXRlcihzZXJpYWxpemVyX21hcD17WDogc2VyZGVzfSkKLSAgICAgICAgYXNzZXJ0IFggaW4gd3JpdGVyLnNlcmlhbGl6ZXJzCi0KLSAgICAgICAgIyBiYXNlIGRpY3RzIGFyZSBub3QgbW9kaWZpZWQKLSAgICAgICAgYXNzZXJ0IFggbm90IGluIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYzZDAuX3NlcmlhbGl6ZXJzCi0KLSAgICAgICAgb2JqID0gWCgpCi0gICAgICAgIGQgPSB3cml0ZXIudG9EaWN0KG9iaikKLSAgICAgICAgc2VyZGVzLmRpY3RpZnkuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgob2JqLCB3cml0ZXIpCi0gICAgICAgIGFzc2VydCBkIGlzIHNlcmRlcy5kaWN0aWZ5KCkKLQotICAgICAgICAjIG92ZXJyaWRkZW4gbWFwcGluZwotICAgICAgICBzZXJkZXMgPSBNb2NrKCkKLSAgICAgICAgd3JpdGVyID0gR3JhcGhTT05Xcml0ZXIoc2VyaWFsaXplcl9tYXA9e2ludDogc2VyZGVzfSkKLSAgICAgICAgYXNzZXJ0IGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYzZDAuX3NlcmlhbGl6ZXJzW2ludF0gaXMgbm90IHdyaXRlci5zZXJpYWxpemVyc1tpbnRdCi0KLSAgICAgICAgdmFsdWUgPSAzCi0gICAgICAgIGQgPSB3cml0ZXIudG9EaWN0KHZhbHVlKQotICAgICAgICBzZXJkZXMuZGljdGlmeS5hc3NlcnRfY2FsbGVkX29uY2Vfd2l0aCh2YWx1ZSwgd3JpdGVyKQotICAgICAgICBhc3NlcnQgZCBpcyBzZXJkZXMuZGljdGlmeSgpCi0KLSAgICBkZWYgdGVzdF93cml0ZV9sb25nKHNlbGYpOgotICAgICAgICBtYXBwaW5nID0gc2VsZi5ncmFwaHNvbl93cml0ZXIudG9EaWN0KDEpCi0gICAgICAgIGFzc2VydCBtYXBwaW5nWydAdHlwZSddID09ICdnOkludDMyJwotICAgICAgICBhc3NlcnQgbWFwcGluZ1snQHZhbHVlJ10gPT0gMQotCi0gICAgICAgIG1hcHBpbmcgPSBzZWxmLmdyYXBoc29uX3dyaXRlci50b0RpY3QobG9uZygxKSkKLSAgICAgICAgYXNzZXJ0IG1hcHBpbmdbJ0B0eXBlJ10gPT0gJ2c6SW50NjQnCi0gICAgICAgIGFzc2VydCBtYXBwaW5nWydAdmFsdWUnXSA9PSAxCi0KLSAgICBkZWYgdGVzdF9kYXRldGltZShzZWxmKToKLSAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpEYXRlIiwgIkB2YWx1ZSI6IDE0ODE3NTAwNzYyOTV9LCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCi0gICAgICAgIGR0ID0gZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCgxNDgxNzUwMDc2Mjk1IC8gMTAwMC4wKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChkdCkKLSAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYpOgotICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOlRpbWVzdGFtcCIsICJAdmFsdWUiOiAxNDgxNzUwMDc2Mjk1fSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQotICAgICAgICB0cyA9IHRpbWVzdGFtcCgxNDgxNzUwMDc2Mjk1IC8gMTAwMC4wKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCh0cykKLSAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfZHVyYXRpb24oc2VsZik6Ci0gICAgICAgIGV4cGVjdGVkID0ganNvbi5kdW1wcyh7IkB0eXBlIjogImd4OkR1cmF0aW9uIiwgIkB2YWx1ZSI6ICJQNUQifSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQotICAgICAgICBkID0gZGF0ZXRpbWUudGltZWRlbHRhKGhvdXJzPTEyMCkKLSAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoZCkKLSAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAotCi0gICAgZGVmIHRlc3RfdXVpZChzZWxmKToKLSAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsnQHR5cGUnOiAnZzpVVUlEJywgJ0B2YWx1ZSc6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYifSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQotICAgICAgICBwcm9wID0gdXVpZC5VVUlEKCI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiKQotICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChwcm9wKQotICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0Ci0KLSAgICBkZWYgdGVzdF9ieXRlYnVmZmVyKHNlbGYpOgotICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeydAdHlwZSc6ICdneDpCeXRlQnVmZmVyJywgJ0B2YWx1ZSc6ICdjMjl0WlNCaWVYUmxjeUJtYjNJZ2VXOTEnfSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQotICAgICAgICBiYiA9IEJ5dGVCdWZmZXJUeXBlKCJjMjl0WlNCaWVYUmxjeUJtYjNJZ2VXOTEiLCAidXRmOCIpCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGJiKQotICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0Ci0KLSAgICBkZWYgdGVzdF9jaGFyKHNlbGYpOgotICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeydAdHlwZSc6ICdneDpDaGFyJywgJ0B2YWx1ZSc6ICdMJ30sIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKLSAgICAgICAgYyA9IHN0ci5fX25ld19fKFNpbmdsZUNoYXIsIGNocig3NikpCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGMpCi0gICAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBvdXRwdXQKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvdGVzdF9ncmFwaC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvdGVzdF9ncmFwaC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4NDlmNi4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvc3RydWN0dXJlL3Rlc3RfZ3JhcGgucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1fX2F1dGhvcl9fID0gJ01hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSknCi0KLWltcG9ydCBzaXgKLQotZnJvbSBncmVtbGluX3B5dGhvbi5zdGF0aWNzIGltcG9ydCBsb25nCi1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgRWRnZQotZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFByb3BlcnR5Ci1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgVmVydGV4Ci1mcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgVmVydGV4UHJvcGVydHkKLWZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBQYXRoCi0KLQotY2xhc3MgVGVzdEdyYXBoKG9iamVjdCk6Ci0gICAgZGVmIHRlc3RfZ3JhcGhfb2JqZWN0cyhzZWxmKToKLSAgICAgICAgdmVydGV4ID0gVmVydGV4KDEpCi0gICAgICAgIGFzc2VydCAidlsxXSIgPT0gc3RyKHZlcnRleCkKLSAgICAgICAgYXNzZXJ0ICJ2ZXJ0ZXgiID09IHZlcnRleC5sYWJlbAotICAgICAgICBhc3NlcnQgInBlcnNvbiIgPT0gVmVydGV4KDEsICJwZXJzb24iKS5sYWJlbAotICAgICAgICBhc3NlcnQgdmVydGV4ID09IFZlcnRleCgxKQotICAgICAgICAjCi0gICAgICAgIGVkZ2UgPSBFZGdlKDIsIFZlcnRleCgxKSwgInNhaWQiLCBWZXJ0ZXgoImhlbGxvIiwgInBocmFzZSIpKQotICAgICAgICBhc3NlcnQgImVbMl1bMS1zYWlkLT5oZWxsb10iID09IHN0cihlZGdlKQotICAgICAgICBhc3NlcnQgVmVydGV4KDEpID09IGVkZ2Uub3V0VgotICAgICAgICBhc3NlcnQgVmVydGV4KCJoZWxsbyIpID09IGVkZ2UuaW5WCi0gICAgICAgIGFzc2VydCAic2FpZCIgPT0gZWRnZS5sYWJlbAotICAgICAgICBhc3NlcnQgInBocmFzZSIgPT0gZWRnZS5pblYubGFiZWwKLSAgICAgICAgYXNzZXJ0IGVkZ2UuaW5WICE9IGVkZ2Uub3V0VgotICAgICAgICAjCi0gICAgICAgIHZlcnRleF9wcm9wZXJ0eSA9IFZlcnRleFByb3BlcnR5KGxvbmcoMjQpLCAibmFtZSIsICJtYXJrbyIsIFZlcnRleCgxKSkKLSAgICAgICAgYXNzZXJ0ICJ2cFtuYW1lLT5tYXJrb10iID09IHN0cih2ZXJ0ZXhfcHJvcGVydHkpCi0gICAgICAgIGFzc2VydCAibmFtZSIgPT0gdmVydGV4X3Byb3BlcnR5LmxhYmVsCi0gICAgICAgIGFzc2VydCAibmFtZSIgPT0gdmVydGV4X3Byb3BlcnR5LmtleQotICAgICAgICBhc3NlcnQgIm1hcmtvIiA9PSB2ZXJ0ZXhfcHJvcGVydHkudmFsdWUKLSAgICAgICAgYXNzZXJ0IGxvbmcoMjQpID09IHZlcnRleF9wcm9wZXJ0eS5pZAotICAgICAgICBhc3NlcnQgVmVydGV4KDEpID09IHZlcnRleF9wcm9wZXJ0eS52ZXJ0ZXgKLSAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4X3Byb3BlcnR5LmlkLCBsb25nKQotICAgICAgICBhc3NlcnQgdmVydGV4X3Byb3BlcnR5ID09IFZlcnRleFByb3BlcnR5KGxvbmcoMjQpLCAibmFtZSIsICJtYXJrbyIsIFZlcnRleCgxKSkKLSAgICAgICAgIwotICAgICAgICBwcm9wZXJ0eSA9IFByb3BlcnR5KCJhZ2UiLCAyOSwgVmVydGV4KDEpKQotICAgICAgICBhc3NlcnQgInBbYWdlLT4yOV0iID09IHN0cihwcm9wZXJ0eSkKLSAgICAgICAgYXNzZXJ0ICJhZ2UiID09IHByb3BlcnR5LmtleQotICAgICAgICBhc3NlcnQgMjkgPT0gcHJvcGVydHkudmFsdWUKLSAgICAgICAgYXNzZXJ0IFZlcnRleCgxKSA9PSBwcm9wZXJ0eS5lbGVtZW50Ci0gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHByb3BlcnR5LnZhbHVlLCBpbnQpCi0gICAgICAgIGFzc2VydCBwcm9wZXJ0eSA9PSBQcm9wZXJ0eSgiYWdlIiwgMjksIFZlcnRleCgxKSkKLSAgICAgICAgaWYgbm90IHNpeC5QWTM6Ci0gICAgICAgICAgICBhc3NlcnQgcHJvcGVydHkgIT0gUHJvcGVydHkoImFnZSIsIGxvbmcoMjkpLCBWZXJ0ZXgoMSkpCi0gICAgICAgICMKLSAgICAgICAgZm9yIGkgaW4gW3ZlcnRleCwgZWRnZSwgdmVydGV4X3Byb3BlcnR5LCBwcm9wZXJ0eV06Ci0gICAgICAgICAgICBmb3IgaiBpbiBbdmVydGV4LCBlZGdlLCB2ZXJ0ZXhfcHJvcGVydHksIHByb3BlcnR5XToKLSAgICAgICAgICAgICAgICBpZiB0eXBlKGkpICE9IHR5cGUoaik6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBpICE9IGoKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaSA9PSBqCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBpLl9faGFzaF9fKCkgPT0gaGFzaChpKQotCi0gICAgZGVmIHRlc3RfcGF0aChzZWxmKToKLSAgICAgICAgcGF0aCA9IFBhdGgoW3NldChbImEiLCAiYiJdKSwgc2V0KFsiYyIsICJiIl0pLCBzZXQoW10pXSwgWzEsIFZlcnRleCgxKSwgImhlbGxvIl0pCi0gICAgICAgIGFzc2VydCAicGF0aFsxLCB2WzFdLCBoZWxsb10iID09IHN0cihwYXRoKQotICAgICAgICBhc3NlcnQgMSA9PSBwYXRoWyJhIl0KLSAgICAgICAgYXNzZXJ0IFZlcnRleCgxKSA9PSBwYXRoWyJjIl0KLSAgICAgICAgYXNzZXJ0IFsxLCBWZXJ0ZXgoMSldID09IHBhdGhbImIiXQotICAgICAgICBhc3NlcnQgcGF0aFswXSA9PSAxCi0gICAgICAgIGFzc2VydCBwYXRoWzFdID09IFZlcnRleCgxKQotICAgICAgICBhc3NlcnQgcGF0aFsyXSA9PSAiaGVsbG8iCi0gICAgICAgIGFzc2VydCAzID09IGxlbihwYXRoKQotICAgICAgICBhc3NlcnQgImhlbGxvIiBpbiBwYXRoCi0gICAgICAgIGFzc2VydCAiZ29vZGJ5ZSIgbm90IGluIHBhdGgKLSAgICAgICAgYXNzZXJ0IFZlcnRleCgxKSBpbiBwYXRoCi0gICAgICAgIGFzc2VydCBWZXJ0ZXgoMTIzKSBub3QgaW4gcGF0aAotICAgICAgICAjCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlbXAgPSBwYXRoWzNdCi0gICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkFjY2Vzc2luZyBiZXlvbmQgdGhlIGxpc3QgaW5kZXggc2hvdWxkIHRocm93IGFuIGluZGV4IGVycm9yIikKLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgICMKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVtcCA9IHBhdGhbInp6Il0KLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQWNjZXNzaW5nIG5vdGhpbmcgc2hvdWxkIHRocm93IGEga2V5IGVycm9yIikKLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICAjCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlbXAgPSBwYXRoWzE6Ml0KLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQWNjZXNzaW5nIHVzaW5nIHNsaWNlcyBzaG91bGQgdGhyb3cgYSB0eXBlIGVycm9yIikKLSAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgIwotICAgICAgICBhc3NlcnQgcGF0aCA9PSBwYXRoCi0gICAgICAgIGFzc2VydCBoYXNoKHBhdGgpID09IGhhc2gocGF0aCkKLSAgICAgICAgcGF0aDIgPSBQYXRoKFtzZXQoWyJhIiwgImIiXSksIHNldChbImMiLCAiYiJdKSwgc2V0KFtdKV0sIFsxLCBWZXJ0ZXgoMSksICJoZWxsbyJdKQotICAgICAgICBhc3NlcnQgcGF0aCA9PSBwYXRoMgotICAgICAgICBhc3NlcnQgaGFzaChwYXRoKSA9PSBoYXNoKHBhdGgyKQotICAgICAgICBhc3NlcnQgcGF0aCAhPSBQYXRoKFtzZXQoWyJhIl0pLCBzZXQoWyJjIiwgImIiXSksIHNldChbXSldLCBbMSwgVmVydGV4KDEpLCAiaGVsbG8iXSkKLSAgICAgICAgYXNzZXJ0IHBhdGggIT0gUGF0aChbc2V0KFsiYSIsICJiIl0pLCBzZXQoWyJjIiwgImIiXSksIHNldChbXSldLCBbMywgVmVydGV4KDEpLCAiaGVsbG8iXSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9MSUNFTlNFIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL0xJQ0VOU0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9MSUNFTlNFCnJlbmFtZSB0byBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vTElDRU5TRQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL01BTklGRVNULmluIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL01BTklGRVNULmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vTUFOSUZFU1QuaW4KcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9NQU5JRkVTVC5pbgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL05PVElDRSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9OT1RJQ0UKcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9OT1RJQ0UKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9SRUFETUUucnN0IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL1JFQURNRS5yc3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9SRUFETUUucnN0CnJlbmFtZSB0byBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vUkVBRE1FLnJzdApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2V4YW1wbGUucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZXhhbXBsZS5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2V4YW1wbGUucHkKcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9leGFtcGxlLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vX19pbml0X18ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9fX2luaXRfXy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL19faW5pdF9fLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9fX2luaXRfXy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9jbGllbnQucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL2NsaWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhkZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9jbGllbnQucHkKQEAgLTAsMCArMSwxNDcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitmcm9tIGNvbmN1cnJlbnQuZnV0dXJlcyBpbXBvcnQgVGhyZWFkUG9vbEV4ZWN1dG9yCisKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQorCitmcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlciBpbXBvcnQgY29ubmVjdGlvbiwgcHJvdG9jb2wsIHJlcXVlc3QsIHNlcmlhbGl6ZXIKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2VzcyBpbXBvcnQgdHJhdmVyc2FsCisKKyMgVGhpcyBpcyB1bnRpbCBjb25jdXJyZW50LmZ1dHVyZXMgYmFja3BvcnQgMy4xLjAgcmVsZWFzZQordHJ5OgorICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBjcHVfY291bnQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIHNvbWUgcGxhdGZvcm1zIGRvbid0IGhhdmUgbXVsdGlwcm9jZXNzaW5nCisgICAgZGVmIGNwdV9jb3VudCgpOgorICAgICAgICByZXR1cm4gTm9uZQorCitfX2F1dGhvcl9fID0gJ0RhdmlkIE0uIEJyb3duIChkYXZlYnNob3dAZ21haWwuY29tKScKKworCitjbGFzcyBDbGllbnQ6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCB0cmF2ZXJzYWxfc291cmNlLCBwcm90b2NvbF9mYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9mYWN0b3J5PU5vbmUsIHBvb2xfc2l6ZT1Ob25lLCBtYXhfd29ya2Vycz1Ob25lLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9Tm9uZSwgdXNlcm5hbWU9IiIsIHBhc3N3b3JkPSIiLAorICAgICAgICAgICAgICAgICBrZXJiZXJpemVkX3NlcnZpY2U9IiIsIGhlYWRlcnM9Tm9uZSwgc2Vzc2lvbj0iIik6CisgICAgICAgIHNlbGYuX3VybCA9IHVybAorICAgICAgICBzZWxmLl9oZWFkZXJzID0gaGVhZGVycworICAgICAgICBzZWxmLl90cmF2ZXJzYWxfc291cmNlID0gdHJhdmVyc2FsX3NvdXJjZQorICAgICAgICBpZiBtZXNzYWdlX3NlcmlhbGl6ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplciA9IHNlcmlhbGl6ZXIuR3JhcGhTT05TZXJpYWxpemVyc1YzZDAoKQorICAgICAgICBzZWxmLl9tZXNzYWdlX3NlcmlhbGl6ZXIgPSBtZXNzYWdlX3NlcmlhbGl6ZXIKKyAgICAgICAgc2VsZi5fdXNlcm5hbWUgPSB1c2VybmFtZQorICAgICAgICBzZWxmLl9wYXNzd29yZCA9IHBhc3N3b3JkCisgICAgICAgIHNlbGYuX3Nlc3Npb24gPSBzZXNzaW9uCisgICAgICAgIHNlbGYuX3Nlc3Npb25FbmFibGVkID0gKHNlc3Npb24gIT0gIiIpCisgICAgICAgIGlmIHRyYW5zcG9ydF9mYWN0b3J5IGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIudG9ybmFkby50cmFuc3BvcnQgaW1wb3J0ICgKKyAgICAgICAgICAgICAgICAgICAgVG9ybmFkb1RyYW5zcG9ydCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlBsZWFzZSBpbnN0YWxsIFRvcm5hZG8gb3IgcGFzcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1c3RvbSB0cmFuc3BvcnQgZmFjdG9yeSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gbGFtYmRhOiBUb3JuYWRvVHJhbnNwb3J0KCkKKyAgICAgICAgc2VsZi5fdHJhbnNwb3J0X2ZhY3RvcnkgPSB0cmFuc3BvcnRfZmFjdG9yeQorICAgICAgICBpZiBwcm90b2NvbF9mYWN0b3J5IGlzIE5vbmU6CisgICAgICAgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gbGFtYmRhOiBwcm90b2NvbC5HcmVtbGluU2VydmVyV1NQcm90b2NvbCgKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNzYWdlX3NlcmlhbGl6ZXIsCisgICAgICAgICAgICAgICAgdXNlcm5hbWU9c2VsZi5fdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgcGFzc3dvcmQ9c2VsZi5fcGFzc3dvcmQsCisgICAgICAgICAgICAgICAga2VyYmVyaXplZF9zZXJ2aWNlPWtlcmJlcml6ZWRfc2VydmljZSkKKyAgICAgICAgc2VsZi5fcHJvdG9jb2xfZmFjdG9yeSA9IHByb3RvY29sX2ZhY3RvcnkKKyAgICAgICAgaWYgc2VsZi5fc2Vzc2lvbkVuYWJsZWQ6CisgICAgICAgICAgICBpZiBwb29sX3NpemUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwb29sX3NpemUgPSAxCisgICAgICAgICAgICBlbGlmIHBvb2xfc2l6ZSAhPSAxOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiUG9vbFNpemUgbXVzdCBiZSAxIG9uIHNlc3Npb24gbW9kZSEiKQorICAgICAgICBpZiBwb29sX3NpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHBvb2xfc2l6ZSA9IDQKKyAgICAgICAgc2VsZi5fcG9vbF9zaXplID0gcG9vbF9zaXplCisgICAgICAgICMgVGhpcyBpcyB1bnRpbCBjb25jdXJyZW50LmZ1dHVyZXMgYmFja3BvcnQgMy4xLjAgcmVsZWFzZQorICAgICAgICBpZiBtYXhfd29ya2VycyBpcyBOb25lOgorICAgICAgICAgICAgIyBJZiB5b3VyIGFwcGxpY2F0aW9uIGlzIG92ZXJsYXBwaW5nIEdyZW1saW4gSS9PIG9uIG11bHRpcGxlIHRocmVhZHMKKyAgICAgICAgICAgICMgY29uc2lkZXIgcGFzc2luZyBrd2FyZyBtYXhfd29ya2VycyA9IChjcHVfY291bnQoKSBvciAxKSAqIDUKKyAgICAgICAgICAgIG1heF93b3JrZXJzID0gcG9vbF9zaXplCisgICAgICAgIHNlbGYuX2V4ZWN1dG9yID0gVGhyZWFkUG9vbEV4ZWN1dG9yKG1heF93b3JrZXJzPW1heF93b3JrZXJzKQorICAgICAgICAjIFRocmVhZHNhZmUgcXVldWUKKyAgICAgICAgc2VsZi5fcG9vbCA9IHF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi5fZmlsbF9wb29sKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBhdmFpbGFibGVfcG9vbF9zaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcG9vbC5xc2l6ZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZXhlY3V0b3Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9leGVjdXRvcgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHRyYXZlcnNhbF9zb3VyY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmF2ZXJzYWxfc291cmNlCisKKyAgICBkZWYgX2ZpbGxfcG9vbChzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5fcG9vbF9zaXplKToKKyAgICAgICAgICAgIGNvbm4gPSBzZWxmLl9nZXRfY29ubmVjdGlvbigpCisgICAgICAgICAgICBzZWxmLl9wb29sLnB1dF9ub3dhaXQoY29ubikKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fc2Vzc2lvbkVuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLl9jbG9zZV9zZXNzaW9uKCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuX3Bvb2wuZW1wdHkoKToKKyAgICAgICAgICAgIGNvbm4gPSBzZWxmLl9wb29sLmdldChUcnVlKQorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIHNlbGYuX2V4ZWN1dG9yLnNodXRkb3duKCkKKworICAgIGRlZiBfY2xvc2Vfc2Vzc2lvbihzZWxmKToKKyAgICAgICAgbWVzc2FnZSA9IHJlcXVlc3QuUmVxdWVzdE1lc3NhZ2UoCisgICAgICAgICAgICBwcm9jZXNzb3I9J3Nlc3Npb24nLCBvcD0nY2xvc2UnLAorICAgICAgICAgICAgYXJncz17J3Nlc3Npb24nOiBzZWxmLl9zZXNzaW9ufSkKKyAgICAgICAgY29ubiA9IHNlbGYuX3Bvb2wuZ2V0KFRydWUpCisgICAgICAgIHJldHVybiBjb25uLndyaXRlKG1lc3NhZ2UpLnJlc3VsdCgpCisKKyAgICBkZWYgX2dldF9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICBwcm90b2NvbCA9IHNlbGYuX3Byb3RvY29sX2ZhY3RvcnkoKQorICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5Db25uZWN0aW9uKAorICAgICAgICAgICAgc2VsZi5fdXJsLCBzZWxmLl90cmF2ZXJzYWxfc291cmNlLCBwcm90b2NvbCwKKyAgICAgICAgICAgIHNlbGYuX3RyYW5zcG9ydF9mYWN0b3J5LCBzZWxmLl9leGVjdXRvciwgc2VsZi5fcG9vbCwKKyAgICAgICAgICAgIGhlYWRlcnM9c2VsZi5faGVhZGVycykKKworICAgIGRlZiBzdWJtaXQoc2VsZiwgbWVzc2FnZSwgYmluZGluZ3M9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLnN1Ym1pdEFzeW5jKG1lc3NhZ2UsIGJpbmRpbmdzPWJpbmRpbmdzKS5yZXN1bHQoKQorCisgICAgZGVmIHN1Ym1pdEFzeW5jKHNlbGYsIG1lc3NhZ2UsIGJpbmRpbmdzPU5vbmUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIHRyYXZlcnNhbC5CeXRlY29kZSk6CisgICAgICAgICAgICBtZXNzYWdlID0gcmVxdWVzdC5SZXF1ZXN0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3I9J3RyYXZlcnNhbCcsIG9wPSdieXRlY29kZScsCisgICAgICAgICAgICAgICAgYXJncz17J2dyZW1saW4nOiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICdhbGlhc2VzJzogeydnJzogc2VsZi5fdHJhdmVyc2FsX3NvdXJjZX19KQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgc3RyKToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSByZXF1ZXN0LlJlcXVlc3RNZXNzYWdlKAorICAgICAgICAgICAgICAgIHByb2Nlc3Nvcj0nJywgb3A9J2V2YWwnLAorICAgICAgICAgICAgICAgIGFyZ3M9eydncmVtbGluJzogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAnYWxpYXNlcyc6IHsnZyc6IHNlbGYuX3RyYXZlcnNhbF9zb3VyY2V9fSkKKyAgICAgICAgICAgIGlmIGJpbmRpbmdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJncy51cGRhdGUoeydiaW5kaW5ncyc6IGJpbmRpbmdzfSkKKyAgICAgICAgICAgIGlmIHNlbGYuX3Nlc3Npb25FbmFibGVkOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLl9yZXBsYWNlKHByb2Nlc3Nvcj0nc2Vzc2lvbicpCisgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmdzLnVwZGF0ZSh7J3Nlc3Npb24nOiBzZWxmLl9zZXNzaW9ufSkKKyAgICAgICAgY29ubiA9IHNlbGYuX3Bvb2wuZ2V0KFRydWUpCisgICAgICAgIHJldHVybiBjb25uLndyaXRlKG1lc3NhZ2UpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL2Nvbm5lY3Rpb24ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL2Nvbm5lY3Rpb24ucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvY29ubmVjdGlvbi5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9jb25uZWN0aW9uLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL2RyaXZlcl9yZW1vdGVfY29ubmVjdGlvbi5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvZHJpdmVyX3JlbW90ZV9jb25uZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNjE3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL2RyaXZlcl9yZW1vdGVfY29ubmVjdGlvbi5weQpAQCAtMCwwICsxLDczIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworZnJvbSBjb25jdXJyZW50LmZ1dHVyZXMgaW1wb3J0IEZ1dHVyZQorCitmcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlciBpbXBvcnQgY2xpZW50LCBzZXJpYWxpemVyCitmcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5yZW1vdGVfY29ubmVjdGlvbiBpbXBvcnQgKAorICAgIFJlbW90ZUNvbm5lY3Rpb24sIFJlbW90ZVRyYXZlcnNhbCkKKworX19hdXRob3JfXyA9ICdEYXZpZCBNLiBCcm93biAoZGF2ZWJzaG93QGdtYWlsLmNvbSknCisKKworY2xhc3MgRHJpdmVyUmVtb3RlQ29ubmVjdGlvbihSZW1vdGVDb25uZWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIHRyYXZlcnNhbF9zb3VyY2UsIHByb3RvY29sX2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X2ZhY3Rvcnk9Tm9uZSwgcG9vbF9zaXplPU5vbmUsIG1heF93b3JrZXJzPU5vbmUsCisgICAgICAgICAgICAgICAgIHVzZXJuYW1lPSIiLCBwYXNzd29yZD0iIiwga2VyYmVyaXplZF9zZXJ2aWNlPScnLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9Tm9uZSwgZ3JhcGhzb25fcmVhZGVyPU5vbmUsCisgICAgICAgICAgICAgICAgIGdyYXBoc29uX3dyaXRlcj1Ob25lLCBoZWFkZXJzPU5vbmUpOgorICAgICAgICBpZiBtZXNzYWdlX3NlcmlhbGl6ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplciA9IHNlcmlhbGl6ZXIuR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplcigKKyAgICAgICAgICAgICAgICByZWFkZXI9Z3JhcGhzb25fcmVhZGVyLAorICAgICAgICAgICAgICAgIHdyaXRlcj1ncmFwaHNvbl93cml0ZXIpCisgICAgICAgIHNlbGYuX2NsaWVudCA9IGNsaWVudC5DbGllbnQodXJsLCB0cmF2ZXJzYWxfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2ZhY3Rvcnk9cHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfZmFjdG9yeT10cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sX3NpemU9cG9vbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF93b3JrZXJzPW1heF93b3JrZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplcj1tZXNzYWdlX3NlcmlhbGl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU9dXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9cGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VyYmVyaXplZF9zZXJ2aWNlPWtlcmJlcml6ZWRfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMpCisgICAgICAgIHNlbGYuX3VybCA9IHNlbGYuX2NsaWVudC5fdXJsCisgICAgICAgIHNlbGYuX3RyYXZlcnNhbF9zb3VyY2UgPSBzZWxmLl9jbGllbnQuX3RyYXZlcnNhbF9zb3VyY2UKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fY2xpZW50LmNsb3NlKCkKKworICAgIGRlZiBzdWJtaXQoc2VsZiwgYnl0ZWNvZGUpOgorICAgICAgICByZXN1bHRfc2V0ID0gc2VsZi5fY2xpZW50LnN1Ym1pdChieXRlY29kZSkKKyAgICAgICAgcmVzdWx0cyA9IHJlc3VsdF9zZXQuYWxsKCkucmVzdWx0KCkKKyAgICAgICAgcmV0dXJuIFJlbW90ZVRyYXZlcnNhbChpdGVyKHJlc3VsdHMpKQorCisgICAgZGVmIHN1Ym1pdEFzeW5jKHNlbGYsIGJ5dGVjb2RlKToKKyAgICAgICAgZnV0dXJlID0gRnV0dXJlKCkKKyAgICAgICAgZnV0dXJlX3Jlc3VsdF9zZXQgPSBzZWxmLl9jbGllbnQuc3VibWl0QXN5bmMoYnl0ZWNvZGUpCisKKyAgICAgICAgZGVmIGNiKGYpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdF9zZXQgPSBmLnJlc3VsdCgpCisgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdF9zZXQuYWxsKCkucmVzdWx0KCkKKyAgICAgICAgICAgICAgICBmdXR1cmUuc2V0X3Jlc3VsdChSZW1vdGVUcmF2ZXJzYWwoaXRlcihyZXN1bHRzKSkpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKKworICAgICAgICBmdXR1cmVfcmVzdWx0X3NldC5hZGRfZG9uZV9jYWxsYmFjayhjYikKKyAgICAgICAgcmV0dXJuIGZ1dHVyZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9wcm90b2NvbC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvcHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NzNiOAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvcHJvdG9jb2wucHkKQEAgLTAsMCArMSwxODUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2ltcG9ydCBhYmMKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBzdHJ1Y3QKKworIyBpbXBvcnQga2VyYmVyb3MgICAgT3B0aW9uYWwgZGVwZW5kZW5jeSBpbXBvcnRlZCBpbiByZWxldmFudCBjb2RlYmxvY2sKK2ltcG9ydCBzaXgKKwordHJ5OgorICAgIGltcG9ydCB1anNvbiBhcyBqc29uCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGpzb24KKworZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIgaW1wb3J0IHJlcXVlc3QKK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLnJlc3VsdHNldCBpbXBvcnQgUmVzdWx0U2V0CisKK19fYXV0aG9yX18gPSAnRGF2aWQgTS4gQnJvd24gKGRhdmVic2hvd0BnbWFpbC5jb20pJworCisKK2NsYXNzIEdyZW1saW5TZXJ2ZXJFcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGF0dXMpOgorICAgICAgICBzdXBlcihHcmVtbGluU2VydmVyRXJyb3IsIHNlbGYpLl9faW5pdF9fKCd7MH06IHsxfScuZm9ybWF0KHN0YXR1c1snY29kZSddLCBzdGF0dXNbJ21lc3NhZ2UnXSkpCisgICAgICAgIHNlbGYuX3N0YXR1c19hdHRyaWJ1dGVzID0gc3RhdHVzWydhdHRyaWJ1dGVzJ10KKyAgICAgICAgc2VsZi5zdGF0dXNfY29kZSA9IHN0YXR1c1snY29kZSddCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RhdHVzX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zdGF0dXNfYXR0cmlidXRlcworCisKK2NsYXNzIENvbmZpZ3VyYXRpb25FcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoYWJjLkFCQ01ldGEpCitjbGFzcyBBYnN0cmFjdEJhc2VQcm90b2NvbDoKKworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgY29ubmVjdGlvbl9tYWRlKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydAorCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBkYXRhX3JlY2VpdmVkKHNlbGYsIG1lc3NhZ2UsIHJlc3VsdHNfZGljdCk6CisgICAgICAgIHBhc3MKKworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgd3JpdGUoc2VsZiwgcmVxdWVzdF9pZCwgcmVxdWVzdF9tZXNzYWdlKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEdyZW1saW5TZXJ2ZXJXU1Byb3RvY29sKEFic3RyYWN0QmFzZVByb3RvY29sKToKKworICAgIE1BWF9DT05URU5UX0xFTkdUSCA9IDY1NTM2CisgICAgUU9QX0FVVEhfQklUID0gMQorICAgIF9rZXJiZXJvc19jb250ZXh0ID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2Vfc2VyaWFsaXplciwgdXNlcm5hbWU9JycsIHBhc3N3b3JkPScnLCBrZXJiZXJpemVkX3NlcnZpY2U9JycpOgorICAgICAgICBzZWxmLl9tZXNzYWdlX3NlcmlhbGl6ZXIgPSBtZXNzYWdlX3NlcmlhbGl6ZXIKKyAgICAgICAgc2VsZi5fdXNlcm5hbWUgPSB1c2VybmFtZQorICAgICAgICBzZWxmLl9wYXNzd29yZCA9IHBhc3N3b3JkCisgICAgICAgIHNlbGYuX2tlcmJlcml6ZWRfc2VydmljZSA9IGtlcmJlcml6ZWRfc2VydmljZQorCisgICAgZGVmIGNvbm5lY3Rpb25fbWFkZShzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICBzdXBlcihHcmVtbGluU2VydmVyV1NQcm90b2NvbCwgc2VsZikuY29ubmVjdGlvbl9tYWRlKHRyYW5zcG9ydCkKKworICAgIGRlZiB3cml0ZShzZWxmLCByZXF1ZXN0X2lkLCByZXF1ZXN0X21lc3NhZ2UpOgorICAgICAgICBtZXNzYWdlID0gc2VsZi5fbWVzc2FnZV9zZXJpYWxpemVyLnNlcmlhbGl6ZV9tZXNzYWdlKAorICAgICAgICAgICAgcmVxdWVzdF9pZCwgcmVxdWVzdF9tZXNzYWdlKQorICAgICAgICBzZWxmLl90cmFuc3BvcnQud3JpdGUobWVzc2FnZSkKKworICAgIGRlZiBkYXRhX3JlY2VpdmVkKHNlbGYsIG1lc3NhZ2UsIHJlc3VsdHNfZGljdCk6CisgICAgICAgICMgaWYgR3JlbWxpbiBTZXJ2ZXIgY3V0cyBvZmYgdGhlbiB3ZSBnZXQgYSBOb25lIGZvciB0aGUgbWVzc2FnZQorICAgICAgICBpZiBtZXNzYWdlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBHcmVtbGluU2VydmVyRXJyb3Ioeydjb2RlJzogNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6ICdTZXJ2ZXIgZGlzY29ubmVjdGVkIC0gcGxlYXNlIHRyeSB0byByZWNvbm5lY3QnLCAnYXR0cmlidXRlcyc6IHt9fSkKKworICAgICAgICBtZXNzYWdlID0gc2VsZi5fbWVzc2FnZV9zZXJpYWxpemVyLmRlc2VyaWFsaXplX21lc3NhZ2UobWVzc2FnZSkKKyAgICAgICAgcmVxdWVzdF9pZCA9IG1lc3NhZ2VbJ3JlcXVlc3RJZCddCisgICAgICAgIHJlc3VsdF9zZXQgPSByZXN1bHRzX2RpY3RbcmVxdWVzdF9pZF0gaWYgcmVxdWVzdF9pZCBpbiByZXN1bHRzX2RpY3QgZWxzZSBSZXN1bHRTZXQoTm9uZSwgTm9uZSkKKyAgICAgICAgc3RhdHVzX2NvZGUgPSBtZXNzYWdlWydzdGF0dXMnXVsnY29kZSddCisgICAgICAgIGFnZ3JlZ2F0ZV90byA9IG1lc3NhZ2VbJ3Jlc3VsdCddWydtZXRhJ10uZ2V0KCdhZ2dyZWdhdGVUbycsICdsaXN0JykKKyAgICAgICAgZGF0YSA9IG1lc3NhZ2VbJ3Jlc3VsdCddWydkYXRhJ10KKyAgICAgICAgcmVzdWx0X3NldC5hZ2dyZWdhdGVfdG8gPSBhZ2dyZWdhdGVfdG8KKyAgICAgICAgaWYgc3RhdHVzX2NvZGUgPT0gNDA3OgorICAgICAgICAgICAgaWYgc2VsZi5fdXNlcm5hbWUgYW5kIHNlbGYuX3Bhc3N3b3JkOgorICAgICAgICAgICAgICAgIGF1dGhfYnl0ZXMgPSBiJycuam9pbihbYidceDAwJywgc2VsZi5fdXNlcm5hbWUuZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYidceDAwJywgc2VsZi5fcGFzc3dvcmQuZW5jb2RlKCd1dGYtOCcpXSkKKyAgICAgICAgICAgICAgICBhdXRoID0gYmFzZTY0LmI2NGVuY29kZShhdXRoX2J5dGVzKQorICAgICAgICAgICAgICAgIHJlcXVlc3RfbWVzc2FnZSA9IHJlcXVlc3QuUmVxdWVzdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICd0cmF2ZXJzYWwnLCAnYXV0aGVudGljYXRpb24nLCB7J3Nhc2wnOiBhdXRoLmRlY29kZSgpfSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fa2VyYmVyaXplZF9zZXJ2aWNlOgorICAgICAgICAgICAgICAgIHJlcXVlc3RfbWVzc2FnZSA9IHNlbGYuX2tlcmJlcm9zX3JlY2VpdmVkKG1lc3NhZ2UpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbmZpZ3VyYXRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ0dyZW1saW4gc2VydmVyIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGluIERyaXZlclJlbW90ZUNvbm5lY3Rpb24uJworICAgICAgICAgICAgICAgICAgICAnRm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiAnCisgICAgICAgICAgICAgICAgICAgICdGb3Iga2VyYmVyb3MgYXV0aGVudGljYXRpb24gcHJvdmlkZSB0aGUga2VyYmVyaXplZF9zZXJ2aWNlIHBhcmFtZXRlci4nKQorICAgICAgICAgICAgc2VsZi53cml0ZShyZXF1ZXN0X2lkLCByZXF1ZXN0X21lc3NhZ2UpCisgICAgICAgICAgICBkYXRhID0gc2VsZi5fdHJhbnNwb3J0LnJlYWQoKQorICAgICAgICAgICAgIyBBbGxvdyBmb3IgYXV0aCBoYW5kc2hha2Ugd2l0aCBtdWx0aXBsZSBzdGVwcworICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YV9yZWNlaXZlZChkYXRhLCByZXN1bHRzX2RpY3QpCisgICAgICAgIGVsaWYgc3RhdHVzX2NvZGUgPT0gMjA0OgorICAgICAgICAgICAgcmVzdWx0X3NldC5zdHJlYW0ucHV0X25vd2FpdChbXSkKKyAgICAgICAgICAgIGRlbCByZXN1bHRzX2RpY3RbcmVxdWVzdF9pZF0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXNfY29kZQorICAgICAgICBlbGlmIHN0YXR1c19jb2RlIGluIFsyMDAsIDIwNl06CisgICAgICAgICAgICByZXN1bHRfc2V0LnN0cmVhbS5wdXRfbm93YWl0KGRhdGEpCisgICAgICAgICAgICBpZiBzdGF0dXNfY29kZSA9PSAyMDA6CisgICAgICAgICAgICAgICAgcmVzdWx0X3NldC5zdGF0dXNfYXR0cmlidXRlcyA9IG1lc3NhZ2VbJ3N0YXR1cyddWydhdHRyaWJ1dGVzJ10KKyAgICAgICAgICAgICAgICBkZWwgcmVzdWx0c19kaWN0W3JlcXVlc3RfaWRdCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzX2NvZGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlbCByZXN1bHRzX2RpY3RbcmVxdWVzdF9pZF0KKyAgICAgICAgICAgIHJhaXNlIEdyZW1saW5TZXJ2ZXJFcnJvcihtZXNzYWdlWydzdGF0dXMnXSkKKworICAgIGRlZiBfa2VyYmVyb3NfcmVjZWl2ZWQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICMgSW5zcGlyZWQgYnk6IGh0dHBzOi8vZ2l0aHViLmNvbS90aG9iYnMvcHVyZS1zYXNsL2Jsb2IvMC42LjIvcHVyZXNhc2wvbWVjaGFuaXNtcy5weQorICAgICAgICAjICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vdGhvYmJzL3B1cmUtc2FzbC9ibG9iLzAuNi4yL0xJQ0VOU0UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGtlcmJlcm9zCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCdQbGVhc2UgaW5zdGFsbCBncmVtbGlucHl0aG9uW2tlcmJlcm9zXS4nKQorCisgICAgICAgICMgRmlyc3QgcGFzczogZ2V0IHNlcnZpY2UgZ3JhbnRpbmcgdGlja2V0IGFuZCByZXR1cm4gaXQgdG8gZ3JlbWxpbi1zZXJ2ZXIKKyAgICAgICAgaWYgbm90IHNlbGYuX2tlcmJlcm9zX2NvbnRleHQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgXywga2VyYmVyb3NfY29udGV4dCA9IGtlcmJlcm9zLmF1dGhHU1NDbGllbnRJbml0KAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9rZXJiZXJpemVkX3NlcnZpY2UsIGdzc2ZsYWdzPWtlcmJlcm9zLkdTU19DX01VVFVBTF9GTEFHKQorICAgICAgICAgICAgICAgIGtlcmJlcm9zLmF1dGhHU1NDbGllbnRTdGVwKGtlcmJlcm9zX2NvbnRleHQsICcnKQorICAgICAgICAgICAgICAgIGF1dGggPSBrZXJiZXJvcy5hdXRoR1NTQ2xpZW50UmVzcG9uc2Uoa2VyYmVyb3NfY29udGV4dCkKKyAgICAgICAgICAgICAgICBzZWxmLl9rZXJiZXJvc19jb250ZXh0ID0ga2VyYmVyb3NfY29udGV4dAorICAgICAgICAgICAgZXhjZXB0IGtlcmJlcm9zLktyYkVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29uZmlndXJhdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAnS2VyYmVyb3MgYXV0aGVudGljYXRpb24gcmVxdWlyZXMgYSB2YWxpZCBzZXJ2aWNlIG5hbWUgaW4gRHJpdmVyUmVtb3RlQ29ubmVjdGlvbiwgJworICAgICAgICAgICAgICAgICAgICAnYXMgd2VsbCBhcyBhIHZhbGlkIHRndCAoZXhwb3J0IEtSQjVDQ05BTUUpIG9yIGtleXRhYiAoZXhwb3J0IEtSQjVfS1ROQU1FKTogJyArIHN0cihlKSkKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LlJlcXVlc3RNZXNzYWdlKCcnLCAnYXV0aGVudGljYXRpb24nLCB7J3Nhc2wnOiBhdXRofSkKKworICAgICAgICAjIFNlY29uZCBwYXNzOiBjb21wbGV0aW9uIG9mIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIHNhc2xfcmVzcG9uc2UgPSBtZXNzYWdlWydzdGF0dXMnXVsnYXR0cmlidXRlcyddWydzYXNsJ10KKyAgICAgICAgaWYgbm90IHNlbGYuX3VzZXJuYW1lOgorICAgICAgICAgICAgcmVzdWx0X2NvZGUgPSBrZXJiZXJvcy5hdXRoR1NTQ2xpZW50U3RlcChzZWxmLl9rZXJiZXJvc19jb250ZXh0LCBzYXNsX3Jlc3BvbnNlKQorICAgICAgICAgICAgaWYgcmVzdWx0X2NvZGUgPT0ga2VyYmVyb3MuQVVUSF9HU1NfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgc2VsZi5fdXNlcm5hbWUgPSBrZXJiZXJvcy5hdXRoR1NTQ2xpZW50VXNlck5hbWUoc2VsZi5fa2VyYmVyb3NfY29udGV4dCkKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LlJlcXVlc3RNZXNzYWdlKCcnLCAnYXV0aGVudGljYXRpb24nLCB7J3Nhc2wnOiAnJ30pCisKKyAgICAgICAgIyBUaGlyZCBwYXNzOiBzYXNsIHF1YWxpdHkgb2YgcHJvdGVjdGlvbiAocW9wKSBoYW5kc2hha2UKKworICAgICAgICAjIEdyZW1saW4tc2VydmVyIEtyYjVBdXRoZW50aWNhdG9yIG9ubHkgc3VwcG9ydHMgcW9wPVFPUF9BVVRIOyB1c2Ugc3NsIGZvciBjb25maWRlbnRpYWxpdHkuCisgICAgICAgICMgSGFuZHNoYWtlIGNvbnRlbnQgZm9ybWF0OgorICAgICAgICAjIGJ5dGUgMDogdGhlIHNlbGVjdGVkIHFvcC4gMT09YXV0aCwgMj09YXV0aC1pbnQsIDQ9PWF1dGgtY29uZgorICAgICAgICAjIGJ5dGUgMS0zOiB0aGUgbWF4IGxlbmd0aCBmb3IgYW55IGJ1ZmZlciBzZW50IGJhY2sgYW5kIGZvcnRoIG9uIHRoaXMgY29ubmVjdGlvbi4gKGJpZyBlbmRpYW4pCisgICAgICAgICMgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlcjogdGhlIGF1dGhvcml6YXRpb24gdXNlciBuYW1lIGluIFVURi04IC0gbm90IG51bGwgdGVybWluYXRlZC4KKyAgICAgICAga2VyYmVyb3MuYXV0aEdTU0NsaWVudFVud3JhcChzZWxmLl9rZXJiZXJvc19jb250ZXh0LCBzYXNsX3Jlc3BvbnNlKQorICAgICAgICBkYXRhID0ga2VyYmVyb3MuYXV0aEdTU0NsaWVudFJlc3BvbnNlKHNlbGYuX2tlcmJlcm9zX2NvbnRleHQpCisgICAgICAgIHBsYWludGV4dF9kYXRhID0gYmFzZTY0LmI2NGRlY29kZShkYXRhKQorICAgICAgICBhc3NlcnQgbGVuKHBsYWludGV4dF9kYXRhKSA9PSA0LCAiVW5leHBlY3RlZCByZXNwb25zZSBmcm9tIGdyZW1saW4gc2VydmVyIHNhc2wgaGFuZHNoYWtlIgorICAgICAgICB3b3JkLCA9IHN0cnVjdC51bnBhY2soJyFJJywgcGxhaW50ZXh0X2RhdGEpCisgICAgICAgIHFvcF9iaXRzID0gd29yZCA+PiAyNAorICAgICAgICBhc3NlcnQgc2VsZi5RT1BfQVVUSF9CSVQgJiBxb3BfYml0cywgIlVuZXhwZWN0ZWQgc2FzbCBxb3AgbGV2ZWwgcmVjZWl2ZWQgZnJvbSBncmVtbGluIHNlcnZlciIKKworICAgICAgICBuYW1lX2xlbmd0aCA9IGxlbihzZWxmLl91c2VybmFtZSkKKyAgICAgICAgZm10ID0gJyFJJyArIHN0cihuYW1lX2xlbmd0aCkgKyAncycKKyAgICAgICAgd29yZCA9IHNlbGYuUU9QX0FVVEhfQklUIDw8IDI0IHwgc2VsZi5NQVhfQ09OVEVOVF9MRU5HVEgKKyAgICAgICAgb3V0ID0gc3RydWN0LnBhY2soZm10LCB3b3JkLCBzZWxmLl91c2VybmFtZS5lbmNvZGUoInV0Zi04IiksKQorICAgICAgICBlbmNvZGVkID0gYmFzZTY0LmI2NGVuY29kZShvdXQpLmRlY29kZSgnYXNjaWknKQorICAgICAgICBrZXJiZXJvcy5hdXRoR1NTQ2xpZW50V3JhcChzZWxmLl9rZXJiZXJvc19jb250ZXh0LCBlbmNvZGVkKQorICAgICAgICBhdXRoID0ga2VyYmVyb3MuYXV0aEdTU0NsaWVudFJlc3BvbnNlKHNlbGYuX2tlcmJlcm9zX2NvbnRleHQpCisgICAgICAgIHJldHVybiByZXF1ZXN0LlJlcXVlc3RNZXNzYWdlKCcnLCAnYXV0aGVudGljYXRpb24nLCB7J3Nhc2wnOiBhdXRofSkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvcmVtb3RlX2Nvbm5lY3Rpb24ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3JlbW90ZV9jb25uZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzM1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3JlbW90ZV9jb25uZWN0aW9uLnB5CkBAIC0wLDAgKzEsNzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbXBvcnQgYWJjCitpbXBvcnQgc2l4CisKK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyIGltcG9ydCByZXF1ZXN0Citmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MgaW1wb3J0IHRyYXZlcnNhbAorCitfX2F1dGhvcl9fID0gJ01hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSknCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKGFiYy5BQkNNZXRhKQorY2xhc3MgUmVtb3RlQ29ubmVjdGlvbihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIHRyYXZlcnNhbF9zb3VyY2UpOgorICAgICAgICBzZWxmLl91cmwgPSB1cmwKKyAgICAgICAgc2VsZi5fdHJhdmVyc2FsX3NvdXJjZSA9IHRyYXZlcnNhbF9zb3VyY2UKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB1cmwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl91cmwKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0cmF2ZXJzYWxfc291cmNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhdmVyc2FsX3NvdXJjZQorCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBzdWJtaXQoc2VsZiwgYnl0ZWNvZGUpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAicmVtb3RlY29ubmVjdGlvblsiICsgc2VsZi5fdXJsICsgIiwiICsgc2VsZi5fdHJhdmVyc2FsX3NvdXJjZSArICJdIgorCisKK2NsYXNzIFJlbW90ZVRyYXZlcnNhbCh0cmF2ZXJzYWwuVHJhdmVyc2FsKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhdmVyc2Vycyk6CisgICAgICAgIHN1cGVyKFJlbW90ZVRyYXZlcnNhbCwgc2VsZikuX19pbml0X18oTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi50cmF2ZXJzZXJzID0gdHJhdmVyc2VycworCisKK2NsYXNzIFJlbW90ZVN0cmF0ZWd5KHRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uKToKKyAgICAgICAgdHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYucmVtb3RlX2Nvbm5lY3Rpb24gPSByZW1vdGVfY29ubmVjdGlvbgorCisgICAgZGVmIGFwcGx5KHNlbGYsIHRyYXZlcnNhbCk6CisgICAgICAgIGlmIHRyYXZlcnNhbC50cmF2ZXJzZXJzIGlzIE5vbmU6CisgICAgICAgICAgICByZW1vdGVfdHJhdmVyc2FsID0gc2VsZi5yZW1vdGVfY29ubmVjdGlvbi5zdWJtaXQodHJhdmVyc2FsLmJ5dGVjb2RlKQorICAgICAgICAgICAgdHJhdmVyc2FsLnJlbW90ZV9yZXN1bHRzID0gcmVtb3RlX3RyYXZlcnNhbAorICAgICAgICAgICAgdHJhdmVyc2FsLnRyYXZlcnNlcnMgPSByZW1vdGVfdHJhdmVyc2FsLnRyYXZlcnNlcnMKKworICAgIGRlZiBhcHBseV9hc3luYyhzZWxmLCB0cmF2ZXJzYWwpOgorICAgICAgICBpZiB0cmF2ZXJzYWwudHJhdmVyc2VycyBpcyBOb25lOgorICAgICAgICAgICAgdHJhdmVyc2FsLnJlbW90ZV9yZXN1bHRzID0gc2VsZi5yZW1vdGVfY29ubmVjdGlvbi5zdWJtaXRBc3luYygKKyAgICAgICAgICAgICAgICB0cmF2ZXJzYWwuYnl0ZWNvZGUpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3JlcXVlc3QucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3JlcXVlc3QucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvcmVxdWVzdC5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9yZXF1ZXN0LnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3Jlc3VsdHNldC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvcmVzdWx0c2V0LnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3Jlc3VsdHNldC5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9yZXN1bHRzZXQucHkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvc2VyaWFsaXplci5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvc2VyaWFsaXplci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE4ZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci9zZXJpYWxpemVyLnB5CkBAIC0wLDAgKzEsMjc2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIwordHJ5OgorICAgIGltcG9ydCB1anNvbiBhcyBqc29uCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGpzb24KK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB1dWlkCitpbXBvcnQgaW8KKworZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8gaW1wb3J0IGdyYXBoYmluYXJ5VjEKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvIGltcG9ydCBncmFwaHNvblYyZDAKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvIGltcG9ydCBncmFwaHNvblYzZDAKKworX19hdXRob3JfXyA9ICdEYXZpZCBNLiBCcm93biAoZGF2ZWJzaG93QGdtYWlsLmNvbSknCisKKworY2xhc3MgUHJvY2Vzc29yOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIE9wUHJvY2Vzc29yIHNlcmlhbGl6YXRpb24gc3lzdGVtLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyaXRlcik6CisgICAgICAgIHNlbGYuX3dyaXRlciA9IHdyaXRlcgorCisgICAgZGVmIGdldF9vcF9hcmdzKHNlbGYsIG9wLCBhcmdzKToKKyAgICAgICAgb3BfbWV0aG9kID0gZ2V0YXR0cihzZWxmLCBvcCwgTm9uZSkKKyAgICAgICAgaWYgbm90IG9wX21ldGhvZDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiUHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgb3A6IHt9Ii5mb3JtYXQob3ApKQorICAgICAgICByZXR1cm4gb3BfbWV0aG9kKGFyZ3MpCisKKworY2xhc3MgU3RhbmRhcmQoUHJvY2Vzc29yKToKKworICAgIGRlZiBhdXRoZW50aWNhdGlvbihzZWxmLCBhcmdzKToKKyAgICAgICAgcmV0dXJuIGFyZ3MKKworICAgIGRlZiBldmFsKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gYXJncworCisKK2NsYXNzIFNlc3Npb24oUHJvY2Vzc29yKToKKworICAgIGRlZiBhdXRoZW50aWNhdGlvbihzZWxmLCBhcmdzKToKKyAgICAgICAgcmV0dXJuIGFyZ3MKKworICAgIGRlZiBldmFsKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gYXJncworCisgICAgZGVmIGNsb3NlKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gYXJncworCitjbGFzcyBUcmF2ZXJzYWwoUHJvY2Vzc29yKToKKworICAgIGRlZiBhdXRoZW50aWNhdGlvbihzZWxmLCBhcmdzKToKKyAgICAgICAgcmV0dXJuIGFyZ3MKKworICAgIGRlZiBieXRlY29kZShzZWxmLCBhcmdzKToKKyAgICAgICAgZ3JlbWxpbiA9IGFyZ3NbJ2dyZW1saW4nXQorICAgICAgICBhcmdzWydncmVtbGluJ10gPSBzZWxmLl93cml0ZXIudG9EaWN0KGdyZW1saW4pCisgICAgICAgIGFsaWFzZXMgPSBhcmdzLmdldCgnYWxpYXNlcycsICcnKQorICAgICAgICBpZiBub3QgYWxpYXNlczoKKyAgICAgICAgICAgIGFsaWFzZXMgPSB7J2cnOiAnZyd9CisgICAgICAgIGFyZ3NbJ2FsaWFzZXMnXSA9IGFsaWFzZXMKKyAgICAgICAgcmV0dXJuIGFyZ3MKKworCitjbGFzcyBHcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyKG9iamVjdCk6CisgICAgIiIiCisgICAgTWVzc2FnZSBzZXJpYWxpemVyIGZvciBHcmFwaFNPTi4gQWxsb3cgdXNlcnMgdG8gcGFzcyBjdXN0b20gcmVhZGVyLAorICAgIHdyaXRlciwgYW5kIHZlcnNpb24ga3dhcmdzIGZvciBjdXN0b20gc2VyaWFsaXphdGlvbi4gT3RoZXJ3aXNlLAorICAgIHVzZSBjdXJyZW50IEdyYXBoU09OIHZlcnNpb24gYXMgZGVmYXVsdC4KKyAgICAiIiIKKworICAgICMgS0VFUCBUUkFDSyBPRiBDVVJSRU5UIERFRkFVTFRTCisgICAgREVGQVVMVF9SRUFERVJfQ0xBU1MgPSBncmFwaHNvblYzZDAuR3JhcGhTT05SZWFkZXIKKyAgICBERUZBVUxUX1dSSVRFUl9DTEFTUyA9IGdyYXBoc29uVjNkMC5HcmFwaFNPTldyaXRlcgorICAgIERFRkFVTFRfVkVSU0lPTiA9IGIiYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtqc29uIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlYWRlcj1Ob25lLCB3cml0ZXI9Tm9uZSwgdmVyc2lvbj1Ob25lKToKKyAgICAgICAgaWYgbm90IHZlcnNpb246CisgICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi5ERUZBVUxUX1ZFUlNJT04KKyAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHZlcnNpb24KKyAgICAgICAgaWYgbm90IHJlYWRlcjoKKyAgICAgICAgICAgIHJlYWRlciA9IHNlbGYuREVGQVVMVF9SRUFERVJfQ0xBU1MoKQorICAgICAgICBzZWxmLl9ncmFwaHNvbl9yZWFkZXIgPSByZWFkZXIKKyAgICAgICAgaWYgbm90IHdyaXRlcjoKKyAgICAgICAgICAgIHdyaXRlciA9IHNlbGYuREVGQVVMVF9XUklURVJfQ0xBU1MoKQorICAgICAgICBzZWxmLnN0YW5kYXJkID0gU3RhbmRhcmQod3JpdGVyKQorICAgICAgICBzZWxmLnRyYXZlcnNhbCA9IFRyYXZlcnNhbCh3cml0ZXIpCisgICAgICAgIHNlbGYuc2Vzc2lvbiA9IFNlc3Npb24od3JpdGVyKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHZlcnNpb24oc2VsZik6CisgICAgICAgICIiIlJlYWQgb25seSBwcm9wZXJ0eSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgorCisgICAgZGVmIGdldF9wcm9jZXNzb3Ioc2VsZiwgcHJvY2Vzc29yKToKKyAgICAgICAgcHJvY2Vzc29yID0gZ2V0YXR0cihzZWxmLCBwcm9jZXNzb3IsIE5vbmUpCisgICAgICAgIGlmIG5vdCBwcm9jZXNzb3I6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlVua25vd24gcHJvY2Vzc29yIikKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvcgorCisgICAgZGVmIHNlcmlhbGl6ZV9tZXNzYWdlKHNlbGYsIHJlcXVlc3RfaWQsIHJlcXVlc3RfbWVzc2FnZSk6CisgICAgICAgIHByb2Nlc3NvciA9IHJlcXVlc3RfbWVzc2FnZS5wcm9jZXNzb3IKKyAgICAgICAgb3AgPSByZXF1ZXN0X21lc3NhZ2Uub3AKKyAgICAgICAgYXJncyA9IHJlcXVlc3RfbWVzc2FnZS5hcmdzCisgICAgICAgIGlmIG5vdCBwcm9jZXNzb3I6CisgICAgICAgICAgICBwcm9jZXNzb3Jfb2JqID0gc2VsZi5nZXRfcHJvY2Vzc29yKCdzdGFuZGFyZCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm9jZXNzb3Jfb2JqID0gc2VsZi5nZXRfcHJvY2Vzc29yKHByb2Nlc3NvcikKKyAgICAgICAgYXJncyA9IHByb2Nlc3Nvcl9vYmouZ2V0X29wX2FyZ3Mob3AsIGFyZ3MpCisgICAgICAgIG1lc3NhZ2UgPSBzZWxmLmJ1aWxkX21lc3NhZ2UocmVxdWVzdF9pZCwgcHJvY2Vzc29yLCBvcCwgYXJncykKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKworICAgIGRlZiBidWlsZF9tZXNzYWdlKHNlbGYsIHJlcXVlc3RfaWQsIHByb2Nlc3Nvciwgb3AsIGFyZ3MpOgorICAgICAgICBtZXNzYWdlID0geworICAgICAgICAgICAgJ3JlcXVlc3RJZCc6IHsnQHR5cGUnOiAnZzpVVUlEJywgJ0B2YWx1ZSc6IHJlcXVlc3RfaWR9LAorICAgICAgICAgICAgJ3Byb2Nlc3Nvcic6IHByb2Nlc3NvciwKKyAgICAgICAgICAgICdvcCc6IG9wLAorICAgICAgICAgICAgJ2FyZ3MnOiBhcmdzCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGYuZmluYWxpemVfbWVzc2FnZShtZXNzYWdlLCBiIlx4MjEiLCBzZWxmLnZlcnNpb24pCisKKyAgICBkZWYgZmluYWxpemVfbWVzc2FnZShzZWxmLCBtZXNzYWdlLCBtaW1lX2xlbiwgbWltZV90eXBlKToKKyAgICAgICAgbWVzc2FnZSA9IGpzb24uZHVtcHMobWVzc2FnZSkKKyAgICAgICAgbWVzc2FnZSA9IGInJy5qb2luKFttaW1lX2xlbiwgbWltZV90eXBlLCBtZXNzYWdlLmVuY29kZSgndXRmLTgnKV0pCisgICAgICAgIHJldHVybiBtZXNzYWdlCisKKyAgICBkZWYgZGVzZXJpYWxpemVfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgbXNnID0ganNvbi5sb2FkcyhtZXNzYWdlLmRlY29kZSgndXRmLTgnKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dyYXBoc29uX3JlYWRlci50b09iamVjdChtc2cpCisKKworY2xhc3MgR3JhcGhTT05TZXJpYWxpemVyc1YyZDAoR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplcik6CisgICAgIiIiTWVzc2FnZSBzZXJpYWxpemVyIGZvciBHcmFwaFNPTiAyLjAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHJlYWRlciA9IGdyYXBoc29uVjJkMC5HcmFwaFNPTlJlYWRlcigpCisgICAgICAgIHdyaXRlciA9IGdyYXBoc29uVjJkMC5HcmFwaFNPTldyaXRlcigpCisgICAgICAgIHZlcnNpb24gPSBiImFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYyLjAranNvbiIKKyAgICAgICAgc3VwZXIoR3JhcGhTT05TZXJpYWxpemVyc1YyZDAsIHNlbGYpLl9faW5pdF9fKHJlYWRlciwgd3JpdGVyLCB2ZXJzaW9uKQorCisKK2NsYXNzIEdyYXBoU09OU2VyaWFsaXplcnNWM2QwKEdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXIpOgorICAgICIiIk1lc3NhZ2Ugc2VyaWFsaXplciBmb3IgR3JhcGhTT04gMy4wIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICByZWFkZXIgPSBncmFwaHNvblYzZDAuR3JhcGhTT05SZWFkZXIoKQorICAgICAgICB3cml0ZXIgPSBncmFwaHNvblYzZDAuR3JhcGhTT05Xcml0ZXIoKQorICAgICAgICB2ZXJzaW9uID0gYiJhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2pzb24iCisgICAgICAgIHN1cGVyKEdyYXBoU09OU2VyaWFsaXplcnNWM2QwLCBzZWxmKS5fX2luaXRfXyhyZWFkZXIsIHdyaXRlciwgdmVyc2lvbikKKworCitjbGFzcyBHcmFwaEJpbmFyeVNlcmlhbGl6ZXJzVjEob2JqZWN0KToKKyAgICBERUZBVUxUX1JFQURFUl9DTEFTUyA9IGdyYXBoYmluYXJ5VjEuR3JhcGhCaW5hcnlSZWFkZXIKKyAgICBERUZBVUxUX1dSSVRFUl9DTEFTUyA9IGdyYXBoYmluYXJ5VjEuR3JhcGhCaW5hcnlXcml0ZXIKKyAgICBERUZBVUxUX1ZFUlNJT04gPSBiImFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wIgorCisgICAgbWF4X2ludDY0ID0gMHhGRkZGRkZGRkZGRkZGRkZGCisgICAgaGVhZGVyX3N0cnVjdCA9IHN0cnVjdC5TdHJ1Y3QoJz5iMzJzQlFRJykKKyAgICBoZWFkZXJfcGFjayA9IGhlYWRlcl9zdHJ1Y3QucGFjaworICAgIGludF9wYWNrID0gZ3JhcGhiaW5hcnlWMS5pbnQzMl9wYWNrCisgICAgaW50MzJfdW5wYWNrID0gc3RydWN0LlN0cnVjdCgiPmkiKS51bnBhY2sKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFkZXI9Tm9uZSwgd3JpdGVyPU5vbmUsIHZlcnNpb249Tm9uZSk6CisgICAgICAgIGlmIG5vdCB2ZXJzaW9uOgorICAgICAgICAgICAgdmVyc2lvbiA9IHNlbGYuREVGQVVMVF9WRVJTSU9OCisgICAgICAgIHNlbGYuX3ZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgIGlmIG5vdCByZWFkZXI6CisgICAgICAgICAgICByZWFkZXIgPSBzZWxmLkRFRkFVTFRfUkVBREVSX0NMQVNTKCkKKyAgICAgICAgc2VsZi5fZ3JhcGhiaW5hcnlfcmVhZGVyID0gcmVhZGVyCisgICAgICAgIGlmIG5vdCB3cml0ZXI6CisgICAgICAgICAgICB3cml0ZXIgPSBzZWxmLkRFRkFVTFRfV1JJVEVSX0NMQVNTKCkKKyAgICAgICAgc2VsZi5fZ3JhcGhiaW5hcnlfd3JpdGVyID0gd3JpdGVyCisgICAgICAgIHNlbGYuc3RhbmRhcmQgPSBTdGFuZGFyZCh3cml0ZXIpCisgICAgICAgIHNlbGYudHJhdmVyc2FsID0gVHJhdmVyc2FsKHdyaXRlcikKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgorICAgICAgICAiIiJSZWFkIG9ubHkgcHJvcGVydHkiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KKworICAgIGRlZiBnZXRfcHJvY2Vzc29yKHNlbGYsIHByb2Nlc3Nvcik6CisgICAgICAgIHByb2Nlc3NvciA9IGdldGF0dHIoc2VsZiwgcHJvY2Vzc29yLCBOb25lKQorICAgICAgICBpZiBub3QgcHJvY2Vzc29yOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJVbmtub3duIHByb2Nlc3NvciIpCisgICAgICAgIHJldHVybiBwcm9jZXNzb3IKKworICAgIGRlZiBzZXJpYWxpemVfbWVzc2FnZShzZWxmLCByZXF1ZXN0X2lkLCByZXF1ZXN0X21lc3NhZ2UpOgorICAgICAgICBwcm9jZXNzb3IgPSByZXF1ZXN0X21lc3NhZ2UucHJvY2Vzc29yCisgICAgICAgIG9wID0gcmVxdWVzdF9tZXNzYWdlLm9wCisgICAgICAgIGFyZ3MgPSByZXF1ZXN0X21lc3NhZ2UuYXJncworICAgICAgICBpZiBub3QgcHJvY2Vzc29yOgorICAgICAgICAgICAgcHJvY2Vzc29yX29iaiA9IHNlbGYuZ2V0X3Byb2Nlc3Nvcignc3RhbmRhcmQnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvY2Vzc29yX29iaiA9IHNlbGYuZ2V0X3Byb2Nlc3Nvcihwcm9jZXNzb3IpCisgICAgICAgIGFyZ3MgPSBwcm9jZXNzb3Jfb2JqLmdldF9vcF9hcmdzKG9wLCBhcmdzKQorICAgICAgICBtZXNzYWdlID0gc2VsZi5idWlsZF9tZXNzYWdlKHJlcXVlc3RfaWQsIHByb2Nlc3Nvciwgb3AsIGFyZ3MpCisgICAgICAgIHJldHVybiBtZXNzYWdlCisKKyAgICBkZWYgYnVpbGRfbWVzc2FnZShzZWxmLCByZXF1ZXN0X2lkLCBwcm9jZXNzb3IsIG9wLCBhcmdzKToKKyAgICAgICAgbWVzc2FnZSA9IHsKKyAgICAgICAgICAgICdyZXF1ZXN0SWQnOiByZXF1ZXN0X2lkLAorICAgICAgICAgICAgJ3Byb2Nlc3Nvcic6IHByb2Nlc3NvciwKKyAgICAgICAgICAgICdvcCc6IG9wLAorICAgICAgICAgICAgJ2FyZ3MnOiBhcmdzCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGYuZmluYWxpemVfbWVzc2FnZShtZXNzYWdlLCAweDIwLCBzZWxmLnZlcnNpb24pCisKKyAgICBkZWYgZmluYWxpemVfbWVzc2FnZShzZWxmLCBtZXNzYWdlLCBtaW1lX2xlbiwgbWltZV90eXBlKToKKyAgICAgICAgYmEgPSBieXRlYXJyYXkoKQorCisgICAgICAgIHJlcXVlc3RfaWQgPSB1dWlkLlVVSUQobWVzc2FnZVsncmVxdWVzdElkJ10pCisgICAgICAgIGJhLmV4dGVuZChzZWxmLmhlYWRlcl9wYWNrKG1pbWVfbGVuLCBtaW1lX3R5cGUsIDB4ODEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X2lkLmludCA+PiA2NCkgJiBzZWxmLm1heF9pbnQ2NCwgcmVxdWVzdF9pZC5pbnQgJiBzZWxmLm1heF9pbnQ2NCkpCisKKyAgICAgICAgb3BfYnl0ZXMgPSBtZXNzYWdlWydvcCddLmVuY29kZSgidXRmLTgiKQorICAgICAgICBiYS5leHRlbmQoc2VsZi5pbnRfcGFjayhsZW4ob3BfYnl0ZXMpKSkKKyAgICAgICAgYmEuZXh0ZW5kKG9wX2J5dGVzKQorCisgICAgICAgIHByb2Nlc3Nvcl9ieXRlcyA9IG1lc3NhZ2VbJ3Byb2Nlc3NvciddLmVuY29kZSgidXRmLTgiKQorICAgICAgICBiYS5leHRlbmQoc2VsZi5pbnRfcGFjayhsZW4ocHJvY2Vzc29yX2J5dGVzKSkpCisgICAgICAgIGJhLmV4dGVuZChwcm9jZXNzb3JfYnl0ZXMpCisKKyAgICAgICAgYXJncyA9IG1lc3NhZ2VbImFyZ3MiXQorICAgICAgICBiYS5leHRlbmQoc2VsZi5pbnRfcGFjayhsZW4oYXJncykpKQorICAgICAgICBmb3IgaywgdiBpbiBhcmdzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLl9ncmFwaGJpbmFyeV93cml0ZXIudG9EaWN0KGssIGJhKQorCisgICAgICAgICAgICAjIHByb2Nlc3Nvcl9vYmouZ2V0X29wX2FyZ3MgaW4gc2VyaWFsaXplX21lc3NhZ2UoKSBzZWVtcyB0byBhbHJlYWR5IGhhbmRsZSBieXRlY29kZS4gaW4gcHl0aG9uIDMKKyAgICAgICAgICAgICMgYmVjYXVzZSBieXRlYXJyYXkgaXNuJ3QgYm91bmQgdG8gYSB0eXBlIGluIGdyYXBoYmluYXJ5IGl0IGZhbGxzIHRocm91Z2ggdGhlIHdyaXRlT2JqZWN0KCkgYW5kCisgICAgICAgICAgICAjIGp1c3Qgd29ya3MgYnV0IHB5dGhvbiAyIGJ5dGVhcnJheSBpcyBib3VuZCB0byBCeXRlQnVmZmVyVHlwZSBzbyBpdCB3cml0ZXMgRGF0YVR5cGUuYnl0ZWJ1ZmZlcgorICAgICAgICAgICAgIyByYXRoZXIgdGhhbiBEYXRhVHlwZS5ieXRlY29kZSBhbmQgdGhlIHNlcnZlciBnZXRzIGNvbmZ1c2VkLiBzcGVjaWFsIGNhc2luZyB0aGlzIGZvciBub3cgdW50aWwKKyAgICAgICAgICAgICMgaXQgY2FuIGJlIHJlZmFjdG9yZWQKKyAgICAgICAgICAgIGlmIGsgPT0gImdyZW1saW4iOgorICAgICAgICAgICAgICAgIGJhLmV4dGVuZCh2KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9ncmFwaGJpbmFyeV93cml0ZXIudG9EaWN0KHYsIGJhKQorCisgICAgICAgIHJldHVybiBieXRlcyhiYSkKKworICAgIGRlZiBkZXNlcmlhbGl6ZV9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBiID0gaW8uQnl0ZXNJTyhtZXNzYWdlKQorCisgICAgICAgIGIucmVhZCgxKSAgIyB2ZXJzaW9uCisKKyAgICAgICAgcmVxdWVzdF9pZCA9IHN0cihzZWxmLl9ncmFwaGJpbmFyeV9yZWFkZXIudG9PYmplY3QoYiwgZ3JhcGhiaW5hcnlWMS5EYXRhVHlwZS51dWlkKSkKKyAgICAgICAgc3RhdHVzX2NvZGUgPSBzZWxmLmludDMyX3VucGFjayhiLnJlYWQoNCkpWzBdCisgICAgICAgIHN0YXR1c19tc2cgPSBzZWxmLl9ncmFwaGJpbmFyeV9yZWFkZXIudG9PYmplY3QoYiwgZ3JhcGhiaW5hcnlWMS5EYXRhVHlwZS5zdHJpbmcpCisgICAgICAgIHN0YXR1c19hdHRycyA9IHNlbGYuX2dyYXBoYmluYXJ5X3JlYWRlci50b09iamVjdChiLCBncmFwaGJpbmFyeVYxLkRhdGFUeXBlLm1hcCwgbnVsbGFibGU9RmFsc2UpCisgICAgICAgIG1ldGFfYXR0cnMgPSBzZWxmLl9ncmFwaGJpbmFyeV9yZWFkZXIudG9PYmplY3QoYiwgZ3JhcGhiaW5hcnlWMS5EYXRhVHlwZS5tYXAsIG51bGxhYmxlPUZhbHNlKQorICAgICAgICByZXN1bHQgPSBzZWxmLl9ncmFwaGJpbmFyeV9yZWFkZXIudG9PYmplY3QoYikKKworICAgICAgICBiLmNsb3NlKCkKKworICAgICAgICBtc2cgPSB7J3JlcXVlc3RJZCc6IHJlcXVlc3RfaWQsCisgICAgICAgICAgICAgICAnc3RhdHVzJzogeydjb2RlJzogc3RhdHVzX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogc3RhdHVzX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnOiBzdGF0dXNfYXR0cnN9LAorICAgICAgICAgICAgICAgJ3Jlc3VsdCc6IHsnbWV0YSc6IG1ldGFfYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzogcmVzdWx0fX0KKworICAgICAgICByZXR1cm4gbXNnCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3Rvcm5hZG8vX19pbml0X18ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3Rvcm5hZG8vX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvdG9ybmFkby9fX2luaXRfXy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci90b3JuYWRvL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3Rvcm5hZG8vdHJhbnNwb3J0LnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci90b3JuYWRvL3RyYW5zcG9ydC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci90b3JuYWRvL3RyYW5zcG9ydC5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci90b3JuYWRvL3RyYW5zcG9ydC5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci90cmFuc3BvcnQucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vZHJpdmVyL3RyYW5zcG9ydC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL2RyaXZlci90cmFuc3BvcnQucHkKcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9kcml2ZXIvdHJhbnNwb3J0LnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9fX2luaXRfXy5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9wcm9jZXNzL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9fX2luaXRfXy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3Byb2Nlc3MvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9wcm9jZXNzL2Fub255bW91c190cmF2ZXJzYWwucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9hbm9ueW1vdXNfdHJhdmVyc2FsLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9hbm9ueW1vdXNfdHJhdmVyc2FsLnB5CnJlbmFtZSB0byBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9hbm9ueW1vdXNfdHJhdmVyc2FsLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9ncmFwaF90cmF2ZXJzYWwucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9ncmFwaF90cmF2ZXJzYWwucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9wcm9jZXNzL2dyYXBoX3RyYXZlcnNhbC5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3Byb2Nlc3MvZ3JhcGhfdHJhdmVyc2FsLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy9zdHJhdGVnaWVzLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3Byb2Nlc3Mvc3RyYXRlZ2llcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmVlNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3Byb2Nlc3Mvc3RyYXRlZ2llcy5weQpAQCAtMCwwICsxLDIyMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJworCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBUcmF2ZXJzYWxTdHJhdGVneQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgREVDT1JBVElPTiBTVFJBVEVHSUVTICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgQ29ubmVjdGl2ZVN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5Db25uZWN0aXZlU3RyYXRlZ3kiKQorCisKK2NsYXNzIEVsZW1lbnRJZFN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5FbGVtZW50SWRTdHJhdGVneSIpCisKKworIyBFdmVudFN0cmF0ZWd5IGRvZXNuJ3QgbWFrZSBzZW5zZSBvdXRzaWRlIEpWTSB0cmF2ZXJzYWwgbWFjaGluZQorCitjbGFzcyBIYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbHRlZF90cmF2ZXJzZXJfZmFjdG9yeT1Ob25lKToKKyAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLkhhbHRlZFRyYXZlcnNlclN0cmF0ZWd5IikKKyAgICAgICAgaWYgaGFsdGVkX3RyYXZlcnNlcl9mYWN0b3J5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJoYWx0ZWRUcmF2ZXJzZXJGYWN0b3J5Il0gPSBoYWx0ZWRfdHJhdmVyc2VyX2ZhY3RvcnkKKworCitjbGFzcyBPcHRpb25zU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zPU5vbmUpOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBjb25maWd1cmF0aW9uPW9wdGlvbnMsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5PcHRpb25zU3RyYXRlZ3kiKQorCisKK2NsYXNzIFBhcnRpdGlvblN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFydGl0aW9uX2tleT1Ob25lLCB3cml0ZV9wYXJ0aXRpb249Tm9uZSwgcmVhZF9wYXJ0aXRpb25zPU5vbmUsIGluY2x1ZGVfbWV0YV9wcm9wZXJ0aWVzPU5vbmUpOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uUGFydGl0aW9uU3RyYXRlZ3kiKQorICAgICAgICBpZiBwYXJ0aXRpb25fa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJwYXJ0aXRpb25LZXkiXSA9IHBhcnRpdGlvbl9rZXkKKyAgICAgICAgaWYgd3JpdGVfcGFydGl0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJ3cml0ZVBhcnRpdGlvbiJdID0gd3JpdGVfcGFydGl0aW9uCisgICAgICAgIGlmIHdyaXRlX3BhcnRpdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsicmVhZFBhcnRpdGlvbnMiXSA9IHJlYWRfcGFydGl0aW9ucworICAgICAgICBpZiBpbmNsdWRlX21ldGFfcHJvcGVydGllcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsiaW5jbHVkZU1ldGFQcm9wZXJ0aWVzIl0gPSBpbmNsdWRlX21ldGFfcHJvcGVydGllcworCisKK2NsYXNzIFNlZWRTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlZWQpOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU2VlZFN0cmF0ZWd5IikKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJzZWVkIl0gPSBzZWVkCisKKworY2xhc3MgU3ViZ3JhcGhTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmVydGljZXM9Tm9uZSwgZWRnZXM9Tm9uZSwgdmVydGV4X3Byb3BlcnRpZXM9Tm9uZSk6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5TdWJncmFwaFN0cmF0ZWd5IikKKyAgICAgICAgaWYgdmVydGljZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bInZlcnRpY2VzIl0gPSB2ZXJ0aWNlcworICAgICAgICBpZiBlZGdlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsiZWRnZXMiXSA9IGVkZ2VzCisgICAgICAgIGlmIHZlcnRleF9wcm9wZXJ0aWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJ2ZXJ0ZXhQcm9wZXJ0aWVzIl0gPSB2ZXJ0ZXhfcHJvcGVydGllcworCisKK2NsYXNzIFZlcnRleFByb2dyYW1TdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdyYXBoX2NvbXB1dGVyPU5vbmUsIHdvcmtlcnM9Tm9uZSwgcGVyc2lzdD1Ob25lLCByZXN1bHQ9Tm9uZSwgdmVydGljZXM9Tm9uZSwgZWRnZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbj1Ob25lKToKKyAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlZlcnRleFByb2dyYW1TdHJhdGVneSIpCisgICAgICAgIGlmIGdyYXBoX2NvbXB1dGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJncmFwaENvbXB1dGVyIl0gPSBncmFwaF9jb21wdXRlcgorICAgICAgICBpZiB3b3JrZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJ3b3JrZXJzIl0gPSB3b3JrZXJzCisgICAgICAgIGlmIHBlcnNpc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bInBlcnNpc3QiXSA9IHBlcnNpc3QKKyAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJyZXN1bHQiXSA9IHJlc3VsdAorICAgICAgICBpZiB2ZXJ0aWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsidmVydGljZXMiXSA9IHZlcnRpY2VzCisgICAgICAgIGlmIGVkZ2VzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJlZGdlcyJdID0gZWRnZXMKKyAgICAgICAgaWYgY29uZmlndXJhdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi51cGRhdGUoY29uZmlndXJhdGlvbikKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRklOQUxJWkFUSU9OIFNUUkFURUdJRVMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIE1hdGNoQWxnb3JpdGhtU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaF9hbGdvcml0aG09Tm9uZSk6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZmluYWxpemF0aW9uLk1hdGNoQWxnb3JpdGhtU3RyYXRlZ3kiKQorICAgICAgICBpZiBtYXRjaF9hbGdvcml0aG0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bIm1hdGNoQWxnb3JpdGhtIl0gPSBtYXRjaF9hbGdvcml0aG0KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT1BUSU1JWkFUSU9OIFNUUkFURUdJRVMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIEFkamFjZW50VG9JbmNpZGVudFN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkFkamFjZW50VG9JbmNpZGVudFN0cmF0ZWd5IikKKworCitjbGFzcyBCeU1vZHVsYXRvck9wdGltaXphdGlvblN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkNvdW50U3RyYXRlZ3kiKQorCisKK2NsYXNzIENvdW50U3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uQnlNb2R1bGF0b3JPcHRpbWl6YXRpb25TdHJhdGVneSIpCisKKworY2xhc3MgRmlsdGVyUmFua2luZ1N0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkZpbHRlclJhbmtpbmdTdHJhdGVneSIpCisKKworY2xhc3MgSWRlbnRpdHlSZW1vdmFsU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uSWRlbnRpdHlSZW1vdmFsU3RyYXRlZ3kiKQorCisKK2NsYXNzIEluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkluY2lkZW50VG9BZGphY2VudFN0cmF0ZWd5IikKKworCitjbGFzcyBJbmxpbmVGaWx0ZXJTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5JbmxpbmVGaWx0ZXJTdHJhdGVneSIpCisKKworY2xhc3MgTGF6eUJhcnJpZXJTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5MYXp5QmFycmllclN0cmF0ZWd5IikKKworCitjbGFzcyBNYXRjaFByZWRpY2F0ZVN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLk1hdGNoUHJlZGljYXRlU3RyYXRlZ3kiKQorCisKK2NsYXNzIE9yZGVyTGltaXRTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5PcmRlckxpbWl0U3RyYXRlZ3kiKQorCisKK2NsYXNzIFBhdGhQcm9jZXNzb3JTdHJhdGVneShUcmF2ZXJzYWxTdHJhdGVneSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbi5QYXRoUHJvY2Vzc29yU3RyYXRlZ3kiKQorCisKK2NsYXNzIFBhdGhSZXRyYWN0aW9uU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uUGF0aFJldHJhY3Rpb25TdHJhdGVneSIpCisKK2NsYXNzIFJlcGVhdFVucm9sbFN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLlJlcGVhdFVucm9sbFN0cmF0ZWd5IikKKworCitjbGFzcyBHcmFwaEZpbHRlclN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkdyYXBoRmlsdGVyU3RyYXRlZ3kiKQorCisKKworY2xhc3MgRWFybHlMaW1pdFN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkVhcmx5TGltaXRTdHJhdGVneSIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBWRVJJRklDQVRJT04gU1RSQVRFR0lFUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitjbGFzcyBMYW1iZGFSZXN0cmljdGlvblN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5Ll9faW5pdF9fKHNlbGYsIGZxY249Im9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kudmVyaWZpY2F0aW9uLkxhbWJkYVJlc3RyaWN0aW9uU3RyYXRlZ3kiKQorCisKK2NsYXNzIFJlYWRPbmx5U3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS52ZXJpZmljYXRpb24uUmVhZE9ubHlTdHJhdGVneSIpCisKKworY2xhc3MgRWRnZUxhYmVsVmVyaWZpY2F0aW9uU3RyYXRlZ3koVHJhdmVyc2FsU3RyYXRlZ3kpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dfd2FybmluZz1GYWxzZSwgdGhyb3dfZXhjZXB0aW9uPUZhbHNlKToKKyAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ3kuX19pbml0X18oc2VsZiwgZnFjbj0ib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS52ZXJpZmljYXRpb24uRWRnZUxhYmVsVmVyaWZpY2F0aW9uU3RyYXRlZ3kiKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb25bImxvZ1dhcm5pbmciXSA9IGxvZ193YXJuaW5nCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsidGhyb3dFeGNlcHRpb24iXSA9IHRocm93X2V4Y2VwdGlvbgorCisKK2NsYXNzIFJlc2VydmVkS2V5c1ZlcmlmaWNhdGlvblN0cmF0ZWd5KFRyYXZlcnNhbFN0cmF0ZWd5KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nX3dhcm5pbmc9RmFsc2UsIHRocm93X2V4Y2VwdGlvbj1GYWxzZSwga2V5cz1bImlkIiwgImxhYmVsIl0pOgorICAgICAgICBUcmF2ZXJzYWxTdHJhdGVneS5fX2luaXRfXyhzZWxmLCBmcWNuPSJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LnZlcmlmaWNhdGlvbi5SZXNlcnZlZEtleXNWZXJpZmljYXRpb25TdHJhdGVneSIpCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsibG9nV2FybmluZyJdID0gbG9nX3dhcm5pbmcKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uWyJ0aHJvd0V4Y2VwdGlvbiJdID0gdGhyb3dfZXhjZXB0aW9uCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvblsia2V5cyJdID0ga2V5cwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3Byb2Nlc3MvdHJhdmVyc2FsLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3Byb2Nlc3MvdHJhdmVyc2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODg4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vcHJvY2Vzcy90cmF2ZXJzYWwucHkKQEAgLTAsMCArMSw3MTUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBjb3B5Citmcm9tIGFlbnVtIGltcG9ydCBFbnVtCitmcm9tIC4uIGltcG9ydCBzdGF0aWNzCitmcm9tIC4uc3RhdGljcyBpbXBvcnQgbG9uZworCitjbGFzcyBUcmF2ZXJzYWwob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JhcGgsIHRyYXZlcnNhbF9zdHJhdGVnaWVzLCBieXRlY29kZSk6CisgICAgICAgIHNlbGYuZ3JhcGggPSBncmFwaAorICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzID0gdHJhdmVyc2FsX3N0cmF0ZWdpZXMKKyAgICAgICAgc2VsZi5ieXRlY29kZSA9IGJ5dGVjb2RlCisgICAgICAgIHNlbGYudHJhdmVyc2VycyA9IE5vbmUKKyAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IE5vbmUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLmJ5dGVjb2RlKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJ5dGVjb2RlID09IG90aGVyLmJ5dGVjb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi50cmF2ZXJzZXJzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzLmFwcGx5X3N0cmF0ZWdpZXMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5sYXN0X3RyYXZlcnNlciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IG5leHQoc2VsZi50cmF2ZXJzZXJzKQorICAgICAgICBvYmplY3QgPSBzZWxmLmxhc3RfdHJhdmVyc2VyLm9iamVjdAorICAgICAgICBzZWxmLmxhc3RfdHJhdmVyc2VyLmJ1bGsgPSBzZWxmLmxhc3RfdHJhdmVyc2VyLmJ1bGsgLSAxCisgICAgICAgIGlmIHNlbGYubGFzdF90cmF2ZXJzZXIuYnVsayA8PSAwOgorICAgICAgICAgICAgc2VsZi5sYXN0X3RyYXZlcnNlciA9IE5vbmUKKyAgICAgICAgcmV0dXJuIG9iamVjdAorCisgICAgZGVmIHRvTGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3QoaXRlcihzZWxmKSkKKworICAgIGRlZiB0b1NldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNldChpdGVyKHNlbGYpKQorCisgICAgZGVmIGl0ZXJhdGUoc2VsZik6CisgICAgICAgIHNlbGYuYnl0ZWNvZGUuYWRkX3N0ZXAoIm5vbmUiKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OiBzZWxmLm5leHRUcmF2ZXJzZXIoKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dFRyYXZlcnNlcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi50cmF2ZXJzZXJzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzLmFwcGx5X3N0cmF0ZWdpZXMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5sYXN0X3RyYXZlcnNlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG5leHQoc2VsZi50cmF2ZXJzZXJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGVtcCA9IHNlbGYubGFzdF90cmF2ZXJzZXIKKyAgICAgICAgICAgIHNlbGYubGFzdF90cmF2ZXJzZXIgPSBOb25lCisgICAgICAgICAgICByZXR1cm4gdGVtcAorCisgICAgZGVmIGhhc05leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYudHJhdmVyc2VycyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcy5hcHBseV9zdHJhdGVnaWVzKHNlbGYpCisgICAgICAgIGlmIHNlbGYubGFzdF90cmF2ZXJzZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeTogc2VsZi5sYXN0X3RyYXZlcnNlciA9IG5leHQoc2VsZi50cmF2ZXJzZXJzKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gbm90KHNlbGYubGFzdF90cmF2ZXJzZXIgaXMgTm9uZSkgYW5kIHNlbGYubGFzdF90cmF2ZXJzZXIuYnVsayA+IDAKKworICAgIGRlZiBuZXh0KHNlbGYsIGFtb3VudD1Ob25lKToKKyAgICAgICAgaWYgYW1vdW50IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX25leHRfXygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgIHRlbXBMaXN0ID0gW10KKyAgICAgICAgICAgIHdoaWxlIGNvdW50IDwgYW1vdW50OgorICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICAgICAgdHJ5OiB0ZW1wID0gc2VsZi5fX25leHRfXygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246IHJldHVybiB0ZW1wTGlzdAorICAgICAgICAgICAgICAgIHRlbXBMaXN0LmFwcGVuZCh0ZW1wKQorICAgICAgICAgICAgcmV0dXJuIHRlbXBMaXN0CisKKyAgICBkZWYgcHJvbWlzZShzZWxmLCBjYj1Ob25lKToKKyAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcy5hcHBseV9hc3luY19zdHJhdGVnaWVzKHNlbGYpCisgICAgICAgIGZ1dHVyZV90cmF2ZXJzYWwgPSBzZWxmLnJlbW90ZV9yZXN1bHRzCisgICAgICAgIGZ1dHVyZSA9IHR5cGUoZnV0dXJlX3RyYXZlcnNhbCkoKQorICAgICAgICBkZWYgcHJvY2VzcyhmKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cmF2ZXJzYWwgPSBmLnJlc3VsdCgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50cmF2ZXJzZXJzID0gaXRlcih0cmF2ZXJzYWwudHJhdmVyc2VycykKKyAgICAgICAgICAgICAgICBpZiBjYjoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2Ioc2VsZikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZS5zZXRfcmVzdWx0KHJlc3VsdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmdXR1cmUuc2V0X3Jlc3VsdChzZWxmKQorICAgICAgICBmdXR1cmVfdHJhdmVyc2FsLmFkZF9kb25lX2NhbGxiYWNrKHByb2Nlc3MpCisgICAgICAgIHJldHVybiBmdXR1cmUKKworCitCYXJyaWVyID0gRW51bSgnQmFycmllcicsICcgbm9ybVNhY2snKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ25vcm1TYWNrJywgQmFycmllci5ub3JtU2FjaykKKworQ2FyZGluYWxpdHkgPSBFbnVtKCdDYXJkaW5hbGl0eScsICcgbGlzdF8gc2V0XyBzaW5nbGUnKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ3NpbmdsZScsIENhcmRpbmFsaXR5LnNpbmdsZSkKK3N0YXRpY3MuYWRkX3N0YXRpYygnbGlzdF8nLCBDYXJkaW5hbGl0eS5saXN0XykKK3N0YXRpY3MuYWRkX3N0YXRpYygnc2V0XycsIENhcmRpbmFsaXR5LnNldF8pCisKK0NvbHVtbiA9IEVudW0oJ0NvbHVtbicsICcga2V5cyB2YWx1ZXMnKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2tleXMnLCBDb2x1bW4ua2V5cykKK3N0YXRpY3MuYWRkX3N0YXRpYygndmFsdWVzJywgQ29sdW1uLnZhbHVlcykKKworRGlyZWN0aW9uID0gRW51bSgnRGlyZWN0aW9uJywgJyBCT1RIIElOIE9VVCcpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnT1VUJywgRGlyZWN0aW9uLk9VVCkKK3N0YXRpY3MuYWRkX3N0YXRpYygnSU4nLCBEaXJlY3Rpb24uSU4pCitzdGF0aWNzLmFkZF9zdGF0aWMoJ0JPVEgnLCBEaXJlY3Rpb24uQk9USCkKKworR3JhcGhTT05WZXJzaW9uID0gRW51bSgnR3JhcGhTT05WZXJzaW9uJywgJyBWMV8wIFYyXzAgVjNfMCcpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnVjFfMCcsIEdyYXBoU09OVmVyc2lvbi5WMV8wKQorc3RhdGljcy5hZGRfc3RhdGljKCdWMl8wJywgR3JhcGhTT05WZXJzaW9uLlYyXzApCitzdGF0aWNzLmFkZF9zdGF0aWMoJ1YzXzAnLCBHcmFwaFNPTlZlcnNpb24uVjNfMCkKKworR3J5b1ZlcnNpb24gPSBFbnVtKCdHcnlvVmVyc2lvbicsICcgVjFfMCBWM18wJykKKworc3RhdGljcy5hZGRfc3RhdGljKCdWMV8wJywgR3J5b1ZlcnNpb24uVjFfMCkKK3N0YXRpY3MuYWRkX3N0YXRpYygnVjNfMCcsIEdyeW9WZXJzaW9uLlYzXzApCisKK09yZGVyID0gRW51bSgnT3JkZXInLCAnIGFzYyBkZXNjIHNodWZmbGUnKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ3NodWZmbGUnLCBPcmRlci5zaHVmZmxlKQorc3RhdGljcy5hZGRfc3RhdGljKCdhc2MnLCBPcmRlci5hc2MpCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2Rlc2MnLCBPcmRlci5kZXNjKQorCitQaWNrID0gRW51bSgnUGljaycsICcgYW55IG5vbmUnKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2FueScsIFBpY2suYW55KQorc3RhdGljcy5hZGRfc3RhdGljKCdub25lJywgUGljay5ub25lKQorCitQb3AgPSBFbnVtKCdQb3AnLCAnIGFsbF8gZmlyc3QgbGFzdCBtaXhlZCcpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnZmlyc3QnLCBQb3AuZmlyc3QpCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2xhc3QnLCBQb3AubGFzdCkKK3N0YXRpY3MuYWRkX3N0YXRpYygnYWxsXycsIFBvcC5hbGxfKQorc3RhdGljcy5hZGRfc3RhdGljKCdtaXhlZCcsIFBvcC5taXhlZCkKKworU2NvcGUgPSBFbnVtKCdTY29wZScsICcgZ2xvYmFsXyBsb2NhbCcpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnZ2xvYmFsXycsIFNjb3BlLmdsb2JhbF8pCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2xvY2FsJywgU2NvcGUubG9jYWwpCisKKworVCA9IEVudW0oJ1QnLCAnIGlkIGlkXyBrZXkgbGFiZWwgdmFsdWUnKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2lkJywgVC5pZCkKK3N0YXRpY3MuYWRkX3N0YXRpYygnbGFiZWwnLCBULmxhYmVsKQorc3RhdGljcy5hZGRfc3RhdGljKCdpZF8nLCBULmlkXykKK3N0YXRpY3MuYWRkX3N0YXRpYygna2V5JywgVC5rZXkpCitzdGF0aWNzLmFkZF9zdGF0aWMoJ3ZhbHVlJywgVC52YWx1ZSkKKworCitPcGVyYXRvciA9IEVudW0oJ09wZXJhdG9yJywgJyBhZGRBbGwgYW5kXyBhc3NpZ24gZGl2IG1heCBtYXhfIG1pbiBtaW5fIG1pbnVzIG11bHQgb3JfIHN1bSBzdW1fIHN1bUxvbmcnKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ3N1bV8nLCBPcGVyYXRvci5zdW1fKQorc3RhdGljcy5hZGRfc3RhdGljKCdzdW0nLCBPcGVyYXRvci5zdW1fKQorc3RhdGljcy5hZGRfc3RhdGljKCdtaW51cycsIE9wZXJhdG9yLm1pbnVzKQorc3RhdGljcy5hZGRfc3RhdGljKCdtdWx0JywgT3BlcmF0b3IubXVsdCkKK3N0YXRpY3MuYWRkX3N0YXRpYygnZGl2JywgT3BlcmF0b3IuZGl2KQorc3RhdGljcy5hZGRfc3RhdGljKCdtaW4nLCBPcGVyYXRvci5taW5fKQorc3RhdGljcy5hZGRfc3RhdGljKCdtaW5fJywgT3BlcmF0b3IubWluXykKK3N0YXRpY3MuYWRkX3N0YXRpYygnbWF4XycsIE9wZXJhdG9yLm1heF8pCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2Fzc2lnbicsIE9wZXJhdG9yLmFzc2lnbikKK3N0YXRpY3MuYWRkX3N0YXRpYygnYW5kXycsIE9wZXJhdG9yLmFuZF8pCitzdGF0aWNzLmFkZF9zdGF0aWMoJ29yXycsIE9wZXJhdG9yLm9yXykKK3N0YXRpY3MuYWRkX3N0YXRpYygnYWRkQWxsJywgT3BlcmF0b3IuYWRkQWxsKQorc3RhdGljcy5hZGRfc3RhdGljKCdzdW1Mb25nJywgT3BlcmF0b3Iuc3VtTG9uZykKKworCitjbGFzcyBQKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wZXJhdG9yLCB2YWx1ZSwgb3RoZXI9Tm9uZSk6CisgICAgICAgIHNlbGYub3BlcmF0b3IgPSBvcGVyYXRvcgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5vdGhlciA9IG90aGVyCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGJldHdlZW4oKmFyZ3MpOgorICAgICAgICByZXR1cm4gUCgiYmV0d2VlbiIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBlcSgqYXJncyk6CisgICAgICAgIHJldHVybiBQKCJlcSIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBndCgqYXJncyk6CisgICAgICAgIHJldHVybiBQKCJndCIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBndGUoKmFyZ3MpOgorICAgICAgICByZXR1cm4gUCgiZ3RlIiwgKmFyZ3MpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGluc2lkZSgqYXJncyk6CisgICAgICAgIHJldHVybiBQKCJpbnNpZGUiLCAqYXJncykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgbHQoKmFyZ3MpOgorICAgICAgICByZXR1cm4gUCgibHQiLCAqYXJncykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgbHRlKCphcmdzKToKKyAgICAgICAgcmV0dXJuIFAoImx0ZSIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBuZXEoKmFyZ3MpOgorICAgICAgICByZXR1cm4gUCgibmVxIiwgKmFyZ3MpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG5vdF8oKmFyZ3MpOgorICAgICAgICByZXR1cm4gUCgibm90IiwgKmFyZ3MpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG91dHNpZGUoKmFyZ3MpOgorICAgICAgICByZXR1cm4gUCgib3V0c2lkZSIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiB0ZXN0KCphcmdzKToKKyAgICAgICAgcmV0dXJuIFAoInRlc3QiLCAqYXJncykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgd2l0aGluKCphcmdzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDEgYW5kIHR5cGUoYXJnc1swXSkgPT0gbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBQKCJ3aXRoaW4iLCBhcmdzWzBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFAoIndpdGhpbiIsIGxpc3QoYXJncykpCisgICAgICAgIAorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgd2l0aG91dCgqYXJncyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxIGFuZCB0eXBlKGFyZ3NbMF0pID09IGxpc3Q6CisgICAgICAgICAgICByZXR1cm4gUCgid2l0aG91dCIsIGFyZ3NbMF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gUCgid2l0aG91dCIsIGxpc3QoYXJncykpCisKKyAgICBkZWYgYW5kXyhzZWxmLCBhcmcpOgorICAgICAgICByZXR1cm4gUCgiYW5kIiwgc2VsZiwgYXJnKQorCisgICAgZGVmIG9yXyhzZWxmLCBhcmcpOgorICAgICAgICByZXR1cm4gUCgib3IiLCBzZWxmLCBhcmcpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5vcGVyYXRvciA9PSBvdGhlci5vcGVyYXRvciBhbmQgc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZSBhbmQgc2VsZi5vdGhlciA9PSBvdGhlci5vdGhlcgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vcGVyYXRvciArICIoIiArIHN0cihzZWxmLnZhbHVlKSArICIpIiBpZiBzZWxmLm90aGVyIGlzIE5vbmUgZWxzZSBzZWxmLm9wZXJhdG9yICsgIigiICsgc3RyKHNlbGYudmFsdWUpICsgIiwiICsgc3RyKHNlbGYub3RoZXIpICsgIikiCisKKworZGVmIGJldHdlZW4oKmFyZ3MpOgorICAgIHJldHVybiBQLmJldHdlZW4oKmFyZ3MpCisKKworZGVmIGVxKCphcmdzKToKKyAgICByZXR1cm4gUC5lcSgqYXJncykKKworCitkZWYgZ3QoKmFyZ3MpOgorICAgIHJldHVybiBQLmd0KCphcmdzKQorCisKK2RlZiBndGUoKmFyZ3MpOgorICAgIHJldHVybiBQLmd0ZSgqYXJncykKKworCitkZWYgaW5zaWRlKCphcmdzKToKKyAgICByZXR1cm4gUC5pbnNpZGUoKmFyZ3MpCisKKworZGVmIGx0KCphcmdzKToKKyAgICByZXR1cm4gUC5sdCgqYXJncykKKworCitkZWYgbHRlKCphcmdzKToKKyAgICByZXR1cm4gUC5sdGUoKmFyZ3MpCisKKworZGVmIG5lcSgqYXJncyk6CisgICAgcmV0dXJuIFAubmVxKCphcmdzKQorCisKK2RlZiBub3RfKCphcmdzKToKKyAgICByZXR1cm4gUC5ub3RfKCphcmdzKQorCisKK2RlZiBvdXRzaWRlKCphcmdzKToKKyAgICByZXR1cm4gUC5vdXRzaWRlKCphcmdzKQorCisKK2RlZiB0ZXN0KCphcmdzKToKKyAgICByZXR1cm4gUC50ZXN0KCphcmdzKQorCisKK2RlZiB3aXRoaW4oKmFyZ3MpOgorICAgIHJldHVybiBQLndpdGhpbigqYXJncykKKworCitkZWYgd2l0aG91dCgqYXJncyk6CisgICAgcmV0dXJuIFAud2l0aG91dCgqYXJncykKKworCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2JldHdlZW4nLCBiZXR3ZWVuKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2VxJywgZXEpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnZ3QnLCBndCkKKworc3RhdGljcy5hZGRfc3RhdGljKCdndGUnLCBndGUpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnaW5zaWRlJywgaW5zaWRlKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ2x0JywgbHQpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnbHRlJywgbHRlKQorCitzdGF0aWNzLmFkZF9zdGF0aWMoJ25lcScsIG5lcSkKKworc3RhdGljcy5hZGRfc3RhdGljKCdub3RfJywgbm90XykKKworc3RhdGljcy5hZGRfc3RhdGljKCdvdXRzaWRlJywgb3V0c2lkZSkKKworc3RhdGljcy5hZGRfc3RhdGljKCd0ZXN0JywgdGVzdCkKKworc3RhdGljcy5hZGRfc3RhdGljKCd3aXRoaW4nLCB3aXRoaW4pCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnd2l0aG91dCcsIHdpdGhvdXQpCisKKworY2xhc3MgVGV4dFAoUCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wZXJhdG9yLCB2YWx1ZSwgb3RoZXI9Tm9uZSk6CisgICAgICAgIFAuX19pbml0X18oc2VsZiwgb3BlcmF0b3IsIHZhbHVlLCBvdGhlcikKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgY29udGFpbmluZygqYXJncyk6CisgICAgICAgIHJldHVybiBUZXh0UCgiY29udGFpbmluZyIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBlbmRpbmdXaXRoKCphcmdzKToKKyAgICAgICAgcmV0dXJuIFRleHRQKCJlbmRpbmdXaXRoIiwgKmFyZ3MpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG5vdENvbnRhaW5pbmcoKmFyZ3MpOgorICAgICAgICByZXR1cm4gVGV4dFAoIm5vdENvbnRhaW5pbmciLCAqYXJncykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgbm90RW5kaW5nV2l0aCgqYXJncyk6CisgICAgICAgIHJldHVybiBUZXh0UCgibm90RW5kaW5nV2l0aCIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBub3RTdGFydGluZ1dpdGgoKmFyZ3MpOgorICAgICAgICByZXR1cm4gVGV4dFAoIm5vdFN0YXJ0aW5nV2l0aCIsICphcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBzdGFydGluZ1dpdGgoKmFyZ3MpOgorICAgICAgICByZXR1cm4gVGV4dFAoInN0YXJ0aW5nV2l0aCIsICphcmdzKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYub3BlcmF0b3IgPT0gb3RoZXIub3BlcmF0b3IgYW5kIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUgYW5kIHNlbGYub3RoZXIgPT0gb3RoZXIub3RoZXIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3BlcmF0b3IgKyAiKCIgKyBzdHIoc2VsZi52YWx1ZSkgKyAiKSIgaWYgc2VsZi5vdGhlciBpcyBOb25lIGVsc2Ugc2VsZi5vcGVyYXRvciArICIoIiArIHN0cihzZWxmLnZhbHVlKSArICIsIiArIHN0cihzZWxmLm90aGVyKSArICIpIgorCisKK2RlZiBjb250YWluaW5nKCphcmdzKToKKyAgICByZXR1cm4gVGV4dFAuY29udGFpbmluZygqYXJncykKKworCitkZWYgZW5kaW5nV2l0aCgqYXJncyk6CisgICAgcmV0dXJuIFRleHRQLmVuZGluZ1dpdGgoKmFyZ3MpCisKKworZGVmIG5vdENvbnRhaW5pbmcoKmFyZ3MpOgorICAgIHJldHVybiBUZXh0UC5ub3RDb250YWluaW5nKCphcmdzKQorCisKK2RlZiBub3RFbmRpbmdXaXRoKCphcmdzKToKKyAgICByZXR1cm4gVGV4dFAubm90RW5kaW5nV2l0aCgqYXJncykKKworCitkZWYgbm90U3RhcnRpbmdXaXRoKCphcmdzKToKKyAgICByZXR1cm4gVGV4dFAubm90U3RhcnRpbmdXaXRoKCphcmdzKQorCisKK2RlZiBzdGFydGluZ1dpdGgoKmFyZ3MpOgorICAgIHJldHVybiBUZXh0UC5zdGFydGluZ1dpdGgoKmFyZ3MpCisKKworc3RhdGljcy5hZGRfc3RhdGljKCdjb250YWluaW5nJywgY29udGFpbmluZykKKworc3RhdGljcy5hZGRfc3RhdGljKCdlbmRpbmdXaXRoJywgZW5kaW5nV2l0aCkKKworc3RhdGljcy5hZGRfc3RhdGljKCdub3RDb250YWluaW5nJywgbm90Q29udGFpbmluZykKKworc3RhdGljcy5hZGRfc3RhdGljKCdub3RFbmRpbmdXaXRoJywgbm90RW5kaW5nV2l0aCkKKworc3RhdGljcy5hZGRfc3RhdGljKCdub3RTdGFydGluZ1dpdGgnLCBub3RTdGFydGluZ1dpdGgpCisKK3N0YXRpY3MuYWRkX3N0YXRpYygnc3RhcnRpbmdXaXRoJywgc3RhcnRpbmdXaXRoKQorCisKKworCisnJycKK0lPCisnJycKKworCitjbGFzcyBJTyhvYmplY3QpOgorCisgICAgZ3JhcGhtbCA9ICJncmFwaG1sIgorCisgICAgZ3JhcGhzb24gPSAiZ3JhcGhzb24iCisKKyAgICBncnlvID0gImdyeW8iCisKKyAgICByZWFkZXIgPSAifnRpbmtlcnBvcC5pby5yZWFkZXIiCisKKyAgICByZWdpc3RyeSA9ICJ+dGlua2VycG9wLmlvLnJlZ2lzdHJ5IgorCisgICAgd3JpdGVyID0gIn50aW5rZXJwb3AuaW8ud3JpdGVyIgorCisKKycnJworQ29ubmVjdGVkQ29tcG9uZW50CisnJycKKworCitjbGFzcyBDb25uZWN0ZWRDb21wb25lbnQob2JqZWN0KToKKworICAgIGNvbXBvbmVudCA9ICJncmVtbGluLmNvbm5lY3RlZENvbXBvbmVudFZlcnRleFByb2dyYW0uY29tcG9uZW50IgorCisgICAgZWRnZXMgPSAifnRpbmtlcnBvcC5jb25uZWN0ZWRDb21wb25lbnQuZWRnZXMiCisKKyAgICBwcm9wZXJ0eU5hbWUgPSAifnRpbmtlcnBvcC5jb25uZWN0ZWRDb21wb25lbnQucHJvcGVydHlOYW1lIgorCisKKycnJworU2hvcnRlc3RQYXRoCisnJycKKworCitjbGFzcyBTaG9ydGVzdFBhdGgob2JqZWN0KToKKworICAgIGRpc3RhbmNlID0gIn50aW5rZXJwb3Auc2hvcnRlc3RQYXRoLmRpc3RhbmNlIgorCisgICAgZWRnZXMgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGguZWRnZXMiCisKKyAgICBpbmNsdWRlRWRnZXMgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGguaW5jbHVkZUVkZ2VzIgorCisgICAgbWF4RGlzdGFuY2UgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGgubWF4RGlzdGFuY2UiCisKKyAgICB0YXJnZXQgPSAifnRpbmtlcnBvcC5zaG9ydGVzdFBhdGgudGFyZ2V0IgorCisKKycnJworUGFnZVJhbmsKKycnJworCisKK2NsYXNzIFBhZ2VSYW5rKG9iamVjdCk6CisKKyAgICBlZGdlcyA9ICJ+dGlua2VycG9wLnBhZ2VSYW5rLmVkZ2VzIgorCisgICAgcHJvcGVydHlOYW1lID0gIn50aW5rZXJwb3AucGFnZVJhbmsucHJvcGVydHlOYW1lIgorCisgICAgdGltZXMgPSAifnRpbmtlcnBvcC5wYWdlUmFuay50aW1lcyIKKworCisnJycKK1BlZXJQcmVzc3VyZQorJycnCisKKworY2xhc3MgUGVlclByZXNzdXJlKG9iamVjdCk6CisKKyAgICBlZGdlcyA9ICJ+dGlua2VycG9wLnBlZXJQcmVzc3VyZS5lZGdlcyIKKworICAgIHByb3BlcnR5TmFtZSA9ICJ+dGlua2VycG9wLnBlZXJQcmVzc3VyZS5wcm9wZXJ0eU5hbWUiCisKKyAgICB0aW1lcyA9ICJ+dGlua2VycG9wLnBlZXJQcmVzc3VyZS50aW1lcyIKKworCisnJycKK1RSQVZFUlNFUgorJycnCisKKworY2xhc3MgVHJhdmVyc2VyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iamVjdCwgYnVsaz1Ob25lKToKKyAgICAgICAgaWYgYnVsayBpcyBOb25lOgorICAgICAgICAgICAgYnVsayA9IGxvbmcoMSkKKyAgICAgICAgc2VsZi5vYmplY3QgPSBvYmplY3QKKyAgICAgICAgc2VsZi5idWxrID0gYnVsaworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYub2JqZWN0KQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYub2JqZWN0ID09IG90aGVyLm9iamVjdAorCisKKycnJworVFJBVkVSU0FMIFNUUkFURUdJRVMKKycnJworCisKK2NsYXNzIFRyYXZlcnNhbFN0cmF0ZWdpZXMob2JqZWN0KToKKyAgICBnbG9iYWxfY2FjaGUgPSB7fQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYXZlcnNhbF9zdHJhdGVnaWVzPU5vbmUpOgorICAgICAgICBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzID0gICAgICAgICAgICAgdHJhdmVyc2FsX3N0cmF0ZWdpZXMudHJhdmVyc2FsX3N0cmF0ZWdpZXMgaWYgdHJhdmVyc2FsX3N0cmF0ZWdpZXMgaXMgbm90IE5vbmUgZWxzZSBbXQorCisgICAgZGVmIGFkZF9zdHJhdGVnaWVzKHNlbGYsIHRyYXZlcnNhbF9zdHJhdGVnaWVzKToKKyAgICAgICAgc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcyA9IHNlbGYudHJhdmVyc2FsX3N0cmF0ZWdpZXMgKyB0cmF2ZXJzYWxfc3RyYXRlZ2llcworCisgICAgZGVmIGFwcGx5X3N0cmF0ZWdpZXMoc2VsZiwgdHJhdmVyc2FsKToKKyAgICAgICAgZm9yIHRyYXZlcnNhbF9zdHJhdGVneSBpbiBzZWxmLnRyYXZlcnNhbF9zdHJhdGVnaWVzOgorICAgICAgICAgICAgdHJhdmVyc2FsX3N0cmF0ZWd5LmFwcGx5KHRyYXZlcnNhbCkKKworICAgIGRlZiBhcHBseV9hc3luY19zdHJhdGVnaWVzKHNlbGYsIHRyYXZlcnNhbCk6CisgICAgICAgIGZvciB0cmF2ZXJzYWxfc3RyYXRlZ3kgaW4gc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llczoKKyAgICAgICAgICAgIHRyYXZlcnNhbF9zdHJhdGVneS5hcHBseV9hc3luYyh0cmF2ZXJzYWwpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi50cmF2ZXJzYWxfc3RyYXRlZ2llcykKKworCitjbGFzcyBUcmF2ZXJzYWxTdHJhdGVneShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJhdGVneV9uYW1lPU5vbmUsIGNvbmZpZ3VyYXRpb249Tm9uZSwgZnFjbj1Ob25lKToKKyAgICAgICAgc2VsZi5mcWNuID0gZnFjbgorICAgICAgICBzZWxmLnN0cmF0ZWd5X25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fIGlmIHN0cmF0ZWd5X25hbWUgaXMgTm9uZSBlbHNlIHN0cmF0ZWd5X25hbWUKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0ge30gaWYgY29uZmlndXJhdGlvbiBpcyBOb25lIGVsc2UgY29uZmlndXJhdGlvbgorCisgICAgZGVmIGFwcGx5KHNlbGYsIHRyYXZlcnNhbCk6CisgICAgICAgIHJldHVybgorCisgICAgZGVmIGFwcGx5X2FzeW5jKHNlbGYsIHRyYXZlcnNhbCk6CisgICAgICAgIHJldHVybgorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5zdHJhdGVneV9uYW1lKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdHJhdGVneV9uYW1lCisKKworJycnCitCWVRFQ09ERQorJycnCisKKworY2xhc3MgQnl0ZWNvZGUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZWNvZGU9Tm9uZSk6CisgICAgICAgIHNlbGYuc291cmNlX2luc3RydWN0aW9ucyA9IFtdCisgICAgICAgIHNlbGYuc3RlcF9pbnN0cnVjdGlvbnMgPSBbXQorICAgICAgICBzZWxmLmJpbmRpbmdzID0ge30KKyAgICAgICAgaWYgYnl0ZWNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMgPSBsaXN0KGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMpCisgICAgICAgICAgICBzZWxmLnN0ZXBfaW5zdHJ1Y3Rpb25zID0gbGlzdChieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKKworICAgIGRlZiBhZGRfc291cmNlKHNlbGYsIHNvdXJjZV9uYW1lLCAqYXJncyk6CisgICAgICAgIGluc3RydWN0aW9uID0gW3NvdXJjZV9uYW1lXQorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBpbnN0cnVjdGlvbi5hcHBlbmQoc2VsZi5fX2NvbnZlcnRBcmd1bWVudChhcmcpKQorICAgICAgICBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3RydWN0aW9uKQorCisgICAgZGVmIGFkZF9zdGVwKHNlbGYsIHN0ZXBfbmFtZSwgKmFyZ3MpOgorICAgICAgICBpbnN0cnVjdGlvbiA9IFtzdGVwX25hbWVdCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIGluc3RydWN0aW9uLmFwcGVuZChzZWxmLl9fY29udmVydEFyZ3VtZW50KGFyZykpCisgICAgICAgIHNlbGYuc3RlcF9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3RydWN0aW9uKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZV9pbnN0cnVjdGlvbnMgPT0gb3RoZXIuc291cmNlX2luc3RydWN0aW9ucyBhbmQgc2VsZi5zdGVwX2luc3RydWN0aW9ucyA9PSBvdGhlci5zdGVwX2luc3RydWN0aW9ucworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19jb3B5X18oc2VsZik6CisgICAgICAgIGJiID0gQnl0ZWNvZGUoKQorICAgICAgICBiYi5zb3VyY2VfaW5zdHJ1Y3Rpb25zID0gc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zCisgICAgICAgIGJiLnN0ZXBfaW5zdHJ1Y3Rpb25zID0gc2VsZi5zdGVwX2luc3RydWN0aW9ucworICAgICAgICBiYi5iaW5kaW5ncyA9IHNlbGYuYmluZGluZ3MKKyAgICAgICAgcmV0dXJuIGJiCisKKyAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW89e30pOgorICAgICAgICBiYiA9IEJ5dGVjb2RlKCkKKyAgICAgICAgYmIuc291cmNlX2luc3RydWN0aW9ucyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zb3VyY2VfaW5zdHJ1Y3Rpb25zLCBtZW1vKQorICAgICAgICBiYi5zdGVwX2luc3RydWN0aW9ucyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zdGVwX2luc3RydWN0aW9ucywgbWVtbykKKyAgICAgICAgYmIuYmluZGluZ3MgPSBjb3B5LmRlZXBjb3B5KHNlbGYuYmluZGluZ3MsIG1lbW8pCisgICAgICAgIHJldHVybiBiYgorCisgICAgZGVmIF9fY29udmVydEFyZ3VtZW50KHNlbGYsYXJnKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIFRyYXZlcnNhbCk6CisgICAgICAgICAgICBpZiBhcmcuZ3JhcGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJUaGUgY2hpbGQgdHJhdmVyc2FsIG9mICIgKyBhcmcgKyAiIHdhcyBub3Qgc3Bhd25lZCBhbm9ueW1vdXNseSAtIHVzZSB0aGUgX18gY2xhc3MgcmF0aGVyIHRoYW4gYSBUcmF2ZXJzYWxTb3VyY2UgdG8gY29uc3RydWN0IHRoZSBjaGlsZCB0cmF2ZXJzYWwiKQorICAgICAgICAgICAgc2VsZi5iaW5kaW5ncy51cGRhdGUoYXJnLmJ5dGVjb2RlLmJpbmRpbmdzKQorICAgICAgICAgICAgcmV0dXJuIGFyZy5ieXRlY29kZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYXJnLCBkaWN0KToKKyAgICAgICAgICAgIG5ld0RpY3QgPSB7fQorICAgICAgICAgICAgZm9yIGtleSBpbiBhcmc6CisgICAgICAgICAgICAgICAgbmV3RGljdFtzZWxmLl9fY29udmVydEFyZ3VtZW50KGtleSldID0gc2VsZi5fX2NvbnZlcnRBcmd1bWVudChhcmdba2V5XSkKKyAgICAgICAgICAgIHJldHVybiBuZXdEaWN0CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmcsIGxpc3QpOgorICAgICAgICAgICAgbmV3TGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBhcmc6CisgICAgICAgICAgICAgICAgbmV3TGlzdC5hcHBlbmQoc2VsZi5fX2NvbnZlcnRBcmd1bWVudChpdGVtKSkKKyAgICAgICAgICAgIHJldHVybiBuZXdMaXN0CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmcsIHNldCk6CisgICAgICAgICAgICBuZXdTZXQgPSBzZXQoKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gYXJnOgorICAgICAgICAgICAgICAgIG5ld1NldC5hZGQoc2VsZi5fX2NvbnZlcnRBcmd1bWVudChpdGVtKSkKKyAgICAgICAgICAgIHJldHVybiBuZXdTZXQKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZywgQmluZGluZyk6CisgICAgICAgICAgICBzZWxmLmJpbmRpbmdzW2FyZy5rZXldID0gYXJnLnZhbHVlCisgICAgICAgICAgICByZXR1cm4gQmluZGluZyhhcmcua2V5LCBzZWxmLl9fY29udmVydEFyZ3VtZW50KGFyZy52YWx1ZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gYXJnCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc3RyKHNlbGYuc291cmNlX2luc3RydWN0aW9ucykgaWYgbGVuKHNlbGYuc291cmNlX2luc3RydWN0aW9ucykgPiAwIGVsc2UgIiIpICsgXAorICAgICAgICAgICAgICAgKHN0cihzZWxmLnN0ZXBfaW5zdHJ1Y3Rpb25zKSBpZiBsZW4oc2VsZi5zdGVwX2luc3RydWN0aW9ucykgPiAwIGVsc2UgIiIpCisKKworJycnCitCSU5ESU5HUworJycnCisKKworY2xhc3MgQmluZGluZ3Mob2JqZWN0KToKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgb2Yoa2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgc3RyKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiS2V5IG11c3QgYmUgc3RyIikKKyAgICAgICAgcmV0dXJuIEJpbmRpbmcoa2V5LCB2YWx1ZSkKKworCitjbGFzcyBCaW5kaW5nKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLmtleSA9IGtleQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLmtleSA9PSBvdGhlci5rZXkgYW5kIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5rZXkpICsgaGFzaChzZWxmLnZhbHVlKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gImJpbmRpbmdbIiArIHNlbGYua2V5ICsgIj0iICsgc3RyKHNlbGYudmFsdWUpICsgIl0iCisKKworJycnCitXSVRIIE9QVElPTlMKKycnJworCisKK2NsYXNzIFdpdGhPcHRpb25zKG9iamVjdCk6CisKKyAgICB0b2tlbnMgPSAifnRpbmtlcnBvcC52YWx1ZU1hcC50b2tlbnMiCisKKyAgICBub25lID0gMAorCisgICAgaWRzID0gMQorCisgICAgbGFiZWxzID0gMgorCisgICAga2V5cyA9IDQKKworICAgIHZhbHVlcyA9IDgKKworICAgIGFsbCA9IDE1CisKKyAgICBpbmRleGVyID0gIn50aW5rZXJwb3AuaW5kZXguaW5kZXhlciIKKworICAgIGxpc3QgPSAwCisKKyAgICBtYXAgPSAxCisKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdGF0aWNzLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3N0YXRpY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3YTdhMwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdGF0aWNzLnB5CkBAIC0wLDAgKzEsMTAxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHR5cGVzIGltcG9ydCBGdW5jdGlvblR5cGUKK2Zyb20gYWVudW0gaW1wb3J0IEVudW0KKworCitjbGFzcyBsb25nKGludCk6CisgICAgcGFzcworCisKK0Zsb2F0VHlwZSA9IGZsb2F0CitJbnRUeXBlID0gaW50CitMb25nVHlwZSA9IGxvbmcKK1R5cGVUeXBlID0gdHlwZQorTGlzdFR5cGUgPSBsaXN0CitEaWN0VHlwZSA9IGRpY3QKK1NldFR5cGUgPSBzZXQKK0J5dGVCdWZmZXJUeXBlID0gYnl0ZXMKKworCitjbGFzcyB0aW1lc3RhbXAoZmxvYXQpOgorICAgICIiIgorICAgIEluIFB5dGhvbiBhIHRpbWVzdGFtcCBpcyBzaW1wbHkgYSBmbG9hdC4gVGhpcyBkdW1teSBjbGFzcyAoc2ltaWxhciB0byBsb25nKSwgYWxsb3dzIHVzZXJzIHRvIHdyYXAgYSBmbG9hdAorICAgIGluIGEgR0xWIHNjcmlwdCB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIGlzIHNlcmlhbGl6ZWQgYXMgYSBHcmVtbGluIHRpbWVzdGFtcC4KKyAgICAiIiIKKyAgICBwYXNzCisKKworY2xhc3MgU2luZ2xlQnl0ZShpbnQpOgorICAgICIiIgorICAgIFByb3ZpZGVzIGEgd2F5IHRvIHBhc3MgYSBzaW5nbGUgYnl0ZSB2aWEgR3JlbWxpbi4KKyAgICAiIiIKKyAgICBkZWYgX19uZXdfXyhjbHMsIGIpOgorICAgICAgICBpZiAtMTI4IDw9IGIgPCAxMjg6CisgICAgICAgICAgICBpbnQuX19uZXdfXyhjbHMsIGIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ2YWx1ZSBtdXN0IGJlIGJldHdlZW4gLTEyOCBhbmQgMTI3IGluY2x1c2l2ZSIpCisKKworY2xhc3MgU2luZ2xlQ2hhcihzdHIpOgorICAgICIiIgorICAgIFByb3ZpZGVzIGEgd2F5IHRvIHBhc3MgYSBzaW5nbGUgY2hhcmFjdGVyIHZpYSBHcmVtbGluLgorICAgICIiIgorICAgIGRlZiBfX25ld19fKGNscywgYyk6CisgICAgICAgIGlmIGxlbihiKSA9PSAxOgorICAgICAgICAgICAgc3RyLl9fbmV3X18oY2xzLCBjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RyaW5nIG11c3QgY29udGFpbiBhIHNpbmdsZSBjaGFyYWN0ZXIiKQorCisKK2NsYXNzIEdyZW1saW5UeXBlKG9iamVjdCk6CisgICAgIiIiCisgICAgUHJvdmlkZXMgYSB3YXkgdG8gcmVwcmVzZW50IGEgIkphdmEgY2xhc3MiIGZvciBHcmVtbGluLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmVtbGluX3R5cGUpOgorICAgICAgICBzZWxmLmdyZW1saW5fdHlwZSA9IGdyZW1saW5fdHlwZQorICAgICAgICAKKworc3RhdGljTWV0aG9kcyA9IHt9CitzdGF0aWNFbnVtcyA9IHt9CitkZWZhdWx0X2xhbWJkYV9sYW5ndWFnZSA9ICJncmVtbGluLWdyb292eSIKKworCitkZWYgYWRkX3N0YXRpYyhrZXksIHZhbHVlKToKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBFbnVtKToKKyAgICAgICAgc3RhdGljRW51bXNba2V5XSA9IHZhbHVlCisgICAgZWxzZToKKyAgICAgICAgc3RhdGljTWV0aG9kc1trZXldID0gdmFsdWUKKworCitkZWYgbG9hZF9zdGF0aWNzKGdsb2JhbF9kaWN0KToKKyAgICBmb3Iga2V5IGluIHN0YXRpY01ldGhvZHM6CisgICAgICAgIGdsb2JhbF9kaWN0W2tleV0gPSBzdGF0aWNNZXRob2RzW2tleV0KKyAgICBmb3Iga2V5IGluIHN0YXRpY0VudW1zOgorICAgICAgICBnbG9iYWxfZGljdFtrZXldID0gc3RhdGljRW51bXNba2V5XQorCisKK2RlZiB1bmxvYWRfc3RhdGljcyhnbG9iYWxfZGljdCk6CisgICAgZm9yIGtleSBpbiBzdGF0aWNNZXRob2RzOgorICAgICAgICBpZiBrZXkgaW4gZ2xvYmFsX2RpY3Q6CisgICAgICAgICAgICBkZWwgZ2xvYmFsX2RpY3Rba2V5XQorICAgIGZvciBrZXkgaW4gc3RhdGljRW51bXM6CisgICAgICAgIGlmIGtleSBpbiBnbG9iYWxfZGljdDoKKyAgICAgICAgICAgIGRlbCBnbG9iYWxfZGljdFtrZXldCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL19faW5pdF9fLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9fX2luaXRfXy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9ncmFwaC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvZ3JhcGgucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvZ3JhcGgucHkKcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvZ3JhcGgucHkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vX19pbml0X18ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL19faW5pdF9fLnB5CnJlbmFtZSB0byBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5VjEucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5VjEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhMjU4YQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnlWMS5weQpAQCAtMCwwICsxLDEwODAgQEAKKyIiIgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKyIiIgorCitpbXBvcnQgc2l4CitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBjYWxlbmRhcgoraW1wb3J0IHV1aWQKK2ltcG9ydCBtYXRoCitpbXBvcnQgaW8KK2ltcG9ydCBzdHJ1Y3QKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CitpbXBvcnQgbG9nZ2luZworCitmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCitmcm9tIGFlbnVtIGltcG9ydCBFbnVtCitmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKK2Zyb20gZ3JlbWxpbl9weXRob24gaW1wb3J0IHN0YXRpY3MKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RhdGljcyBpbXBvcnQgRmxvYXRUeXBlLCBGdW5jdGlvblR5cGUsIEludFR5cGUsIExvbmdUeXBlLCBUeXBlVHlwZSwgRGljdFR5cGUsIExpc3RUeXBlLCBTZXRUeXBlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZUJ5dGUsIEJ5dGVCdWZmZXJUeXBlLCBHcmVtbGluVHlwZSwgU2luZ2xlQ2hhcgorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgQmFycmllciwgQmluZGluZywgQnl0ZWNvZGUsIENhcmRpbmFsaXR5LCBDb2x1bW4sIERpcmVjdGlvbiwgT3BlcmF0b3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyLCBQaWNrLCBQb3AsIFAsIFNjb3BlLCBUZXh0UCwgVHJhdmVyc2FsLCBUcmF2ZXJzZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhbFN0cmF0ZWd5LCBUCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBHcmFwaFRyYXZlcnNhbAorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IEdyYXBoLCBFZGdlLCBQcm9wZXJ0eSwgVmVydGV4LCBWZXJ0ZXhQcm9wZXJ0eSwgUGF0aAorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8udXRpbCBpbXBvcnQgSGFzaGFibGVEaWN0CisKK2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisjIFdoZW4gd2UgZmFsbCBiYWNrIHRvIGEgc3VwZXJjbGFzcydzIHNlcmlhbGl6ZXIsIHdlIGl0ZXJhdGUgb3ZlciB0aGlzIG1hcC4KKyMgV2Ugd2FudCB0aGF0IGl0ZXJhdGlvbiBvcmRlciB0byBiZSBjb25zaXN0ZW50LCBzbyB3ZSB1c2UgYW4gT3JkZXJlZERpY3QsCisjIG5vdCBhIGRpY3QuCitfc2VyaWFsaXplcnMgPSBPcmRlcmVkRGljdCgpCitfZGVzZXJpYWxpemVycyA9IHt9CisKKworY2xhc3MgRGF0YVR5cGUoRW51bSk6CisgICAgbnVsbCA9IDB4ZmUKKyAgICBpbnQgPSAweDAxCisgICAgbG9uZyA9IDB4MDIKKyAgICBzdHJpbmcgPSAweDAzCisgICAgZGF0ZSA9IDB4MDQKKyAgICB0aW1lc3RhbXAgPSAweDA1CisgICAgY2xhenogPSAweDA2CisgICAgZG91YmxlID0gMHgwNworICAgIGZsb2F0ID0gMHgwOAorICAgIGxpc3QgPSAweDA5CisgICAgbWFwID0gMHgwYQorICAgIHNldCA9IDB4MGIKKyAgICB1dWlkID0gMHgwYworICAgIGVkZ2UgPSAweDBkCisgICAgcGF0aCA9IDB4MGUKKyAgICBwcm9wZXJ0eSA9IDB4MGYKKyAgICBncmFwaCA9IDB4MTAgICAgICAgICAgICAgICAgICAjIG5vdCBzdXBwb3J0ZWQgLSBubyBncmFwaCBvYmplY3QgaW4gcHl0aG9uIHlldAorICAgIHZlcnRleCA9IDB4MTEKKyAgICB2ZXJ0ZXhwcm9wZXJ0eSA9IDB4MTIKKyAgICBiYXJyaWVyID0gMHgxMworICAgIGJpbmRpbmcgPSAweDE0CisgICAgYnl0ZWNvZGUgPSAweDE1CisgICAgY2FyZGluYWxpdHkgPSAweDE2CisgICAgY29sdW1uID0gMHgxNworICAgIGRpcmVjdGlvbiA9IDB4MTgKKyAgICBvcGVyYXRvciA9IDB4MTkKKyAgICBvcmRlciA9IDB4MWEKKyAgICBwaWNrID0gMHgxYgorICAgIHBvcCA9IDB4MWMKKyAgICBsYW1iZGFfID0gMHgxZAorICAgIHAgPSAweDFlCisgICAgc2NvcGUgPSAweDFmCisgICAgdCA9IDB4MjAKKyAgICB0cmF2ZXJzZXIgPSAweDIxCisgICAgYmlnZGVjaW1hbCA9IDB4MjIgICAgICAgICAgICAgIyB0b2RvCisgICAgYmlnaW50ZWdlciA9IDB4MjMgICAgICAgICAgICAgIyB0b2RvCisgICAgYnl0ZSA9IDB4MjQKKyAgICBieXRlYnVmZmVyID0gMHgyNQorICAgIHNob3J0ID0gMHgyNiAgICAgICAgICAgICAgICAgICMgdG9kbworICAgIGJvb2xlYW4gPSAweDI3CisgICAgdGV4dHAgPSAweDI4CisgICAgdHJhdmVyc2Fsc3RyYXRlZ3kgPSAweDI5CisgICAgYnVsa3NldCA9IDB4MmEKKyAgICB0cmVlID0gMHgyYiAgICAgICAgICAgICAgICAgICAjIG5vdCBzdXBwb3J0ZWQgLSBubyB0cmVlIG9iamVjdCBpbiBQeXRob24geWV0CisgICAgbWV0cmljcyA9IDB4MmMKKyAgICB0cmF2ZXJzYWxtZXRyaWNzID0gMHgyZAorICAgIGNoYXIgPSAweDgwCisgICAgZHVyYXRpb24gPSAweDgxCisgICAgaW5ldGFkZHJlc3MgPSAweDgyICAgICAgICAgICAgIyB0b2RvCisgICAgaW5zdGFudCA9IDB4ODMgICAgICAgICAgICAgICAgIyB0b2RvCisgICAgbG9jYWxkYXRlID0gMHg4NCAgICAgICAgICAgICAgIyB0b2RvCisgICAgbG9jYWxkYXRldGltZSA9IDB4ODUgICAgICAgICAgIyB0b2RvCisgICAgbG9jYWx0aW1lID0gMHg4NiAgICAgICAgICAgICAgIyB0b2RvCisgICAgbW9udGhkYXkgPSAweDg3ICAgICAgICAgICAgICAgIyB0b2RvCisgICAgb2Zmc2V0ZGF0ZXRpbWUgPSAweDg4ICAgICAgICAgIyB0b2RvCisgICAgb2Zmc2V0dGltZSA9IDB4ODkgICAgICAgICAgICAgIyB0b2RvCisgICAgcGVyaW9kID0gMHg4YSAgICAgICAgICAgICAgICAgIyB0b2RvCisgICAgeWVhciA9IDB4OGIgICAgICAgICAgICAgICAgICAgIyB0b2RvCisgICAgeWVhcm1vbnRoID0gMHg4YyAgICAgICAgICAgICAgIyB0b2RvCisgICAgem9uZWRhdGV0aW1lID0gMHg4ZCAgICAgICAgICAgIyB0b2RvCisgICAgem9uZW9mZnNldCA9IDB4OGUgICAgICAgICAgICAgIyB0b2RvCisgICAgY3VzdG9tID0gMHgwMCAgICAgICAgICAgICAgICAgIyB0b2RvCisKKworTlVMTF9CWVRFUyA9IFtEYXRhVHlwZS5udWxsLnZhbHVlLCAweDAxXQorCisKK2RlZiBfbWFrZV9wYWNrZXIoZm9ybWF0X3N0cmluZyk6CisgICAgcGFja2VyID0gc3RydWN0LlN0cnVjdChmb3JtYXRfc3RyaW5nKQorICAgIHBhY2sgPSBwYWNrZXIucGFjaworICAgIHVucGFjayA9IGxhbWJkYSBzOiBwYWNrZXIudW5wYWNrKHMpWzBdCisgICAgcmV0dXJuIHBhY2ssIHVucGFjaworCisKK2ludDY0X3BhY2ssIGludDY0X3VucGFjayA9IF9tYWtlX3BhY2tlcignPnEnKQoraW50MzJfcGFjaywgaW50MzJfdW5wYWNrID0gX21ha2VfcGFja2VyKCc+aScpCitpbnQ4X3BhY2ssIGludDhfdW5wYWNrID0gX21ha2VfcGFja2VyKCc+YicpCit1aW50NjRfcGFjaywgdWludDY0X3VucGFjayA9IF9tYWtlX3BhY2tlcignPlEnKQordWludDhfcGFjaywgdWludDhfdW5wYWNrID0gX21ha2VfcGFja2VyKCc+QicpCitmbG9hdF9wYWNrLCBmbG9hdF91bnBhY2sgPSBfbWFrZV9wYWNrZXIoJz5mJykKK2RvdWJsZV9wYWNrLCBkb3VibGVfdW5wYWNrID0gX21ha2VfcGFja2VyKCc+ZCcpCisKKworY2xhc3MgR3JhcGhCaW5hcnlUeXBlVHlwZSh0eXBlKToKKyAgICBkZWYgX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBkY3QpOgorICAgICAgICBjbHMgPSBzdXBlcihHcmFwaEJpbmFyeVR5cGVUeXBlLCBtY3MpLl9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGN0KQorICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICBpZiBjbHMucHl0aG9uX3R5cGU6CisgICAgICAgICAgICAgICAgX3NlcmlhbGl6ZXJzW2Nscy5weXRob25fdHlwZV0gPSBjbHMKKyAgICAgICAgICAgIGlmIGNscy5ncmFwaGJpbmFyeV90eXBlOgorICAgICAgICAgICAgICAgIF9kZXNlcmlhbGl6ZXJzW2Nscy5ncmFwaGJpbmFyeV90eXBlXSA9IGNscworICAgICAgICByZXR1cm4gY2xzCisKKworY2xhc3MgR3JhcGhCaW5hcnlXcml0ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VyaWFsaXplcl9tYXA9Tm9uZSk6CisgICAgICAgIHNlbGYuc2VyaWFsaXplcnMgPSBfc2VyaWFsaXplcnMuY29weSgpCisgICAgICAgIGlmIHNlcmlhbGl6ZXJfbWFwOgorICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVycy51cGRhdGUoc2VyaWFsaXplcl9tYXApCisKKyAgICBkZWYgd3JpdGVPYmplY3Qoc2VsZiwgb2JqZWN0RGF0YSk6CisgICAgICAgIHJldHVybiBzZWxmLnRvRGljdChvYmplY3REYXRhKQorCisgICAgZGVmIHRvRGljdChzZWxmLCBvYmosIHRvX2V4dGVuZD1Ob25lKToKKyAgICAgICAgaWYgdG9fZXh0ZW5kIGlzIE5vbmU6CisgICAgICAgICAgICB0b19leHRlbmQgPSBieXRlYXJyYXkoKQorCisgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChOVUxMX0JZVEVTKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdCA9IHR5cGUob2JqKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2VyaWFsaXplcnNbdF0uZGljdGlmeShvYmosIHNlbGYsIHRvX2V4dGVuZCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgZm9yIGtleSwgc2VyaWFsaXplciBpbiBzZWxmLnNlcmlhbGl6ZXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGtleSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVyLmRpY3RpZnkob2JqLCBzZWxmLCB0b19leHRlbmQpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGRpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGRpY3QoKHNlbGYudG9EaWN0KGssIHRvX2V4dGVuZCksIHNlbGYudG9EaWN0KHYsIHRvX2V4dGVuZCkpIGZvciBrLCB2IGluIG9iai5pdGVtcygpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBzZXQpOgorICAgICAgICAgICAgcmV0dXJuIHNldChbc2VsZi50b0RpY3QobywgdG9fZXh0ZW5kKSBmb3IgbyBpbiBvYmpdKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBsaXN0KToKKyAgICAgICAgICAgIHJldHVybiBbc2VsZi50b0RpY3QobywgdG9fZXh0ZW5kKSBmb3IgbyBpbiBvYmpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb2JqCisKKworY2xhc3MgR3JhcGhCaW5hcnlSZWFkZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzZXJpYWxpemVyX21hcD1Ob25lKToKKyAgICAgICAgc2VsZi5kZXNlcmlhbGl6ZXJzID0gX2Rlc2VyaWFsaXplcnMuY29weSgpCisgICAgICAgIGlmIGRlc2VyaWFsaXplcl9tYXA6CisgICAgICAgICAgICBzZWxmLmRlc2VyaWFsaXplcnMudXBkYXRlKGRlc2VyaWFsaXplcl9tYXApCisKKyAgICBkZWYgcmVhZE9iamVjdChzZWxmLCBiKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShiLCBieXRlYXJyYXkpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9PYmplY3QoaW8uQnl0ZXNJTyhiKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGIsIGlvLkJ1ZmZlcmVkSU9CYXNlKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRvT2JqZWN0KGIpCisKKyAgICBkZWYgdG9PYmplY3Qoc2VsZiwgYnVmZiwgZGF0YV90eXBlPU5vbmUsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBpZiBkYXRhX3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIGJ0ID0gdWludDhfdW5wYWNrKGJ1ZmYucmVhZCgxKSkKKyAgICAgICAgICAgIGlmIGJ0ID09IERhdGFUeXBlLm51bGwudmFsdWU6CisgICAgICAgICAgICAgICAgaWYgbnVsbGFibGU6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYucmVhZCgxKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZXNlcmlhbGl6ZXJzW0RhdGFUeXBlKGJ0KV0ub2JqZWN0aWZ5KGJ1ZmYsIHNlbGYsIG51bGxhYmxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVzZXJpYWxpemVyc1tkYXRhX3R5cGVdLm9iamVjdGlmeShidWZmLCBzZWxmLCBudWxsYWJsZSkKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoR3JhcGhCaW5hcnlUeXBlVHlwZSkKK2NsYXNzIF9HcmFwaEJpbmFyeVR5cGVJTyhvYmplY3QpOgorICAgIHB5dGhvbl90eXBlID0gTm9uZQorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBOb25lCisKKyAgICBzeW1ib2xNYXAgPSB7Imdsb2JhbF8iOiAiZ2xvYmFsIiwgImFzXyI6ICJhcyIsICJpbl8iOiAiaW4iLCAiYW5kXyI6ICJhbmQiLAorICAgICAgICAgICAgICAgICAib3JfIjogIm9yIiwgImlzXyI6ICJpcyIsICJub3RfIjogIm5vdCIsICJmcm9tXyI6ICJmcm9tIiwKKyAgICAgICAgICAgICAgICAgInNldF8iOiAic2V0IiwgImxpc3RfIjogImxpc3QiLCAiYWxsXyI6ICJhbGwiLCAid2l0aF8iOiAid2l0aCIsCisgICAgICAgICAgICAgICAgICJmaWx0ZXJfIjogImZpbHRlciIsICJpZF8iOiAiaWQiLCAibWF4XyI6ICJtYXgiLCAibWluXyI6ICJtaW4iLCAic3VtXyI6ICJzdW0ifQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHByZWZpeF9ieXRlcyhjbHMsIGdyYXBoYmluX3R5cGUsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlLCB0b19leHRlbmQ9Tm9uZSk6CisgICAgICAgIGlmIHRvX2V4dGVuZCBpcyBOb25lOgorICAgICAgICAgICAgdG9fZXh0ZW5kID0gYnl0ZWFycmF5KCkKKworICAgICAgICBpZiBub3QgYXNfdmFsdWU6CisgICAgICAgICAgICB0b19leHRlbmQgKz0gdWludDhfcGFjayhncmFwaGJpbl90eXBlLnZhbHVlKQorCisgICAgICAgIGlmIG51bGxhYmxlOgorICAgICAgICAgICAgdG9fZXh0ZW5kICs9IGludDhfcGFjaygwKQorCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiByZWFkX2ludChjbHMsIGJ1ZmYpOgorICAgICAgICByZXR1cm4gaW50MzJfdW5wYWNrKGJ1ZmYucmVhZCg0KSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB1bm1hbmdsZV9rZXl3b3JkKGNscywgc3ltYm9sKToKKyAgICAgICAgcmV0dXJuIGNscy5zeW1ib2xNYXAuZ2V0KHN5bWJvbCwgc3ltYm9sKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGlzX251bGwoY2xzLCBidWZmLCByZWFkZXIsIGVsc2Vfb3B0LCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIE5vbmUgaWYgbnVsbGFibGUgYW5kIGJ1ZmYucmVhZCgxKVswXSA9PSAweDAxIGVsc2UgZWxzZV9vcHQoYnVmZiwgcmVhZGVyKQorCisgICAgZGVmIGRpY3RpZnkoc2VsZiwgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBvYmplY3RpZnkoc2VsZiwgZCwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisgICAgICAgIAorCitjbGFzcyBMb25nSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKKworICAgIHB5dGhvbl90eXBlID0gTG9uZ1R5cGUKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUubG9uZworICAgIGJ5dGVfZm9ybWF0X3BhY2sgPSBpbnQ2NF9wYWNrCisgICAgYnl0ZV9mb3JtYXRfdW5wYWNrID0gaW50NjRfdW5wYWNrCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgaWYgb2JqIDwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggb3Igb2JqID4gOTIyMzM3MjAzNjg1NDc3NTgwNzoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVE9ETzogZG9uJ3QgZm9yZ2V0IGJpZ2ludCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2sob2JqKSkKKyAgICAgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IGludDY0X3VucGFjayhidWZmLnJlYWQoOCkpLCBudWxsYWJsZSkKKworCitjbGFzcyBJbnRJTyhMb25nSU8pOgorCisgICAgcHl0aG9uX3R5cGUgPSBJbnRUeXBlCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmludAorICAgIGJ5dGVfZm9ybWF0X3BhY2sgPSBpbnQzMl9wYWNrCisgICAgYnl0ZV9mb3JtYXRfdW5wYWNrID0gaW50MzJfdW5wYWNrCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IGNscy5yZWFkX2ludChiKSwgbnVsbGFibGUpCisKKworY2xhc3MgRGF0ZUlPKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisKKyAgICBweXRob25fdHlwZSA9IGRhdGV0aW1lLmRhdGV0aW1lCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmRhdGUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0aW1lc3RhbXBfc2Vjb25kcyA9IGNhbGVuZGFyLnRpbWVnbShvYmoudXRjdGltZXR1cGxlKCkpCisgICAgICAgICAgICBwdHMgPSB0aW1lc3RhbXBfc2Vjb25kcyAqIDFlMyArIGdldGF0dHIob2JqLCAnbWljcm9zZWNvbmQnLCAwKSAvIDFlMworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwdHMgPSBjYWxlbmRhci50aW1lZ20ob2JqLnRpbWV0dXBsZSgpKSAqIDFlMworCisgICAgICAgIHRzID0gaW50KHJvdW5kKHB0cykpCisgICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQorICAgICAgICB0b19leHRlbmQuZXh0ZW5kKGludDY0X3BhY2sodHMpKQorICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBiLCByOiBkYXRldGltZS5kYXRldGltZS51dGNmcm9tdGltZXN0YW1wKGludDY0X3VucGFjayhiLnJlYWQoOCkpIC8gMTAwMC4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlKQorCisKKyMgQmFzZWQgb24gY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBjbGFzcyBtdXN0IGFsd2F5cyBiZSBkZWNsYXJlZCBiZWZvcmUgRmxvYXRJTy4KKyMgU2VlbXMgcHJldHR5IGZyYWdpbGUgZm9yIGZ1dHVyZSBtYWludGFpbmVycy4gTWF5YmUgbG9vayBpbnRvIHRoaXMuCitjbGFzcyBUaW1lc3RhbXBJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gc3RhdGljcy50aW1lc3RhbXAKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudGltZXN0YW1wCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgIyBKYXZhIHRpbWVzdGFtcCBleHBlY3RzIG1pbGxpc2Vjb25kcyBpbnRlZ2VyIC0gSGF2ZSB0byB1c2UgaW50IGJlY2F1c2Ugb2YgbGVnYWN5IFB5dGhvbgorICAgICAgICB0cyA9IGludChyb3VuZChvYmogKiAxMDAwKSkKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50NjRfcGFjayh0cykpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICAjIFB5dGhvbiB0aW1lc3RhbXAgZXhwZWN0cyBzZWNvbmRzCisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGxhbWJkYSBiLCByOiBzdGF0aWNzLnRpbWVzdGFtcChpbnQ2NF91bnBhY2soYi5yZWFkKDgpKSAvIDEwMDAuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsYWJsZSkKKyAgICAKKworZGVmIF9sb25nX2JpdHNfdG9fZG91YmxlKGJpdHMpOgorICAgIHJldHVybiB1bnBhY2soJ2QnLCBwYWNrKCdRJywgYml0cykpWzBdCisKKworTkFOID0gX2xvbmdfYml0c190b19kb3VibGUoMHg3ZmY4MDAwMDAwMDAwMDAwKQorUE9TSVRJVkVfSU5GSU5JVFkgPSBfbG9uZ19iaXRzX3RvX2RvdWJsZSgweDdmZjAwMDAwMDAwMDAwMDApCitORUdBVElWRV9JTkZJTklUWSA9IF9sb25nX2JpdHNfdG9fZG91YmxlKDB4RmZmMDAwMDAwMDAwMDAwMCkKKworCitjbGFzcyBGbG9hdElPKExvbmdJTyk6CisKKyAgICBweXRob25fdHlwZSA9IEZsb2F0VHlwZQorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5mbG9hdAorICAgIGdyYXBoYmluYXJ5X2Jhc2VfdHlwZSA9IERhdGFUeXBlLmZsb2F0CisgICAgYnl0ZV9mb3JtYXRfcGFjayA9IGZsb2F0X3BhY2sKKyAgICBieXRlX2Zvcm1hdF91bnBhY2sgPSBmbG9hdF91bnBhY2sKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBpZiBtYXRoLmlzbmFuKG9iaik6CisgICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2soTkFOKSkKKyAgICAgICAgZWxpZiBtYXRoLmlzaW5mKG9iaikgYW5kIG9iaiA+IDA6CisgICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2soUE9TSVRJVkVfSU5GSU5JVFkpKQorICAgICAgICBlbGlmIG1hdGguaXNpbmYob2JqKSBhbmQgb2JqIDwgMDoKKyAgICAgICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQorICAgICAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChjbHMuYnl0ZV9mb3JtYXRfcGFjayhORUdBVElWRV9JTkZJTklUWSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoY2xzLmJ5dGVfZm9ybWF0X3BhY2sob2JqKSkKKworICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IGZsb2F0X3VucGFjayhiLnJlYWQoNCkpLCBudWxsYWJsZSkKKworCitjbGFzcyBEb3VibGVJTyhGbG9hdElPKToKKyAgICAiIiIKKyAgICBGbG9hdHMgYmFzaWNhbGx5IGp1c3QgZmFsbCB0aHJvdWdoIHRvIGRvdWJsZSBzZXJpYWxpemF0aW9uLgorICAgICIiIgorCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmRvdWJsZQorICAgIGdyYXBoYmluYXJ5X2Jhc2VfdHlwZSA9IERhdGFUeXBlLmRvdWJsZQorICAgIGJ5dGVfZm9ybWF0X3BhY2sgPSBkb3VibGVfcGFjaworICAgIGJ5dGVfZm9ybWF0X3VucGFjayA9IGRvdWJsZV91bnBhY2sKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBsYW1iZGEgYiwgcjogZG91YmxlX3VucGFjayhiLnJlYWQoOCkpLCBudWxsYWJsZSkKKworCitjbGFzcyBDaGFySU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IFNpbmdsZUNoYXIKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuY2hhcgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlciwgdG9fZXh0ZW5kLCBhc192YWx1ZT1GYWxzZSwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQorICAgICAgICB0b19leHRlbmQuZXh0ZW5kKG9iai5lbmNvZGUoInV0Zi04IikpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfY2hhciwgbnVsbGFibGUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3JlYWRfY2hhcihjbHMsIGIsIHIpOgorICAgICAgICBtYXhfYnl0ZXMgPSA0CisgICAgICAgIHggPSBiLnJlYWQoMSkKKyAgICAgICAgd2hpbGUgbWF4X2J5dGVzID4gMDoKKyAgICAgICAgICAgIG1heF9ieXRlcyA9IG1heF9ieXRlcyAtIDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4geC5kZWNvZGUoInV0Zi04IikKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgeCArPSBiLnJlYWQoMSkKKworCitjbGFzcyBTdHJpbmdJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorCisgICAgcHl0aG9uX3R5cGUgPSBzdHIKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuc3RyaW5nCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIHN0cl9ieXRlcyA9IG9iai5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgdG9fZXh0ZW5kICs9IGludDMyX3BhY2sobGVuKHN0cl9ieXRlcykpCisgICAgICAgIHRvX2V4dGVuZCArPSBzdHJfYnl0ZXMKKyAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGxhbWJkYSBiLCByOiBiLnJlYWQoY2xzLnJlYWRfaW50KGIpKS5kZWNvZGUoInV0Zi04IiksIG51bGxhYmxlKQorCisKK2NsYXNzIExpc3RJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorCisgICAgcHl0aG9uX3R5cGUgPSBsaXN0CisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmxpc3QKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQzMl9wYWNrKGxlbihvYmopKSkKKyAgICAgICAgZm9yIGl0ZW0gaW4gb2JqOgorICAgICAgICAgICAgd3JpdGVyLnRvRGljdChpdGVtLCB0b19leHRlbmQpCisKKyAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF9saXN0LCBudWxsYWJsZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfcmVhZF9saXN0KGNscywgYiwgcik6CisgICAgICAgIHNpemUgPSBjbHMucmVhZF9pbnQoYikKKyAgICAgICAgdGhlX2xpc3QgPSBbXQorICAgICAgICB3aGlsZSBzaXplID4gMDoKKyAgICAgICAgICAgIHRoZV9saXN0LmFwcGVuZChyLnJlYWRPYmplY3QoYikpCisgICAgICAgICAgICBzaXplID0gc2l6ZSAtIDEKKworICAgICAgICByZXR1cm4gdGhlX2xpc3QKKworCitjbGFzcyBTZXREZXNlcmlhbGl6ZXIoTGlzdElPKToKKworICAgIHB5dGhvbl90eXBlID0gU2V0VHlwZQorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5zZXQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gc2V0KExpc3RJTy5vYmplY3RpZnkoYnVmZiwgcmVhZGVyLCBudWxsYWJsZSkpCisKKworY2xhc3MgTWFwSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKKworICAgIHB5dGhvbl90eXBlID0gRGljdFR5cGUKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUubWFwCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisKKyAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQzMl9wYWNrKGxlbihvYmopKSkKKyAgICAgICAgZm9yIGssIHYgaW4gb2JqLml0ZW1zKCk6CisgICAgICAgICAgICB3cml0ZXIudG9EaWN0KGssIHRvX2V4dGVuZCkKKyAgICAgICAgICAgIHdyaXRlci50b0RpY3QodiwgdG9fZXh0ZW5kKQorCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfbWFwLCBudWxsYWJsZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfcmVhZF9tYXAoY2xzLCBiLCByKToKKyAgICAgICAgc2l6ZSA9IGNscy5yZWFkX2ludChiKQorICAgICAgICB0aGVfZGljdCA9IHt9CisgICAgICAgIHdoaWxlIHNpemUgPiAwOgorICAgICAgICAgICAgayA9IEhhc2hhYmxlRGljdC5vZihyLnJlYWRPYmplY3QoYikpCisgICAgICAgICAgICB2ID0gci5yZWFkT2JqZWN0KGIpCisgICAgICAgICAgICB0aGVfZGljdFtrXSA9IHYKKyAgICAgICAgICAgIHNpemUgPSBzaXplIC0gMQorCisgICAgICAgIHJldHVybiB0aGVfZGljdAorCisKK2NsYXNzIFV1aWRJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorCisgICAgcHl0aG9uX3R5cGUgPSB1dWlkLlVVSUQKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudXVpZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlciwgdG9fZXh0ZW5kLCBhc192YWx1ZT1GYWxzZSwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQorICAgICAgICB0b19leHRlbmQuZXh0ZW5kKG9iai5ieXRlcykKKyAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGxhbWJkYSBiLCByOiB1dWlkLlVVSUQoYnl0ZXM9Yi5yZWFkKDE2KSksIG51bGxhYmxlKQorCisKK2NsYXNzIEVkZ2VJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorCisgICAgcHl0aG9uX3R5cGUgPSBFZGdlCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmVkZ2UKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKworICAgICAgICB3cml0ZXIudG9EaWN0KG9iai5pZCwgdG9fZXh0ZW5kKQorICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KG9iai5sYWJlbCwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQorICAgICAgICB3cml0ZXIudG9EaWN0KG9iai5pblYuaWQsIHRvX2V4dGVuZCkKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmouaW5WLmxhYmVsLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCisgICAgICAgIHdyaXRlci50b0RpY3Qob2JqLm91dFYuaWQsIHRvX2V4dGVuZCkKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmoub3V0Vi5sYWJlbCwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQorICAgICAgICB0b19leHRlbmQuZXh0ZW5kKE5VTExfQllURVMpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoTlVMTF9CWVRFUykKKworICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX2VkZ2UsIG51bGxhYmxlKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9yZWFkX2VkZ2UoY2xzLCBiLCByKToKKyAgICAgICAgZWRnZWlkID0gci5yZWFkT2JqZWN0KGIpCisgICAgICAgIGVkZ2VsYmwgPSByLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpCisgICAgICAgIGludiA9IFZlcnRleChyLnJlYWRPYmplY3QoYiksIHIudG9PYmplY3QoYiwgRGF0YVR5cGUuc3RyaW5nLCBGYWxzZSkpCisgICAgICAgIG91dHYgPSBWZXJ0ZXgoci5yZWFkT2JqZWN0KGIpLCByLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpKQorICAgICAgICBlZGdlID0gRWRnZShlZGdlaWQsIG91dHYsIGVkZ2VsYmwsIGludikKKyAgICAgICAgYi5yZWFkKDQpCisgICAgICAgIHJldHVybiBlZGdlCisKKworY2xhc3MgUGF0aElPKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisKKyAgICBweXRob25fdHlwZSA9IFBhdGgKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUucGF0aAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlciwgdG9fZXh0ZW5kLCBhc192YWx1ZT1GYWxzZSwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQorICAgICAgICB3cml0ZXIudG9EaWN0KG9iai5sYWJlbHMsIHRvX2V4dGVuZCkKKyAgICAgICAgd3JpdGVyLnRvRGljdChvYmoub2JqZWN0cywgdG9fZXh0ZW5kKQorICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgbGFtYmRhIGIsIHI6IFBhdGgoci5yZWFkT2JqZWN0KGIpLCByLnJlYWRPYmplY3QoYikpLCBudWxsYWJsZSkKKworCitjbGFzcyBQcm9wZXJ0eUlPKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisKKyAgICBweXRob25fdHlwZSA9IFByb3BlcnR5CisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLnByb3BlcnR5CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIFN0cmluZ0lPLmRpY3RpZnkob2JqLmtleSwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQorICAgICAgICB3cml0ZXIudG9EaWN0KG9iai52YWx1ZSwgdG9fZXh0ZW5kKQorICAgICAgICB0b19leHRlbmQuZXh0ZW5kKE5VTExfQllURVMpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfcHJvcGVydHksIG51bGxhYmxlKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9yZWFkX3Byb3BlcnR5KGNscywgYiwgcik6CisgICAgICAgIHAgPSBQcm9wZXJ0eShyLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpLCByLnJlYWRPYmplY3QoYiksIE5vbmUpCisgICAgICAgIGIucmVhZCgyKQorICAgICAgICByZXR1cm4gcAorCisKK2NsYXNzIFRpbmtlckdyYXBoSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKKworICAgIHB5dGhvbl90eXBlID0gR3JhcGgKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuZ3JhcGgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiVGlua2VyR3JhcGggc2VyaWFsaXphdGlvbiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBncmVtbGluLXB5dGhvbiIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYiwgcmVhZGVyLCBhc192YWx1ZT1GYWxzZSk6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJUaW5rZXJHcmFwaCBkZXNlcmlhbGl6YXRpb24gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgZ3JlbWxpbi1weXRob24iKQorCisKK2NsYXNzIFZlcnRleElPKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisKKyAgICBweXRob25fdHlwZSA9IFZlcnRleAorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS52ZXJ0ZXgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgd3JpdGVyLnRvRGljdChvYmouaWQsIHRvX2V4dGVuZCkKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmoubGFiZWwsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKKyAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChOVUxMX0JZVEVTKQorICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX3ZlcnRleCwgbnVsbGFibGUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3JlYWRfdmVydGV4KGNscywgYiwgcik6CisgICAgICAgIHZlcnRleCA9IFZlcnRleChyLnJlYWRPYmplY3QoYiksIHIudG9PYmplY3QoYiwgRGF0YVR5cGUuc3RyaW5nLCBGYWxzZSkpCisgICAgICAgIGIucmVhZCgyKQorICAgICAgICByZXR1cm4gdmVydGV4CisKKworY2xhc3MgVmVydGV4UHJvcGVydHlJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorCisgICAgcHl0aG9uX3R5cGUgPSBWZXJ0ZXhQcm9wZXJ0eQorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS52ZXJ0ZXhwcm9wZXJ0eQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlciwgdG9fZXh0ZW5kLCBhc192YWx1ZT1GYWxzZSwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIGNscy5wcmVmaXhfYnl0ZXMoY2xzLmdyYXBoYmluYXJ5X3R5cGUsIGFzX3ZhbHVlLCBudWxsYWJsZSwgdG9fZXh0ZW5kKQorICAgICAgICB3cml0ZXIudG9EaWN0KG9iai5pZCwgdG9fZXh0ZW5kKQorICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KG9iai5sYWJlbCwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQorICAgICAgICB3cml0ZXIudG9EaWN0KG9iai52YWx1ZSwgdG9fZXh0ZW5kKQorICAgICAgICB0b19leHRlbmQuZXh0ZW5kKE5VTExfQllURVMpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoTlVMTF9CWVRFUykKKyAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF92ZXJ0ZXhwcm9wZXJ0eSwgbnVsbGFibGUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3JlYWRfdmVydGV4cHJvcGVydHkoY2xzLCBiLCByKToKKyAgICAgICAgdnAgPSBWZXJ0ZXhQcm9wZXJ0eShyLnJlYWRPYmplY3QoYiksIHIudG9PYmplY3QoYiwgRGF0YVR5cGUuc3RyaW5nLCBGYWxzZSksIHIucmVhZE9iamVjdChiKSwgTm9uZSkKKyAgICAgICAgYi5yZWFkKDQpCisgICAgICAgIHJldHVybiB2cAorCisKK2NsYXNzIF9FbnVtSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShjbHMudW5tYW5nbGVfa2V5d29yZChzdHIob2JqLm5hbWUpKSwgd3JpdGVyLCB0b19leHRlbmQpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfZW51bXZhbCwgbnVsbGFibGUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3JlYWRfZW51bXZhbChjbHMsIGIsIHIpOgorICAgICAgICBlbnVtX25hbWUgPSByLnRvT2JqZWN0KGIpCisgICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGVbZW51bV9uYW1lXQorCisKK2NsYXNzIEJhcnJpZXJJTyhfRW51bUlPKToKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuYmFycmllcgorICAgIHB5dGhvbl90eXBlID0gQmFycmllcgorCisKK2NsYXNzIENhcmRpbmFsaXR5SU8oX0VudW1JTyk6CisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmNhcmRpbmFsaXR5CisgICAgcHl0aG9uX3R5cGUgPSBDYXJkaW5hbGl0eQorCisKK2NsYXNzIENvbHVtbklPKF9FbnVtSU8pOgorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5jb2x1bW4KKyAgICBweXRob25fdHlwZSA9IENvbHVtbgorCisKK2NsYXNzIERpcmVjdGlvbklPKF9FbnVtSU8pOgorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5kaXJlY3Rpb24KKyAgICBweXRob25fdHlwZSA9IERpcmVjdGlvbgorCisKK2NsYXNzIE9wZXJhdG9ySU8oX0VudW1JTyk6CisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLm9wZXJhdG9yCisgICAgcHl0aG9uX3R5cGUgPSBPcGVyYXRvcgorCisKK2NsYXNzIE9yZGVySU8oX0VudW1JTyk6CisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLm9yZGVyCisgICAgcHl0aG9uX3R5cGUgPSBPcmRlcgorCisKK2NsYXNzIFBpY2tJTyhfRW51bUlPKToKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUucGljaworICAgIHB5dGhvbl90eXBlID0gUGljaworCisKK2NsYXNzIFBvcElPKF9FbnVtSU8pOgorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5wb3AKKyAgICBweXRob25fdHlwZSA9IFBvcAorCisKK2NsYXNzIEJpbmRpbmdJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorCisgICAgcHl0aG9uX3R5cGUgPSBCaW5kaW5nCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmJpbmRpbmcKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmoua2V5LCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCisgICAgICAgIHdyaXRlci50b0RpY3Qob2JqLnZhbHVlLCB0b19leHRlbmQpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBsYW1iZGEgYiwgcjogQmluZGluZyhyLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZE9iamVjdChiKSksIG51bGxhYmxlKQorCisKK2NsYXNzIEJ5dGVjb2RlSU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IEJ5dGVjb2RlCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmJ5dGVjb2RlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIGJjID0gb2JqLmJ5dGVjb2RlIGlmIGlzaW5zdGFuY2Uob2JqLCBUcmF2ZXJzYWwpIGVsc2Ugb2JqCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhsZW4oYmMuc3RlcF9pbnN0cnVjdGlvbnMpKSkKKyAgICAgICAgZm9yIGluc3QgaW4gYmMuc3RlcF9pbnN0cnVjdGlvbnM6CisgICAgICAgICAgICBpbnN0X25hbWUsIGluc3RfYXJncyA9IGluc3RbMF0sIGluc3RbMTpdIGlmIGxlbihpbnN0KSA+IDEgZWxzZSBbXQorICAgICAgICAgICAgU3RyaW5nSU8uZGljdGlmeShpbnN0X25hbWUsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKKyAgICAgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhsZW4oaW5zdF9hcmdzKSkpCisgICAgICAgICAgICBmb3IgYXJnIGluIGluc3RfYXJnczoKKyAgICAgICAgICAgICAgICB3cml0ZXIudG9EaWN0KGFyZywgdG9fZXh0ZW5kKQorCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhsZW4oYmMuc291cmNlX2luc3RydWN0aW9ucykpKQorICAgICAgICBmb3IgaW5zdCBpbiBiYy5zb3VyY2VfaW5zdHJ1Y3Rpb25zOgorICAgICAgICAgICAgaW5zdF9uYW1lLCBpbnN0X2FyZ3MgPSBpbnN0WzBdLCBpbnN0WzE6XSBpZiBsZW4oaW5zdCkgPiAxIGVsc2UgW10KKyAgICAgICAgICAgIFN0cmluZ0lPLmRpY3RpZnkoaW5zdF9uYW1lLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCisgICAgICAgICAgICB0b19leHRlbmQuZXh0ZW5kKGludDMyX3BhY2sobGVuKGluc3RfYXJncykpKQorICAgICAgICAgICAgZm9yIGFyZyBpbiBpbnN0X2FyZ3M6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIFR5cGVUeXBlKToKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnRvRGljdChHcmVtbGluVHlwZShhcmcoKS5mcWNuKSwgdG9fZXh0ZW5kKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci50b0RpY3QoYXJnLCB0b19leHRlbmQpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfYnl0ZWNvZGUsIG51bGxhYmxlKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9yZWFkX2J5dGVjb2RlKGNscywgYiwgcik6CisgICAgICAgIGJ5dGVjb2RlID0gQnl0ZWNvZGUoKQorCisgICAgICAgIHN0ZXBfY291bnQgPSBjbHMucmVhZF9pbnQoYikKKyAgICAgICAgaXggPSAwCisgICAgICAgIHdoaWxlIGl4IDwgc3RlcF9jb3VudDoKKyAgICAgICAgICAgIGluc3QgPSBbci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKV0KKyAgICAgICAgICAgIGluc3RfY3QgPSBjbHMucmVhZF9pbnQoYikKKyAgICAgICAgICAgIGl5ID0gMAorICAgICAgICAgICAgd2hpbGUgaXkgPCBpbnN0X2N0OgorICAgICAgICAgICAgICAgIGluc3QuYXBwZW5kKHIucmVhZE9iamVjdChiKSkKKyAgICAgICAgICAgICAgICBpeSArPSAxCisgICAgICAgICAgICBieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucy5hcHBlbmQoaW5zdCkKKyAgICAgICAgICAgIGl4ICs9IDEKKworICAgICAgICBzb3VyY2VfY291bnQgPSBjbHMucmVhZF9pbnQoYikKKyAgICAgICAgaXggPSAwCisgICAgICAgIHdoaWxlIGl4IDwgc291cmNlX2NvdW50OgorICAgICAgICAgICAgaW5zdCA9IFtyLnRvT2JqZWN0KGIsIERhdGFUeXBlLnN0cmluZywgRmFsc2UpXQorICAgICAgICAgICAgaW5zdF9jdCA9IGNscy5yZWFkX2ludChiKQorICAgICAgICAgICAgaXkgPSAwCisgICAgICAgICAgICB3aGlsZSBpeSA8IGluc3RfY3Q6CisgICAgICAgICAgICAgICAgaW5zdC5hcHBlbmQoci5yZWFkT2JqZWN0KGIpKQorICAgICAgICAgICAgICAgIGl5ICs9IDEKKyAgICAgICAgICAgIGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMuYXBwZW5kKGluc3QpCisgICAgICAgICAgICBpeCArPSAxCisKKyAgICAgICAgcmV0dXJuIGJ5dGVjb2RlCisKKworY2xhc3MgVHJhdmVyc2FsSU8oQnl0ZWNvZGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBHcmFwaFRyYXZlcnNhbAorCisKK2NsYXNzIExhbWJkYVNlcmlhbGl6ZXIoX0dyYXBoQmluYXJ5VHlwZUlPKToKKworICAgIHB5dGhvbl90eXBlID0gRnVuY3Rpb25UeXBlCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmxhbWJkYV8KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKworICAgICAgICBsYW1iZGFfcmVzdWx0ID0gb2JqKCkKKyAgICAgICAgc2NyaXB0ID0gbGFtYmRhX3Jlc3VsdCBpZiBpc2luc3RhbmNlKGxhbWJkYV9yZXN1bHQsIHN0cikgZWxzZSBsYW1iZGFfcmVzdWx0WzBdCisgICAgICAgIGxhbmd1YWdlID0gc3RhdGljcy5kZWZhdWx0X2xhbWJkYV9sYW5ndWFnZSBpZiBpc2luc3RhbmNlKGxhbWJkYV9yZXN1bHQsIHN0cikgZWxzZSBsYW1iZGFfcmVzdWx0WzFdCisKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShsYW5ndWFnZSwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQorCisgICAgICAgIHNjcmlwdF9jbGVhbmVkID0gc2NyaXB0CisgICAgICAgIHNjcmlwdF9hcmdzID0gLTEKKworICAgICAgICBpZiBsYW5ndWFnZSA9PSAiZ3JlbWxpbi1ncm9vdnkiIGFuZCAiLT4iIGluIHNjcmlwdDoKKyAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgYWRkZWQgcGFyYW1ldGVycyB0byB0aGUgZ3Jvb3Z5IGNsb3N1cmUgdGhlbiB3ZSBjYW4gZWFzaWx5IGRldGVjdCBvbmUgb3IgdHdvCisgICAgICAgICAgICAjIGFyZyBsYW1iZGFzIC0gaWYgd2UgY2FuJ3QgZGV0ZWN0IDEgb3IgMiB0aGVuIHdlIGp1c3QgZ28gd2l0aCAidW5rbm93biIKKyAgICAgICAgICAgIGFyZ3MgPSBzY3JpcHRbMDpzY3JpcHQuZmluZCgiLT4iKV0KKyAgICAgICAgICAgIHNjcmlwdF9hcmdzID0gMiBpZiAiLCIgaW4gYXJncyBlbHNlIDEKKworICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KHNjcmlwdF9jbGVhbmVkLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhzY3JpcHRfYXJncykpCisKKyAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAorCisKK2NsYXNzIFBTZXJpYWxpemVyKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLnAKKyAgICBweXRob25fdHlwZSA9IFAKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKworICAgICAgICBTdHJpbmdJTy5kaWN0aWZ5KG9iai5vcGVyYXRvciwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQorCisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBpZiBvYmoub3RoZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLnZhbHVlLCBMaXN0VHlwZSk6CisgICAgICAgICAgICAgICAgYXJncyA9IG9iai52YWx1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcmdzLmFwcGVuZChvYmoudmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzLmFwcGVuZChvYmoudmFsdWUpCisgICAgICAgICAgICBhcmdzLmFwcGVuZChvYmoub3RoZXIpCisKKyAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQzMl9wYWNrKGxlbihhcmdzKSkpCisgICAgICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgICAgICB3cml0ZXIudG9EaWN0KGEsIHRvX2V4dGVuZCkKKworICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCisKKworY2xhc3MgU2NvcGVJTyhfRW51bUlPKToKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUuc2NvcGUKKyAgICBweXRob25fdHlwZSA9IFNjb3BlCisKKworY2xhc3MgVElPKF9FbnVtSU8pOgorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS50CisgICAgcHl0aG9uX3R5cGUgPSBUCisKKworY2xhc3MgVHJhdmVyc2VySU8oX0dyYXBoQmluYXJ5VHlwZUlPKToKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudHJhdmVyc2VyCisgICAgcHl0aG9uX3R5cGUgPSBUcmF2ZXJzZXIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgdG9fZXh0ZW5kLmV4dGVuZChpbnQ2NF9wYWNrKG9iai5idWxrKSkKKyAgICAgICAgd3JpdGVyLnRvRGljdChvYmoub2JqZWN0LCB0b19leHRlbmQpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLCBjbHMuX3JlYWRfdHJhdmVyc2VyLCBudWxsYWJsZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfcmVhZF90cmF2ZXJzZXIoY2xzLCBiLCByKToKKyAgICAgICAgYnVsayA9IGludDY0X3VucGFjayhiLnJlYWQoOCkpCisgICAgICAgIG9iaiA9IHIucmVhZE9iamVjdChiKQorICAgICAgICByZXR1cm4gVHJhdmVyc2VyKG9iaiwgYnVsaz1idWxrKQorCisKK2NsYXNzIEJ5dGVJTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gU2luZ2xlQnl0ZQorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5ieXRlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50OF9wYWNrKG9iaikpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIGIsIHI6IGludC5fX25ld19fKFNpbmdsZUJ5dGUsIGludDhfdW5wYWNrKGIucmVhZCgxKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGUpCisKKworY2xhc3MgQnl0ZUJ1ZmZlcklPKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBCeXRlQnVmZmVyVHlwZQorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5ieXRlYnVmZmVyCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhsZW4ob2JqKSkpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQob2JqKQorICAgICAgICByZXR1cm4gdG9fZXh0ZW5kCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX2J5dGVidWZmZXIsIG51bGxhYmxlKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9yZWFkX2J5dGVidWZmZXIoY2xzLCBiLCByKToKKyAgICAgICAgc2l6ZSA9IGNscy5yZWFkX2ludChiKQorICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclR5cGUoYi5yZWFkKHNpemUpKQorCisKK2NsYXNzIEJvb2xlYW5JTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gYm9vbAorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5ib29sZWFuCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50OF9wYWNrKDB4MDEgaWYgb2JqIGVsc2UgMHgwMCkpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBidWZmLCByZWFkZXIsIG51bGxhYmxlPVRydWUpOgorICAgICAgICByZXR1cm4gY2xzLmlzX251bGwoYnVmZiwgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIGIsIHI6IFRydWUgaWYgaW50OF91bnBhY2soYi5yZWFkKDEpKSA9PSAweDAxIGVsc2UgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsYWJsZSkKKworCitjbGFzcyBUZXh0UFNlcmlhbGl6ZXIoX0dyYXBoQmluYXJ5VHlwZUlPKToKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudGV4dHAKKyAgICBweXRob25fdHlwZSA9IFRleHRQCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmoub3BlcmF0b3IsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKKworICAgICAgICBhcmdzID0gW10KKyAgICAgICAgaWYgb2JqLm90aGVyIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iai52YWx1ZSwgTGlzdFR5cGUpOgorICAgICAgICAgICAgICAgIGFyZ3MgPSBvYmoudmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQob2JqLnZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncy5hcHBlbmQob2JqLnZhbHVlKQorICAgICAgICAgICAgYXJncy5hcHBlbmQob2JqLm90aGVyKQorCisgICAgICAgIHRvX2V4dGVuZC5leHRlbmQoaW50MzJfcGFjayhsZW4oYXJncykpKQorICAgICAgICBmb3IgYSBpbiBhcmdzOgorICAgICAgICAgICAgd3JpdGVyLnRvRGljdChhLCB0b19leHRlbmQpCisKKyAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAorCisKK2NsYXNzIEJ1bGtTZXREZXNlcmlhbGl6ZXIoX0dyYXBoQmluYXJ5VHlwZUlPKToKKworICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5idWxrc2V0CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgYnVmZiwgcmVhZGVyLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgcmV0dXJuIGNscy5pc19udWxsKGJ1ZmYsIHJlYWRlciwgY2xzLl9yZWFkX2J1bGtzZXQsIG51bGxhYmxlKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9yZWFkX2J1bGtzZXQoY2xzLCBiLCByKToKKyAgICAgICAgc2l6ZSA9IGNscy5yZWFkX2ludChiKQorICAgICAgICB0aGVfbGlzdCA9IFtdCisgICAgICAgIHdoaWxlIHNpemUgPiAwOgorICAgICAgICAgICAgaXRtID0gci5yZWFkT2JqZWN0KGIpCisgICAgICAgICAgICBidWxrID0gaW50NjRfdW5wYWNrKGIucmVhZCg4KSkKKyAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKGJ1bGspOgorICAgICAgICAgICAgICAgIHRoZV9saXN0LmFwcGVuZChpdG0pICAgICAgICAgICAgCisgICAgICAgICAgICBzaXplID0gc2l6ZSAtIDEKKworICAgICAgICByZXR1cm4gdGhlX2xpc3QKKworCitjbGFzcyBNZXRyaWNzRGVzZXJpYWxpemVyKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUubWV0cmljcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF9tZXRyaWNzLCBudWxsYWJsZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfcmVhZF9tZXRyaWNzKGNscywgYiwgcik6CisgICAgICAgIG1ldHJpY2lkID0gci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKQorICAgICAgICBuYW1lID0gci50b09iamVjdChiLCBEYXRhVHlwZS5zdHJpbmcsIEZhbHNlKQorICAgICAgICBkdXJhdGlvbiA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUubG9uZywgbnVsbGFibGU9RmFsc2UpCisgICAgICAgIGNvdW50cyA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUubWFwLCBudWxsYWJsZT1GYWxzZSkKKyAgICAgICAgYW5ub3RhdGlvbnMgPSByLnRvT2JqZWN0KGIsIERhdGFUeXBlLm1hcCwgbnVsbGFibGU9RmFsc2UpCisgICAgICAgIG1ldHJpY3MgPSByLnRvT2JqZWN0KGIsIERhdGFUeXBlLmxpc3QsIG51bGxhYmxlPUZhbHNlKQorCisgICAgICAgIHJldHVybiB7ImlkIjogbWV0cmljaWQsCisgICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAorICAgICAgICAgICAgICAgICJkdXIiOiBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAiY291bnRzIjogY291bnRzLAorICAgICAgICAgICAgICAgICJhbm5vdGF0aW9ucyI6IGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICJtZXRyaWNzIjogbWV0cmljc30KKworCitjbGFzcyBUcmF2ZXJzYWxNZXRyaWNzRGVzZXJpYWxpemVyKF9HcmFwaEJpbmFyeVR5cGVJTyk6CisKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudHJhdmVyc2FsbWV0cmljcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF90cmF2ZXJzYWxtZXRyaWNzLCBudWxsYWJsZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfcmVhZF90cmF2ZXJzYWxtZXRyaWNzKGNscywgYiwgcik6CisgICAgICAgIGR1cmF0aW9uID0gci50b09iamVjdChiLCBEYXRhVHlwZS5sb25nLCBudWxsYWJsZT1GYWxzZSkKKyAgICAgICAgbWV0cmljcyA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUubGlzdCwgbnVsbGFibGU9RmFsc2UpCisKKyAgICAgICAgcmV0dXJuIHsiZHVyIjogZHVyYXRpb24sCisgICAgICAgICAgICAgICAgIm1ldHJpY3MiOiBtZXRyaWNzfQorCisKK2NsYXNzIENsYXNzU2VyaWFsaXplcihfR3JhcGhCaW5hcnlUeXBlSU8pOgorICAgIGdyYXBoYmluYXJ5X3R5cGUgPSBEYXRhVHlwZS5jbGF6egorICAgIHB5dGhvbl90eXBlID0gR3JlbWxpblR5cGUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIsIHRvX2V4dGVuZCwgYXNfdmFsdWU9RmFsc2UsIG51bGxhYmxlPVRydWUpOgorICAgICAgICBjbHMucHJlZml4X2J5dGVzKGNscy5ncmFwaGJpbmFyeV90eXBlLCBhc192YWx1ZSwgbnVsbGFibGUsIHRvX2V4dGVuZCkKKyAgICAgICAgU3RyaW5nSU8uZGljdGlmeShvYmouZ3JlbWxpbl90eXBlLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworCitjbGFzcyBUcmF2ZXJzYWxTdHJhdGVneVNlcmlhbGl6ZXIoX0dyYXBoQmluYXJ5VHlwZUlPKToKKyAgICBncmFwaGJpbmFyeV90eXBlID0gRGF0YVR5cGUudHJhdmVyc2Fsc3RyYXRlZ3kKKyAgICBweXRob25fdHlwZSA9IFRyYXZlcnNhbFN0cmF0ZWd5CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisKKyAgICAgICAgQ2xhc3NTZXJpYWxpemVyLmRpY3RpZnkoR3JlbWxpblR5cGUob2JqLmZxY24pLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCisgICAgICAgIGNvbmYgPSB7azogY2xzLl9jb252ZXJ0KHYpIGZvciBrLCB2IGluIG9iai5jb25maWd1cmF0aW9uLml0ZW1zKCl9CisgICAgICAgIE1hcElPLmRpY3RpZnkoY29uZiwgd3JpdGVyLCB0b19leHRlbmQsIFRydWUsIEZhbHNlKQorCisgICAgICAgIHJldHVybiB0b19leHRlbmQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfY29udmVydChjbHMsIHYpOgorICAgICAgICByZXR1cm4gdi5ieXRlY29kZSBpZiBpc2luc3RhbmNlKHYsIFRyYXZlcnNhbCkgZWxzZSB2CisKKworY2xhc3MgRHVyYXRpb25JTyhfR3JhcGhCaW5hcnlUeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gdGltZWRlbHRhCisgICAgZ3JhcGhiaW5hcnlfdHlwZSA9IERhdGFUeXBlLmR1cmF0aW9uCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyLCB0b19leHRlbmQsIGFzX3ZhbHVlPUZhbHNlLCBudWxsYWJsZT1UcnVlKToKKyAgICAgICAgY2xzLnByZWZpeF9ieXRlcyhjbHMuZ3JhcGhiaW5hcnlfdHlwZSwgYXNfdmFsdWUsIG51bGxhYmxlLCB0b19leHRlbmQpCisgICAgICAgIExvbmdJTy5kaWN0aWZ5KG9iai5zZWNvbmRzLCB3cml0ZXIsIHRvX2V4dGVuZCwgVHJ1ZSwgRmFsc2UpCisgICAgICAgIEludElPLmRpY3RpZnkob2JqLm1pY3Jvc2Vjb25kcyAqIDEwMDAsIHdyaXRlciwgdG9fZXh0ZW5kLCBUcnVlLCBGYWxzZSkKKyAgICAgICAgcmV0dXJuIHRvX2V4dGVuZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGJ1ZmYsIHJlYWRlciwgbnVsbGFibGU9VHJ1ZSk6CisgICAgICAgIHJldHVybiBjbHMuaXNfbnVsbChidWZmLCByZWFkZXIsIGNscy5fcmVhZF9kdXJhdGlvbiwgbnVsbGFibGUpCisgICAgCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9yZWFkX2R1cmF0aW9uKGNscywgYiwgcik6CisgICAgICAgIHNlY29uZHMgPSByLnRvT2JqZWN0KGIsIERhdGFUeXBlLmxvbmcsIEZhbHNlKQorICAgICAgICBuYW5vcyA9IHIudG9PYmplY3QoYiwgRGF0YVR5cGUuaW50LCBGYWxzZSkKKyAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShzZWNvbmRzPXNlY29uZHMsIG1pY3Jvc2Vjb25kcz1uYW5vcyAvIDEwMDApCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uVjJkMC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb25WMmQwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDE4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uVjJkMC5weQpAQCAtMCwwICsxLDYzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY2FsZW5kYXIKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGpzb24KK2ltcG9ydCB1dWlkCitpbXBvcnQgbWF0aAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2Zyb20gZGVjaW1hbCBpbXBvcnQgKgorZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCisKK2ltcG9ydCBzaXgKK2Zyb20gYWVudW0gaW1wb3J0IEVudW0KK2Zyb20gaXNvZGF0ZSBpbXBvcnQgcGFyc2VfZHVyYXRpb24sIGR1cmF0aW9uX2lzb2Zvcm1hdAorCitmcm9tIGdyZW1saW5fcHl0aG9uIGltcG9ydCBzdGF0aWNzCitmcm9tIGdyZW1saW5fcHl0aG9uLnN0YXRpY3MgaW1wb3J0IEZsb2F0VHlwZSwgRnVuY3Rpb25UeXBlLCBJbnRUeXBlLCBMb25nVHlwZSwgVHlwZVR5cGUsIFNpbmdsZUJ5dGUsIEJ5dGVCdWZmZXJUeXBlLCBTaW5nbGVDaGFyCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBCaW5kaW5nLCBCeXRlY29kZSwgUCwgVGV4dFAsIFRyYXZlcnNhbCwgVHJhdmVyc2VyLCBUcmF2ZXJzYWxTdHJhdGVneQorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IEVkZ2UsIFByb3BlcnR5LCBWZXJ0ZXgsIFZlcnRleFByb3BlcnR5LCBQYXRoCisKKyMgV2hlbiB3ZSBmYWxsIGJhY2sgdG8gYSBzdXBlcmNsYXNzJ3Mgc2VyaWFsaXplciwgd2UgaXRlcmF0ZSBvdmVyIHRoaXMgbWFwLgorIyBXZSB3YW50IHRoYXQgaXRlcmF0aW9uIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQsIHNvIHdlIHVzZSBhbiBPcmRlcmVkRGljdCwKKyMgbm90IGEgZGljdC4KK19zZXJpYWxpemVycyA9IE9yZGVyZWREaWN0KCkKK19kZXNlcmlhbGl6ZXJzID0ge30KKworCitjbGFzcyBHcmFwaFNPTlR5cGVUeXBlKHR5cGUpOgorICAgIGRlZiBfX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIGRjdCk6CisgICAgICAgIGNscyA9IHN1cGVyKEdyYXBoU09OVHlwZVR5cGUsIG1jcykuX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBkY3QpCisgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKToKKyAgICAgICAgICAgIGlmIGNscy5weXRob25fdHlwZToKKyAgICAgICAgICAgICAgICBfc2VyaWFsaXplcnNbY2xzLnB5dGhvbl90eXBlXSA9IGNscworICAgICAgICAgICAgaWYgY2xzLmdyYXBoc29uX3R5cGU6CisgICAgICAgICAgICAgICAgX2Rlc2VyaWFsaXplcnNbY2xzLmdyYXBoc29uX3R5cGVdID0gY2xzCisgICAgICAgIHJldHVybiBjbHMKKworCitjbGFzcyBHcmFwaFNPTlV0aWwob2JqZWN0KToKKyAgICBUWVBFX0tFWSA9ICJAdHlwZSIKKyAgICBWQUxVRV9LRVkgPSAiQHZhbHVlIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHR5cGVkVmFsdWUoY2xzLCB0eXBlX25hbWUsIHZhbHVlLCBwcmVmaXg9ImciKToKKyAgICAgICAgb3V0ID0ge2Nscy5UWVBFX0tFWTogY2xzLmZvcm1hdFR5cGUocHJlZml4LCB0eXBlX25hbWUpfQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dFtjbHMuVkFMVUVfS0VZXSA9IHZhbHVlCisgICAgICAgIHJldHVybiBvdXQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmb3JtYXRUeXBlKGNscywgcHJlZml4LCB0eXBlX25hbWUpOgorICAgICAgICByZXR1cm4gIiVzOiVzIiAlIChwcmVmaXgsIHR5cGVfbmFtZSkKKworCisjIFJlYWQvV3JpdGUgY2xhc3NlcyBzcGxpdCB0byBmb2xsb3cgcHJlY2VkZW5jZSBvZiB0aGUgSmF2YSBBUEkKK2NsYXNzIEdyYXBoU09OV3JpdGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcmlhbGl6ZXJfbWFwPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgOnBhcmFtIHNlcmlhbGl6ZXJfbWFwOiBtYXAgZnJvbSBQeXRob24gdHlwZSB0byBzZXJpYWxpemVyIGluc3RhbmNlIGltcGxlbWVudGluZyBgZGljdGlmeWAKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc2VyaWFsaXplcnMgPSBfc2VyaWFsaXplcnMuY29weSgpCisgICAgICAgIGlmIHNlcmlhbGl6ZXJfbWFwOgorICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVycy51cGRhdGUoc2VyaWFsaXplcl9tYXApCisKKyAgICBkZWYgd3JpdGVPYmplY3Qoc2VsZiwgb2JqZWN0RGF0YSk6CisgICAgICAgICMgdG8gSlNPTgorICAgICAgICByZXR1cm4ganNvbi5kdW1wcyhzZWxmLnRvRGljdChvYmplY3REYXRhKSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQorCisgICAgZGVmIHRvRGljdChzZWxmLCBvYmopOgorICAgICAgICAiIiIKKyAgICAgICAgRW5jb2RlcyBweXRob24gb2JqZWN0cyBpbiBHcmFwaFNPTiB0eXBlLXRhZ2dlZCBkaWN0IHZhbHVlcworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2VyaWFsaXplcnNbdHlwZShvYmopXS5kaWN0aWZ5KG9iaiwgc2VsZikKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgZm9yIGtleSwgc2VyaWFsaXplciBpbiBzZWxmLnNlcmlhbGl6ZXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGtleSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVyLmRpY3RpZnkob2JqLCBzZWxmKQorCisgICAgICAgICMgbGlzdCBhbmQgbWFwIGFyZSB0cmVhdGVkIGFzIG5vcm1hbCBqc29uIG9ianMgKGNvdWxkIGJlIGlzb2xhdGVkIHNlcmlhbGl6ZXJzKQorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgKGxpc3QsIHNldCkpOgorICAgICAgICAgICAgcmV0dXJuIFtzZWxmLnRvRGljdChvKSBmb3IgbyBpbiBvYmpdCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIGRpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGRpY3QoKHNlbGYudG9EaWN0KGspLCBzZWxmLnRvRGljdCh2KSkgZm9yIGssIHYgaW4gb2JqLml0ZW1zKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb2JqCisKKworY2xhc3MgR3JhcGhTT05SZWFkZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzZXJpYWxpemVyX21hcD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIDpwYXJhbSBkZXNlcmlhbGl6ZXJfbWFwOiBtYXAgZnJvbSBHcmFwaFNPTiB0eXBlIHRhZyB0byBkZXNlcmlhbGl6ZXIgaW5zdGFuY2UgaW1wbGVtZW50aW5nIGBvYmplY3RpZnlgCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmRlc2VyaWFsaXplcnMgPSBfZGVzZXJpYWxpemVycy5jb3B5KCkKKyAgICAgICAgaWYgZGVzZXJpYWxpemVyX21hcDoKKyAgICAgICAgICAgIHNlbGYuZGVzZXJpYWxpemVycy51cGRhdGUoZGVzZXJpYWxpemVyX21hcCkKKworICAgIGRlZiByZWFkT2JqZWN0KHNlbGYsIGpzb25EYXRhKToKKyAgICAgICAgIyBmcm9tIEpTT04KKyAgICAgICAgcmV0dXJuIHNlbGYudG9PYmplY3QoanNvbi5sb2Fkcyhqc29uRGF0YSkpCisKKyAgICBkZWYgdG9PYmplY3Qoc2VsZiwgb2JqKToKKyAgICAgICAgIiIiCisgICAgICAgIFVucGFja3MgR3JhcGhTT04gdHlwZS10YWdnZWQgZGljdCB2YWx1ZXMgaW50byBvYmplY3RzIG1hcHBlZCBpbiBzZWxmLmRlc2VyaWFsaXplcnMKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBkaWN0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZXNlcmlhbGl6ZXJzW29ialtHcmFwaFNPTlV0aWwuVFlQRV9LRVldXS5vYmplY3RpZnkob2JqW0dyYXBoU09OVXRpbC5WQUxVRV9LRVldLCBzZWxmKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgbGlzdCBhbmQgbWFwIGFyZSB0cmVhdGVkIGFzIG5vcm1hbCBqc29uIG9ianMgKGNvdWxkIGJlIGlzb2xhdGVkIGRlc2VyaWFsaXplcnMpCisgICAgICAgICAgICByZXR1cm4gZGljdCgoc2VsZi50b09iamVjdChrKSwgc2VsZi50b09iamVjdCh2KSkgZm9yIGssIHYgaW4gb2JqLml0ZW1zKCkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIGxpc3QpOgorICAgICAgICAgICAgcmV0dXJuIFtzZWxmLnRvT2JqZWN0KG8pIGZvciBvIGluIG9ial0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvYmoKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoR3JhcGhTT05UeXBlVHlwZSkKK2NsYXNzIF9HcmFwaFNPTlR5cGVJTyhvYmplY3QpOgorICAgIHB5dGhvbl90eXBlID0gTm9uZQorICAgIGdyYXBoc29uX3R5cGUgPSBOb25lCisKKyAgICBzeW1ib2xNYXAgPSB7Imdsb2JhbF8iOiAiZ2xvYmFsIiwgImFzXyI6ICJhcyIsICJpbl8iOiAiaW4iLCAiYW5kXyI6ICJhbmQiLAorICAgICAgICAgICAgICAgICAib3JfIjogIm9yIiwgImlzXyI6ICJpcyIsICJub3RfIjogIm5vdCIsICJmcm9tXyI6ICJmcm9tIiwKKyAgICAgICAgICAgICAgICAgInNldF8iOiAic2V0IiwgImxpc3RfIjogImxpc3QiLCAiYWxsXyI6ICJhbGwiLCAid2l0aF8iOiAid2l0aCIsCisgICAgICAgICAgICAgICAgICJmaWx0ZXJfIjogImZpbHRlciIsICJpZF8iOiAiaWQiLCAibWF4XyI6ICJtYXgiLCAibWluXyI6ICJtaW4iLCAic3VtXyI6ICJzdW0ifQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHVubWFuZ2xlS2V5d29yZChjbHMsIHN5bWJvbCk6CisgICAgICAgIHJldHVybiBjbHMuc3ltYm9sTWFwLmdldChzeW1ib2wsIHN5bWJvbCkKKworICAgIGRlZiBkaWN0aWZ5KHNlbGYsIG9iaiwgd3JpdGVyKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgb2JqZWN0aWZ5KHNlbGYsIGQsIHJlYWRlcik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisKK2NsYXNzIF9CeXRlY29kZVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2RpY3RpZnlfaW5zdHJ1Y3Rpb25zKGNscywgaW5zdHJ1Y3Rpb25zLCB3cml0ZXIpOgorICAgICAgICBvdXQgPSBbXQorICAgICAgICBmb3IgaW5zdHJ1Y3Rpb24gaW4gaW5zdHJ1Y3Rpb25zOgorICAgICAgICAgICAgaW5zdCA9IFtpbnN0cnVjdGlvblswXV0KKyAgICAgICAgICAgIGluc3QuZXh0ZW5kKHdyaXRlci50b0RpY3QoYXJnKSBmb3IgYXJnIGluIGluc3RydWN0aW9uWzE6XSkKKyAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdCkKKyAgICAgICAgcmV0dXJuIG91dAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBieXRlY29kZSwgd3JpdGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShieXRlY29kZSwgVHJhdmVyc2FsKToKKyAgICAgICAgICAgIGJ5dGVjb2RlID0gYnl0ZWNvZGUuYnl0ZWNvZGUKKyAgICAgICAgb3V0ID0ge30KKyAgICAgICAgaWYgYnl0ZWNvZGUuc291cmNlX2luc3RydWN0aW9uczoKKyAgICAgICAgICAgIG91dFsic291cmNlIl0gPSBjbHMuX2RpY3RpZnlfaW5zdHJ1Y3Rpb25zKGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMsIHdyaXRlcikKKyAgICAgICAgaWYgYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnM6CisgICAgICAgICAgICBvdXRbInN0ZXAiXSA9IGNscy5fZGljdGlmeV9pbnN0cnVjdGlvbnMoYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMsIHdyaXRlcikKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCeXRlY29kZSIsIG91dCkKKworY2xhc3MgVHJhdmVyc2FsU2VyaWFsaXplcihfQnl0ZWNvZGVTZXJpYWxpemVyKToKKyAgICBweXRob25fdHlwZSA9IFRyYXZlcnNhbAorCisKK2NsYXNzIEJ5dGVjb2RlU2VyaWFsaXplcihfQnl0ZWNvZGVTZXJpYWxpemVyKToKKyAgICBweXRob25fdHlwZSA9IEJ5dGVjb2RlCisKKworY2xhc3MgVmVydGV4U2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gVmVydGV4CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOlZlcnRleCIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgdmVydGV4LCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlZlcnRleCIsIHsiaWQiOiB3cml0ZXIudG9EaWN0KHZlcnRleC5pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHdyaXRlci50b0RpY3QodmVydGV4LmxhYmVsKX0pCisKKworY2xhc3MgRWRnZVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IEVkZ2UKKyAgICBncmFwaHNvbl90eXBlID0gImc6RWRnZSIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgZWRnZSwgd3JpdGVyKToKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJFZGdlIiwgeyJpZCI6IHdyaXRlci50b0RpY3QoZWRnZS5pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0ViI6IHdyaXRlci50b0RpY3QoZWRnZS5vdXRWLmlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRWTGFiZWwiOiB3cml0ZXIudG9EaWN0KGVkZ2Uub3V0Vi5sYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB3cml0ZXIudG9EaWN0KGVkZ2UubGFiZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluViI6IHdyaXRlci50b0RpY3QoZWRnZS5pblYuaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluVkxhYmVsIjogd3JpdGVyLnRvRGljdChlZGdlLmluVi5sYWJlbCl9KQorCisKK2NsYXNzIFZlcnRleFByb3BlcnR5U2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gVmVydGV4UHJvcGVydHkKKyAgICBncmFwaHNvbl90eXBlID0gImc6VmVydGV4UHJvcGVydHkiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIHZlcnRleF9wcm9wZXJ0eSwgd3JpdGVyKToKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJWZXJ0ZXhQcm9wZXJ0eSIsIHsiaWQiOiB3cml0ZXIudG9EaWN0KHZlcnRleF9wcm9wZXJ0eS5pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogd3JpdGVyLnRvRGljdCh2ZXJ0ZXhfcHJvcGVydHkubGFiZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHdyaXRlci50b0RpY3QodmVydGV4X3Byb3BlcnR5LnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydGV4Ijogd3JpdGVyLnRvRGljdCh2ZXJ0ZXhfcHJvcGVydHkudmVydGV4LmlkKX0pCisKKworY2xhc3MgUHJvcGVydHlTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBQcm9wZXJ0eQorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpQcm9wZXJ0eSIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgcHJvcGVydHksIHdyaXRlcik6CisgICAgICAgIGVsZW1lbnREaWN0ID0gd3JpdGVyLnRvRGljdChwcm9wZXJ0eS5lbGVtZW50KQorICAgICAgICBpZiBlbGVtZW50RGljdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbHVlRGljdCA9IGVsZW1lbnREaWN0WyJAdmFsdWUiXQorICAgICAgICAgICAgaWYgIm91dFZMYWJlbCIgaW4gdmFsdWVEaWN0OgorICAgICAgICAgICAgICAgIGRlbCB2YWx1ZURpY3RbIm91dFZMYWJlbCJdCisgICAgICAgICAgICBpZiAiaW5WTGFiZWwiIGluIHZhbHVlRGljdDoKKyAgICAgICAgICAgICAgICBkZWwgdmFsdWVEaWN0WyJpblZMYWJlbCJdCisgICAgICAgICAgICBpZiAicHJvcGVydGllcyIgaW4gdmFsdWVEaWN0OgorICAgICAgICAgICAgICAgIGRlbCB2YWx1ZURpY3RbInByb3BlcnRpZXMiXQorICAgICAgICAgICAgaWYgInZhbHVlIiBpbiB2YWx1ZURpY3Q6CisgICAgICAgICAgICAgICAgZGVsIHZhbHVlRGljdFsidmFsdWUiXQorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlByb3BlcnR5IiwgeyJrZXkiOiB3cml0ZXIudG9EaWN0KHByb3BlcnR5LmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogd3JpdGVyLnRvRGljdChwcm9wZXJ0eS52YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnQiOiBlbGVtZW50RGljdH0pCisKKworY2xhc3MgVHJhdmVyc2FsU3RyYXRlZ3lTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBUcmF2ZXJzYWxTdHJhdGVneQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBzdHJhdGVneSwgd3JpdGVyKToKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKHN0cmF0ZWd5LnN0cmF0ZWd5X25hbWUsIHdyaXRlci50b0RpY3Qoc3RyYXRlZ3kuY29uZmlndXJhdGlvbikpCisKKworY2xhc3MgVHJhdmVyc2VySU8oX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IFRyYXZlcnNlcgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpUcmF2ZXJzZXIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIHRyYXZlcnNlciwgd3JpdGVyKToKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJUcmF2ZXJzZXIiLCB7InZhbHVlIjogd3JpdGVyLnRvRGljdCh0cmF2ZXJzZXIub2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1bGsiOiB3cml0ZXIudG9EaWN0KHRyYXZlcnNlci5idWxrKX0pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgcmV0dXJuIFRyYXZlcnNlcihyZWFkZXIudG9PYmplY3QoZFsidmFsdWUiXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnRvT2JqZWN0KGRbImJ1bGsiXSkpCisKKworY2xhc3MgRW51bVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IEVudW0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgZW51bSwgXyk6CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMudW5tYW5nbGVLZXl3b3JkKHR5cGUoZW51bSkuX19uYW1lX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnVubWFuZ2xlS2V5d29yZChzdHIoZW51bS5uYW1lKSkpCisKKworY2xhc3MgUFNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IFAKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgcCwgd3JpdGVyKToKKyAgICAgICAgb3V0ID0geyJwcmVkaWNhdGUiOiBwLm9wZXJhdG9yLAorICAgICAgICAgICAgICAgInZhbHVlIjogW3dyaXRlci50b0RpY3QocC52YWx1ZSksIHdyaXRlci50b0RpY3QocC5vdGhlcildIGlmIHAub3RoZXIgaXMgbm90IE5vbmUgZWxzZQorICAgICAgICAgICAgICAgd3JpdGVyLnRvRGljdChwLnZhbHVlKX0KKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJQIiwgb3V0KQorCisKK2NsYXNzIFRleHRQU2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gVGV4dFAKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgcCwgd3JpdGVyKToKKyAgICAgICAgb3V0ID0geyJwcmVkaWNhdGUiOiBwLm9wZXJhdG9yLAorICAgICAgICAgICAgICAgInZhbHVlIjogW3dyaXRlci50b0RpY3QocC52YWx1ZSksIHdyaXRlci50b0RpY3QocC5vdGhlcildIGlmIHAub3RoZXIgaXMgbm90IE5vbmUgZWxzZQorICAgICAgICAgICAgICAgd3JpdGVyLnRvRGljdChwLnZhbHVlKX0KKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJUZXh0UCIsIG91dCkKKworCitjbGFzcyBCaW5kaW5nU2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gQmluZGluZworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBiaW5kaW5nLCB3cml0ZXIpOgorICAgICAgICBvdXQgPSB7ImtleSI6IGJpbmRpbmcua2V5LAorICAgICAgICAgICAgICAgInZhbHVlIjogd3JpdGVyLnRvRGljdChiaW5kaW5nLnZhbHVlKX0KKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCaW5kaW5nIiwgb3V0KQorCisKK2NsYXNzIExhbWJkYVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IEZ1bmN0aW9uVHlwZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBsYW1iZGFfb2JqZWN0LCB3cml0ZXIpOgorICAgICAgICBsYW1iZGFfcmVzdWx0ID0gbGFtYmRhX29iamVjdCgpCisgICAgICAgIHNjcmlwdCA9IGxhbWJkYV9yZXN1bHQgaWYgaXNpbnN0YW5jZShsYW1iZGFfcmVzdWx0LCBzdHIpIGVsc2UgbGFtYmRhX3Jlc3VsdFswXQorICAgICAgICBsYW5ndWFnZSA9IHN0YXRpY3MuZGVmYXVsdF9sYW1iZGFfbGFuZ3VhZ2UgaWYgaXNpbnN0YW5jZShsYW1iZGFfcmVzdWx0LCBzdHIpIGVsc2UgbGFtYmRhX3Jlc3VsdFsxXQorICAgICAgICBvdXQgPSB7InNjcmlwdCI6IHNjcmlwdCwKKyAgICAgICAgICAgICAgICJsYW5ndWFnZSI6IGxhbmd1YWdlfQorICAgICAgICBpZiBsYW5ndWFnZSA9PSAiZ3JlbWxpbi1ncm9vdnkiIGFuZCAiLT4iIGluIHNjcmlwdDoKKyAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgYWRkZWQgcGFyYW1ldGVycyB0byB0aGUgZ3Jvb3Z5IGNsb3N1cmUgdGhlbiB3ZSBjYW4gZWFzaWx5IGRldGVjdCBvbmUgb3IgdHdvCisgICAgICAgICAgICAjIGFyZyBsYW1iZGFzIC0gaWYgd2UgY2FuJ3QgZGV0ZWN0IDEgb3IgMiB0aGVuIHdlIGp1c3QgZ28gd2l0aCAidW5rbm93biIKKyAgICAgICAgICAgIGFyZ3MgPSBzY3JpcHRbMDpzY3JpcHQuZmluZCgiLT4iKV0KKyAgICAgICAgICAgIG91dFsiYXJndW1lbnRzIl0gPSAyIGlmICIsIiBpbiBhcmdzIGVsc2UgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0WyJhcmd1bWVudHMiXSA9IC0xCisKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJMYW1iZGEiLCBvdXQpCisKKworY2xhc3MgVHlwZVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IFR5cGVUeXBlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIHR5cCwgd3JpdGVyKToKKyAgICAgICAgcmV0dXJuIHdyaXRlci50b0RpY3QodHlwKCkpCisKKworY2xhc3MgVVVJRElPKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSB1dWlkLlVVSUQKKyAgICBncmFwaHNvbl90eXBlID0gImc6VVVJRCIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiVVVJRCIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgc3RyKG9iaikpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgcmV0dXJuIGNscy5weXRob25fdHlwZShkKQorCisKK2NsYXNzIERhdGVJTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gZGF0ZXRpbWUuZGF0ZXRpbWUKKyAgICBncmFwaHNvbl90eXBlID0gImc6RGF0ZSIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiRGF0ZSIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgb2JqLCB3cml0ZXIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0aW1lc3RhbXBfc2Vjb25kcyA9IGNhbGVuZGFyLnRpbWVnbShvYmoudXRjdGltZXR1cGxlKCkpCisgICAgICAgICAgICBwdHMgPSB0aW1lc3RhbXBfc2Vjb25kcyAqIDFlMyArIGdldGF0dHIob2JqLCAnbWljcm9zZWNvbmQnLCAwKSAvIDFlMworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwdHMgPSBjYWxlbmRhci50aW1lZ20ob2JqLnRpbWV0dXBsZSgpKSAqIDFlMworCisgICAgICAgIHRzID0gaW50KHJvdW5kKHB0cykpCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCB0cykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCB0cywgcmVhZGVyKToKKyAgICAgICAgIyBQeXRob24gdGltZXN0YW1wIGV4cGVjdHMgc2Vjb25kcworICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCh0cyAvIDEwMDAuMCkKKworCisjIEJhc2VkIG9uIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoaXMgY2xhc3MgbXVzdCBhbHdheXMgYmUgZGVjbGFyZWQgYmVmb3JlIEZsb2F0SU8uCisjIFNlZW1zIHByZXR0eSBmcmFnaWxlIGZvciBmdXR1cmUgbWFpbnRhaW5lcnMuIE1heWJlIGxvb2sgaW50byB0aGlzLgorY2xhc3MgVGltZXN0YW1wSU8oX0dyYXBoU09OVHlwZUlPKToKKyAgICAiIiJBIHRpbWVzdGFtcCBpbiBQeXRob24gaXMgdHlwZSBmbG9hdCIiIgorICAgIHB5dGhvbl90eXBlID0gc3RhdGljcy50aW1lc3RhbXAKKyAgICBncmFwaHNvbl90eXBlID0gImc6VGltZXN0YW1wIgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJUaW1lc3RhbXAiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyKToKKyAgICAgICAgIyBKYXZhIHRpbWVzdGFtcCBleHBlY3RzIG1pbGxpc2Vjb25kcyBpbnRlZ2VyCisgICAgICAgICMgSGF2ZSB0byB1c2UgaW50IGJlY2F1c2Ugb2YgbGVnYWN5IFB5dGhvbgorICAgICAgICB0cyA9IGludChyb3VuZChvYmogKiAxMDAwKSkKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIHRzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIHRzLCByZWFkZXIpOgorICAgICAgICAjIFB5dGhvbiB0aW1lc3RhbXAgZXhwZWN0cyBzZWNvbmRzCisgICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGUodHMgLyAxMDAwLjApCisKKworY2xhc3MgX051bWJlcklPKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6CisgICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGUodikKKworCitjbGFzcyBGbG9hdElPKF9OdW1iZXJJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBGbG9hdFR5cGUKKyAgICBncmFwaHNvbl90eXBlID0gImc6RmxvYXQiCisgICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkZsb2F0IgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxpZiBtYXRoLmlzbmFuKG4pOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJOYU4iKQorICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPiAwOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJJbmZpbml0eSIpCisgICAgICAgIGVsaWYgbWF0aC5pc2luZihuKSBhbmQgbiA8IDA6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgIi1JbmZpbml0eSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgorICAgICAgICAgICAgaWYgdiA9PSAnTmFOJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ25hbicpCisgICAgICAgICAgICBlbGlmIHYgPT0gIkluZmluaXR5IjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCisgICAgICAgICAgICBlbGlmIHYgPT0gIi1JbmZpbml0eSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCctaW5mJykKKworICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHYpCisKKworY2xhc3MgQmlnRGVjaW1hbElPKF9OdW1iZXJJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBEZWNpbWFsCisgICAgZ3JhcGhzb25fdHlwZSA9ICJneDpCaWdEZWNpbWFsIgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJCaWdEZWNpbWFsIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxpZiBtYXRoLmlzbmFuKG4pOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJOYU4iLCAiZ3giKQorICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPiAwOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJJbmZpbml0eSIsICJneCIpCisgICAgICAgIGVsaWYgbWF0aC5pc2luZihuKSBhbmQgbiA8IDA6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgIi1JbmZpbml0eSIsICJneCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgc3RyKG4pLCAiZ3giKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgorICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cik6CisgICAgICAgICAgICBpZiB2ID09ICdOYU4nOgorICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKCduYW4nKQorICAgICAgICAgICAgZWxpZiB2ID09ICJJbmZpbml0eSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoJ2luZicpCisgICAgICAgICAgICBlbGlmIHYgPT0gIi1JbmZpbml0eSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoJy1pbmYnKQorCisgICAgICAgIHJldHVybiBEZWNpbWFsKHYpCisKKworY2xhc3MgRG91YmxlSU8oRmxvYXRJTyk6CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOkRvdWJsZSIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiRG91YmxlIgorCisKK2NsYXNzIEludDY0SU8oX051bWJlcklPKToKKyAgICBweXRob25fdHlwZSA9IExvbmdUeXBlCisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOkludDY0IgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJJbnQ2NCIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKKyAgICAgICAgIyBpZiB3ZSBleGNlZWQgSmF2YSBsb25nIHJhbmdlIHRoZW4gd2UgbmVlZCBhIEJpZ0ludGVnZXIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKToKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGVsaWYgbiA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIG4gPiA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCaWdJbnRlZ2VyIiwgc3RyKG4pLCAiZ3giKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCisKKworY2xhc3MgQmlnSW50ZWdlcklPKEludDY0SU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6QmlnSW50ZWdlciIKKworCitjbGFzcyBJbnQzMklPKEludDY0SU8pOgorICAgIHB5dGhvbl90eXBlID0gSW50VHlwZQorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpJbnQzMiIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiSW50MzIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6CisgICAgICAgICMgaWYgd2UgZXhjZWVkIEphdmEgaW50IHJhbmdlIHRoZW4gd2UgbmVlZCBhIGxvbmcKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKToKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGVsaWYgbiA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIG4gPiA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCaWdJbnRlZ2VyIiwgc3RyKG4pLCAiZ3giKQorICAgICAgICBlbGlmIG4gPCAtMjE0NzQ4MzY0OCBvciBuID4gMjE0NzQ4MzY0NzoKKyAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiSW50NjQiLCBuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCisKKworY2xhc3MgQnl0ZUlPKF9OdW1iZXJJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBTaW5nbGVCeXRlCisgICAgZ3JhcGhzb25fdHlwZSA9ICJneDpCeXRlIgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJCeXRlIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4sICJneCIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6CisgICAgICAgIHJldHVybiBpbnQuX19uZXdfXyhTaW5nbGVCeXRlLCB2KQorCisKK2NsYXNzIEJ5dGVCdWZmZXJJTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gQnl0ZUJ1ZmZlclR5cGUKKyAgICBncmFwaHNvbl90eXBlID0gImd4OkJ5dGVCdWZmZXIiCisgICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkJ5dGVCdWZmZXIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCAiIi5qb2luKGNocih4KSBmb3IgeCBpbiBuKSwgImd4IikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKKyAgICAgICAgcmV0dXJuIGNscy5weXRob25fdHlwZSh2LCAidXRmOCIpCisKKworY2xhc3MgQ2hhcklPKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBTaW5nbGVDaGFyCisgICAgZ3JhcGhzb25fdHlwZSA9ICJneDpDaGFyIgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJDaGFyIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgbiwgImd4IikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKKyAgICAgICAgcmV0dXJuIHN0ci5fX25ld19fKFNpbmdsZUNoYXIsIHYpCisKKworY2xhc3MgRHVyYXRpb25JTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gdGltZWRlbHRhCisgICAgZ3JhcGhzb25fdHlwZSA9ICJneDpEdXJhdGlvbiIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiRHVyYXRpb24iCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBkdXJhdGlvbl9pc29mb3JtYXQobiksICJneCIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6CisgICAgICAgIHJldHVybiBwYXJzZV9kdXJhdGlvbih2KQorCisKK2NsYXNzIFZlcnRleERlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpWZXJ0ZXgiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgcmV0dXJuIFZlcnRleChyZWFkZXIudG9PYmplY3QoZFsiaWQiXSksIGQuZ2V0KCJsYWJlbCIsICJ2ZXJ0ZXgiKSkKKworCitjbGFzcyBFZGdlRGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOkVkZ2UiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgcmV0dXJuIEVkZ2UocmVhZGVyLnRvT2JqZWN0KGRbImlkIl0pLAorICAgICAgICAgICAgICAgICAgICBWZXJ0ZXgocmVhZGVyLnRvT2JqZWN0KGRbIm91dFYiXSksIGQuZ2V0KCJvdXRWTGFiZWwiLCAidmVydGV4IikpLAorICAgICAgICAgICAgICAgICAgICBkLmdldCgibGFiZWwiLCAiZWRnZSIpLAorICAgICAgICAgICAgICAgICAgICBWZXJ0ZXgocmVhZGVyLnRvT2JqZWN0KGRbImluViJdKSwgZC5nZXQoImluVkxhYmVsIiwgInZlcnRleCIpKSkKKworCitjbGFzcyBWZXJ0ZXhQcm9wZXJ0eURlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpWZXJ0ZXhQcm9wZXJ0eSIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgorICAgICAgICB2ZXJ0ZXggPSBWZXJ0ZXgocmVhZGVyLnRvT2JqZWN0KGQuZ2V0KCJ2ZXJ0ZXgiKSkpIGlmICJ2ZXJ0ZXgiIGluIGQgZWxzZSBOb25lCisgICAgICAgIHJldHVybiBWZXJ0ZXhQcm9wZXJ0eShyZWFkZXIudG9PYmplY3QoZFsiaWQiXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWyJsYWJlbCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnRvT2JqZWN0KGRbInZhbHVlIl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4KQorCisKK2NsYXNzIFByb3BlcnR5RGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOlByb3BlcnR5IgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIGVsZW1lbnQgPSByZWFkZXIudG9PYmplY3QoZFsiZWxlbWVudCJdKSBpZiAiZWxlbWVudCIgaW4gZCBlbHNlIE5vbmUKKyAgICAgICAgcmV0dXJuIFByb3BlcnR5KGRbImtleSJdLCByZWFkZXIudG9PYmplY3QoZFsidmFsdWUiXSksIGVsZW1lbnQpCisKKworY2xhc3MgUGF0aERlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpQYXRoIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIGxhYmVscyA9IFtzZXQobGFiZWwpIGZvciBsYWJlbCBpbiBkWyJsYWJlbHMiXV0KKyAgICAgICAgb2JqZWN0cyA9IFtyZWFkZXIudG9PYmplY3QobykgZm9yIG8gaW4gZFsib2JqZWN0cyJdXQorICAgICAgICByZXR1cm4gUGF0aChsYWJlbHMsIG9iamVjdHMpCisKKworY2xhc3MgVHJhdmVyc2FsTWV0cmljc0Rlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpUcmF2ZXJzYWxNZXRyaWNzIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIHJldHVybiByZWFkZXIudG9PYmplY3QoZCkKKworCitjbGFzcyBNZXRyaWNzRGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOk1ldHJpY3MiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgcmV0dXJuIHJlYWRlci50b09iamVjdChkKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9pby9ncmFwaHNvblYzZDAucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vZ3JlbWxpbl9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uVjNkMC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmEyMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9pby9ncmFwaHNvblYzZDAucHkKQEAgLTAsMCArMSw3NTAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KK2ltcG9ydCBjYWxlbmRhcgoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IHV1aWQKK2ltcG9ydCBtYXRoCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZnJvbSBkZWNpbWFsIGltcG9ydCAqCitpbXBvcnQgbG9nZ2luZworZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCisKK2ltcG9ydCBzaXgKK2Zyb20gYWVudW0gaW1wb3J0IEVudW0KK2Zyb20gaXNvZGF0ZSBpbXBvcnQgcGFyc2VfZHVyYXRpb24sIGR1cmF0aW9uX2lzb2Zvcm1hdAorCitmcm9tIGdyZW1saW5fcHl0aG9uIGltcG9ydCBzdGF0aWNzCitmcm9tIGdyZW1saW5fcHl0aG9uLnN0YXRpY3MgaW1wb3J0IEZsb2F0VHlwZSwgRnVuY3Rpb25UeXBlLCBJbnRUeXBlLCBMb25nVHlwZSwgVHlwZVR5cGUsIERpY3RUeXBlLCBMaXN0VHlwZSwgU2V0VHlwZSwgU2luZ2xlQnl0ZSwgQnl0ZUJ1ZmZlclR5cGUsIFNpbmdsZUNoYXIKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IEJpbmRpbmcsIEJ5dGVjb2RlLCBEaXJlY3Rpb24sIFAsIFRleHRQLCBUcmF2ZXJzYWwsIFRyYXZlcnNlciwgVHJhdmVyc2FsU3RyYXRlZ3ksIFQKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBFZGdlLCBQcm9wZXJ0eSwgVmVydGV4LCBWZXJ0ZXhQcm9wZXJ0eSwgUGF0aAorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8udXRpbCBpbXBvcnQgSGFzaGFibGVEaWN0CisKK2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisjIFdoZW4gd2UgZmFsbCBiYWNrIHRvIGEgc3VwZXJjbGFzcydzIHNlcmlhbGl6ZXIsIHdlIGl0ZXJhdGUgb3ZlciB0aGlzIG1hcC4KKyMgV2Ugd2FudCB0aGF0IGl0ZXJhdGlvbiBvcmRlciB0byBiZSBjb25zaXN0ZW50LCBzbyB3ZSB1c2UgYW4gT3JkZXJlZERpY3QsCisjIG5vdCBhIGRpY3QuCitfc2VyaWFsaXplcnMgPSBPcmRlcmVkRGljdCgpCitfZGVzZXJpYWxpemVycyA9IHt9CisKK2NsYXNzIEdyYXBoU09OVHlwZVR5cGUodHlwZSk6CisgICAgZGVmIF9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGN0KToKKyAgICAgICAgY2xzID0gc3VwZXIoR3JhcGhTT05UeXBlVHlwZSwgbWNzKS5fX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIGRjdCkKKyAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgorICAgICAgICAgICAgaWYgY2xzLnB5dGhvbl90eXBlOgorICAgICAgICAgICAgICAgIF9zZXJpYWxpemVyc1tjbHMucHl0aG9uX3R5cGVdID0gY2xzCisgICAgICAgICAgICBpZiBjbHMuZ3JhcGhzb25fdHlwZToKKyAgICAgICAgICAgICAgICBfZGVzZXJpYWxpemVyc1tjbHMuZ3JhcGhzb25fdHlwZV0gPSBjbHMKKyAgICAgICAgcmV0dXJuIGNscworCisKK2NsYXNzIEdyYXBoU09OVXRpbChvYmplY3QpOgorICAgIFRZUEVfS0VZID0gIkB0eXBlIgorICAgIFZBTFVFX0tFWSA9ICJAdmFsdWUiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdHlwZWRWYWx1ZShjbHMsIHR5cGVfbmFtZSwgdmFsdWUsIHByZWZpeD0iZyIpOgorICAgICAgICBvdXQgPSB7Y2xzLlRZUEVfS0VZOiBjbHMuZm9ybWF0VHlwZShwcmVmaXgsIHR5cGVfbmFtZSl9CisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0W2Nscy5WQUxVRV9LRVldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIG91dAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZvcm1hdFR5cGUoY2xzLCBwcmVmaXgsIHR5cGVfbmFtZSk6CisgICAgICAgIHJldHVybiAiJXM6JXMiICUgKHByZWZpeCwgdHlwZV9uYW1lKQorCisKKyMgUmVhZC9Xcml0ZSBjbGFzc2VzIHNwbGl0IHRvIGZvbGxvdyBwcmVjZWRlbmNlIG9mIHRoZSBKYXZhIEFQSQorY2xhc3MgR3JhcGhTT05Xcml0ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VyaWFsaXplcl9tYXA9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICA6cGFyYW0gc2VyaWFsaXplcl9tYXA6IG1hcCBmcm9tIFB5dGhvbiB0eXBlIHRvIHNlcmlhbGl6ZXIgaW5zdGFuY2UgaW1wbGVtZW50aW5nIGBkaWN0aWZ5YAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zZXJpYWxpemVycyA9IF9zZXJpYWxpemVycy5jb3B5KCkKKyAgICAgICAgaWYgc2VyaWFsaXplcl9tYXA6CisgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXJzLnVwZGF0ZShzZXJpYWxpemVyX21hcCkKKworICAgIGRlZiB3cml0ZU9iamVjdChzZWxmLCBvYmplY3REYXRhKToKKyAgICAgICAgIyB0byBKU09OCisgICAgICAgIHJldHVybiBqc29uLmR1bXBzKHNlbGYudG9EaWN0KG9iamVjdERhdGEpLCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCisKKyAgICBkZWYgdG9EaWN0KHNlbGYsIG9iaik6CisgICAgICAgICIiIgorICAgICAgICBFbmNvZGVzIHB5dGhvbiBvYmplY3RzIGluIEdyYXBoU09OIHR5cGUtdGFnZ2VkIGRpY3QgdmFsdWVzCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zZXJpYWxpemVyc1t0eXBlKG9iaildLmRpY3RpZnkob2JqLCBzZWxmKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBmb3Iga2V5LCBzZXJpYWxpemVyIGluIHNlbGYuc2VyaWFsaXplcnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwga2V5KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGljdGlmeShvYmosIHNlbGYpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGRpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGRpY3QoKHNlbGYudG9EaWN0KGspLCBzZWxmLnRvRGljdCh2KSkgZm9yIGssIHYgaW4gb2JqLml0ZW1zKCkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIHNldCk6CisgICAgICAgICAgICByZXR1cm4gc2V0KFtzZWxmLnRvRGljdChvKSBmb3IgbyBpbiBvYmpdKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBsaXN0KToKKyAgICAgICAgICAgIHJldHVybiBbc2VsZi50b0RpY3QobykgZm9yIG8gaW4gb2JqXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG9iagorCisKK2NsYXNzIEdyYXBoU09OUmVhZGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlc2VyaWFsaXplcl9tYXA9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICA6cGFyYW0gZGVzZXJpYWxpemVyX21hcDogbWFwIGZyb20gR3JhcGhTT04gdHlwZSB0YWcgdG8gZGVzZXJpYWxpemVyIGluc3RhbmNlIGltcGxlbWVudGluZyBgb2JqZWN0aWZ5YAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5kZXNlcmlhbGl6ZXJzID0gX2Rlc2VyaWFsaXplcnMuY29weSgpCisgICAgICAgIGlmIGRlc2VyaWFsaXplcl9tYXA6CisgICAgICAgICAgICBzZWxmLmRlc2VyaWFsaXplcnMudXBkYXRlKGRlc2VyaWFsaXplcl9tYXApCisKKyAgICBkZWYgcmVhZE9iamVjdChzZWxmLCBqc29uRGF0YSk6CisgICAgICAgICMgZnJvbSBKU09OCisgICAgICAgIHJldHVybiBzZWxmLnRvT2JqZWN0KGpzb24ubG9hZHMoanNvbkRhdGEpKQorCisgICAgZGVmIHRvT2JqZWN0KHNlbGYsIG9iaik6CisgICAgICAgICIiIgorICAgICAgICBVbnBhY2tzIEdyYXBoU09OIHR5cGUtdGFnZ2VkIGRpY3QgdmFsdWVzIGludG8gb2JqZWN0cyBtYXBwZWQgaW4gc2VsZi5kZXNlcmlhbGl6ZXJzCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgZGljdCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVzZXJpYWxpemVyc1tvYmpbR3JhcGhTT05VdGlsLlRZUEVfS0VZXV0ub2JqZWN0aWZ5KG9ialtHcmFwaFNPTlV0aWwuVkFMVUVfS0VZXSwgc2VsZikKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByZXR1cm4gZGljdCgoc2VsZi50b09iamVjdChrKSwgc2VsZi50b09iamVjdCh2KSkgZm9yIGssIHYgaW4gb2JqLml0ZW1zKCkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIHNldCk6CisgICAgICAgICAgICByZXR1cm4gc2V0KFtzZWxmLnRvT2JqZWN0KG8pIGZvciBvIGluIG9ial0pCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIGxpc3QpOgorICAgICAgICAgICAgcmV0dXJuIFtzZWxmLnRvT2JqZWN0KG8pIGZvciBvIGluIG9ial0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvYmoKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoR3JhcGhTT05UeXBlVHlwZSkKK2NsYXNzIF9HcmFwaFNPTlR5cGVJTyhvYmplY3QpOgorICAgIHB5dGhvbl90eXBlID0gTm9uZQorICAgIGdyYXBoc29uX3R5cGUgPSBOb25lCisKKyAgICBzeW1ib2xNYXAgPSB7Imdsb2JhbF8iOiAiZ2xvYmFsIiwgImFzXyI6ICJhcyIsICJpbl8iOiAiaW4iLCAiYW5kXyI6ICJhbmQiLAorICAgICAgICAgICAgICAgICAib3JfIjogIm9yIiwgImlzXyI6ICJpcyIsICJub3RfIjogIm5vdCIsICJmcm9tXyI6ICJmcm9tIiwKKyAgICAgICAgICAgICAgICAgInNldF8iOiAic2V0IiwgImxpc3RfIjogImxpc3QiLCAiYWxsXyI6ICJhbGwiLCAid2l0aF8iOiAid2l0aCIsCisgICAgICAgICAgICAgICAgICJmaWx0ZXJfIjogImZpbHRlciIsICJpZF8iOiAiaWQiLCAibWF4XyI6ICJtYXgiLCAibWluXyI6ICJtaW4iLCAic3VtXyI6ICJzdW0ifQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHVubWFuZ2xlS2V5d29yZChjbHMsIHN5bWJvbCk6CisgICAgICAgIHJldHVybiBjbHMuc3ltYm9sTWFwLmdldChzeW1ib2wsIHN5bWJvbCkKKworICAgIGRlZiBkaWN0aWZ5KHNlbGYsIG9iaiwgd3JpdGVyKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgb2JqZWN0aWZ5KHNlbGYsIGQsIHJlYWRlcik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisKK2NsYXNzIF9CeXRlY29kZVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2RpY3RpZnlfaW5zdHJ1Y3Rpb25zKGNscywgaW5zdHJ1Y3Rpb25zLCB3cml0ZXIpOgorICAgICAgICBvdXQgPSBbXQorICAgICAgICBmb3IgaW5zdHJ1Y3Rpb24gaW4gaW5zdHJ1Y3Rpb25zOgorICAgICAgICAgICAgaW5zdCA9IFtpbnN0cnVjdGlvblswXV0KKyAgICAgICAgICAgIGluc3QuZXh0ZW5kKHdyaXRlci50b0RpY3QoYXJnKSBmb3IgYXJnIGluIGluc3RydWN0aW9uWzE6XSkKKyAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdCkKKyAgICAgICAgcmV0dXJuIG91dAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBieXRlY29kZSwgd3JpdGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShieXRlY29kZSwgVHJhdmVyc2FsKToKKyAgICAgICAgICAgIGJ5dGVjb2RlID0gYnl0ZWNvZGUuYnl0ZWNvZGUKKyAgICAgICAgb3V0ID0ge30KKyAgICAgICAgaWYgYnl0ZWNvZGUuc291cmNlX2luc3RydWN0aW9uczoKKyAgICAgICAgICAgIG91dFsic291cmNlIl0gPSBjbHMuX2RpY3RpZnlfaW5zdHJ1Y3Rpb25zKGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMsIHdyaXRlcikKKyAgICAgICAgaWYgYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnM6CisgICAgICAgICAgICBvdXRbInN0ZXAiXSA9IGNscy5fZGljdGlmeV9pbnN0cnVjdGlvbnMoYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMsIHdyaXRlcikKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCeXRlY29kZSIsIG91dCkKKworCitjbGFzcyBUcmF2ZXJzYWxTZXJpYWxpemVyKF9CeXRlY29kZVNlcmlhbGl6ZXIpOgorICAgIHB5dGhvbl90eXBlID0gVHJhdmVyc2FsCisKKworY2xhc3MgQnl0ZWNvZGVTZXJpYWxpemVyKF9CeXRlY29kZVNlcmlhbGl6ZXIpOgorICAgIHB5dGhvbl90eXBlID0gQnl0ZWNvZGUKKworCitjbGFzcyBWZXJ0ZXhTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBWZXJ0ZXgKKyAgICBncmFwaHNvbl90eXBlID0gImc6VmVydGV4IgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCB2ZXJ0ZXgsIHdyaXRlcik6CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiVmVydGV4IiwgeyJpZCI6IHdyaXRlci50b0RpY3QodmVydGV4LmlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogd3JpdGVyLnRvRGljdCh2ZXJ0ZXgubGFiZWwpfSkKKworCitjbGFzcyBFZGdlU2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gRWRnZQorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpFZGdlIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBlZGdlLCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIkVkZ2UiLCB7ImlkIjogd3JpdGVyLnRvRGljdChlZGdlLmlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRWIjogd3JpdGVyLnRvRGljdChlZGdlLm91dFYuaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dFZMYWJlbCI6IHdyaXRlci50b0RpY3QoZWRnZS5vdXRWLmxhYmVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHdyaXRlci50b0RpY3QoZWRnZS5sYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5WIjogd3JpdGVyLnRvRGljdChlZGdlLmluVi5pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5WTGFiZWwiOiB3cml0ZXIudG9EaWN0KGVkZ2UuaW5WLmxhYmVsKX0pCisKKworY2xhc3MgVmVydGV4UHJvcGVydHlTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBWZXJ0ZXhQcm9wZXJ0eQorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpWZXJ0ZXhQcm9wZXJ0eSIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgdmVydGV4X3Byb3BlcnR5LCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIlZlcnRleFByb3BlcnR5IiwgeyJpZCI6IHdyaXRlci50b0RpY3QodmVydGV4X3Byb3BlcnR5LmlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB3cml0ZXIudG9EaWN0KHZlcnRleF9wcm9wZXJ0eS5sYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogd3JpdGVyLnRvRGljdCh2ZXJ0ZXhfcHJvcGVydHkudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0ZXgiOiB3cml0ZXIudG9EaWN0KHZlcnRleF9wcm9wZXJ0eS52ZXJ0ZXguaWQpfSkKKworCitjbGFzcyBQcm9wZXJ0eVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IFByb3BlcnR5CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOlByb3BlcnR5IgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBwcm9wZXJ0eSwgd3JpdGVyKToKKyAgICAgICAgZWxlbWVudERpY3QgPSB3cml0ZXIudG9EaWN0KHByb3BlcnR5LmVsZW1lbnQpCisgICAgICAgIGlmIGVsZW1lbnREaWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdmFsdWVEaWN0ID0gZWxlbWVudERpY3RbIkB2YWx1ZSJdCisgICAgICAgICAgICBpZiAib3V0VkxhYmVsIiBpbiB2YWx1ZURpY3Q6CisgICAgICAgICAgICAgICAgZGVsIHZhbHVlRGljdFsib3V0VkxhYmVsIl0KKyAgICAgICAgICAgIGlmICJpblZMYWJlbCIgaW4gdmFsdWVEaWN0OgorICAgICAgICAgICAgICAgIGRlbCB2YWx1ZURpY3RbImluVkxhYmVsIl0KKyAgICAgICAgICAgIGlmICJwcm9wZXJ0aWVzIiBpbiB2YWx1ZURpY3Q6CisgICAgICAgICAgICAgICAgZGVsIHZhbHVlRGljdFsicHJvcGVydGllcyJdCisgICAgICAgICAgICBpZiAidmFsdWUiIGluIHZhbHVlRGljdDoKKyAgICAgICAgICAgICAgICBkZWwgdmFsdWVEaWN0WyJ2YWx1ZSJdCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiUHJvcGVydHkiLCB7ImtleSI6IHdyaXRlci50b0RpY3QocHJvcGVydHkua2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB3cml0ZXIudG9EaWN0KHByb3BlcnR5LnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudCI6IGVsZW1lbnREaWN0fSkKKworCitjbGFzcyBUcmF2ZXJzYWxTdHJhdGVneVNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IFRyYXZlcnNhbFN0cmF0ZWd5CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIHN0cmF0ZWd5LCB3cml0ZXIpOgorICAgICAgICBjb25maWd1cmF0aW9uID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBzdHJhdGVneS5jb25maWd1cmF0aW9uOgorICAgICAgICAgICAgY29uZmlndXJhdGlvbltrZXldID0gd3JpdGVyLnRvRGljdChzdHJhdGVneS5jb25maWd1cmF0aW9uW2tleV0pCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShzdHJhdGVneS5zdHJhdGVneV9uYW1lLCBjb25maWd1cmF0aW9uKQorCisKK2NsYXNzIFRyYXZlcnNlcklPKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBUcmF2ZXJzZXIKKyAgICBncmFwaHNvbl90eXBlID0gImc6VHJhdmVyc2VyIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCB0cmF2ZXJzZXIsIHdyaXRlcik6CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiVHJhdmVyc2VyIiwgeyJ2YWx1ZSI6IHdyaXRlci50b0RpY3QodHJhdmVyc2VyLm9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWxrIjogd3JpdGVyLnRvRGljdCh0cmF2ZXJzZXIuYnVsayl9KQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIHJldHVybiBUcmF2ZXJzZXIocmVhZGVyLnRvT2JqZWN0KGRbInZhbHVlIl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci50b09iamVjdChkWyJidWxrIl0pKQorCisKK2NsYXNzIEVudW1TZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBFbnVtCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIGVudW0sIF8pOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLnVubWFuZ2xlS2V5d29yZCh0eXBlKGVudW0pLl9fbmFtZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy51bm1hbmdsZUtleXdvcmQoc3RyKGVudW0ubmFtZSkpKQorCisKK2NsYXNzIFBTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBQCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIHAsIHdyaXRlcik6CisgICAgICAgIG91dCA9IHsicHJlZGljYXRlIjogcC5vcGVyYXRvciwKKyAgICAgICAgICAgICAgICJ2YWx1ZSI6IFt3cml0ZXIudG9EaWN0KHAudmFsdWUpLCB3cml0ZXIudG9EaWN0KHAub3RoZXIpXSBpZiBwLm90aGVyIGlzIG5vdCBOb25lIGVsc2UKKyAgICAgICAgICAgICAgIHdyaXRlci50b0RpY3QocC52YWx1ZSl9CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiUCIsIG91dCkKKworCitjbGFzcyBUZXh0UFNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IFRleHRQCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIHAsIHdyaXRlcik6CisgICAgICAgIG91dCA9IHsicHJlZGljYXRlIjogcC5vcGVyYXRvciwKKyAgICAgICAgICAgICAgICJ2YWx1ZSI6IFt3cml0ZXIudG9EaWN0KHAudmFsdWUpLCB3cml0ZXIudG9EaWN0KHAub3RoZXIpXSBpZiBwLm90aGVyIGlzIG5vdCBOb25lIGVsc2UKKyAgICAgICAgICAgICAgIHdyaXRlci50b0RpY3QocC52YWx1ZSl9CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiVGV4dFAiLCBvdXQpCisKKworY2xhc3MgQmluZGluZ1NlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IEJpbmRpbmcKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgYmluZGluZywgd3JpdGVyKToKKyAgICAgICAgb3V0ID0geyJrZXkiOiBiaW5kaW5nLmtleSwKKyAgICAgICAgICAgICAgICJ2YWx1ZSI6IHdyaXRlci50b0RpY3QoYmluZGluZy52YWx1ZSl9CisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiQmluZGluZyIsIG91dCkKKworCitjbGFzcyBMYW1iZGFTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBGdW5jdGlvblR5cGUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgbGFtYmRhX29iamVjdCwgd3JpdGVyKToKKyAgICAgICAgbGFtYmRhX3Jlc3VsdCA9IGxhbWJkYV9vYmplY3QoKQorICAgICAgICBzY3JpcHQgPSBsYW1iZGFfcmVzdWx0IGlmIGlzaW5zdGFuY2UobGFtYmRhX3Jlc3VsdCwgc3RyKSBlbHNlIGxhbWJkYV9yZXN1bHRbMF0KKyAgICAgICAgbGFuZ3VhZ2UgPSBzdGF0aWNzLmRlZmF1bHRfbGFtYmRhX2xhbmd1YWdlIGlmIGlzaW5zdGFuY2UobGFtYmRhX3Jlc3VsdCwgc3RyKSBlbHNlIGxhbWJkYV9yZXN1bHRbMV0KKyAgICAgICAgb3V0ID0geyJzY3JpcHQiOiBzY3JpcHQsCisgICAgICAgICAgICAgICAibGFuZ3VhZ2UiOiBsYW5ndWFnZX0KKyAgICAgICAgaWYgbGFuZ3VhZ2UgPT0gImdyZW1saW4tZ3Jvb3Z5IiBhbmQgIi0+IiBpbiBzY3JpcHQ6CisgICAgICAgICAgICAjIGlmIHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IGFkZGVkIHBhcmFtZXRlcnMgdG8gdGhlIGdyb292eSBjbG9zdXJlIHRoZW4gd2UgY2FuIGVhc2lseSBkZXRlY3Qgb25lIG9yIHR3bworICAgICAgICAgICAgIyBhcmcgbGFtYmRhcyAtIGlmIHdlIGNhbid0IGRldGVjdCAxIG9yIDIgdGhlbiB3ZSBqdXN0IGdvIHdpdGggInVua25vd24iCisgICAgICAgICAgICBhcmdzID0gc2NyaXB0WzA6c2NyaXB0LmZpbmQoIi0+IildCisgICAgICAgICAgICBvdXRbImFyZ3VtZW50cyJdID0gMiBpZiAiLCIgaW4gYXJncyBlbHNlIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dFsiYXJndW1lbnRzIl0gPSAtMQorCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiTGFtYmRhIiwgb3V0KQorCisKK2NsYXNzIFR5cGVTZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBUeXBlVHlwZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCB0eXAsIHdyaXRlcik6CisgICAgICAgIHJldHVybiB3cml0ZXIudG9EaWN0KHR5cCgpKQorCisKK2NsYXNzIFVVSURJTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gdXVpZC5VVUlECisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOlVVSUQiCisgICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIlVVSUQiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyKToKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIHN0cihvYmopKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGUoZCkKKworCitjbGFzcyBEYXRlSU8oX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IGRhdGV0aW1lLmRhdGV0aW1lCisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOkRhdGUiCisgICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkRhdGUiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG9iaiwgd3JpdGVyKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGltZXN0YW1wX3NlY29uZHMgPSBjYWxlbmRhci50aW1lZ20ob2JqLnV0Y3RpbWV0dXBsZSgpKQorICAgICAgICAgICAgcHRzID0gdGltZXN0YW1wX3NlY29uZHMgKiAxZTMgKyBnZXRhdHRyKG9iaiwgJ21pY3Jvc2Vjb25kJywgMCkgLyAxZTMKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcHRzID0gY2FsZW5kYXIudGltZWdtKG9iai50aW1ldHVwbGUoKSkgKiAxZTMKKworICAgICAgICB0cyA9IGludChyb3VuZChwdHMpKQorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgdHMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgdHMsIHJlYWRlcik6CisgICAgICAgICMgUHl0aG9uIHRpbWVzdGFtcCBleHBlY3RzIHNlY29uZHMKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodHMgLyAxMDAwLjApCisKKworIyBCYXNlZCBvbiBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGlzIGNsYXNzIG11c3QgYWx3YXlzIGJlIGRlY2xhcmVkIGJlZm9yZSBGbG9hdElPLgorIyBTZWVtcyBwcmV0dHkgZnJhZ2lsZSBmb3IgZnV0dXJlIG1haW50YWluZXJzLiBNYXliZSBsb29rIGludG8gdGhpcy4KK2NsYXNzIFRpbWVzdGFtcElPKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgIiIiQSB0aW1lc3RhbXAgaW4gUHl0aG9uIGlzIHR5cGUgZmxvYXQiIiIKKyAgICBweXRob25fdHlwZSA9IHN0YXRpY3MudGltZXN0YW1wCisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOlRpbWVzdGFtcCIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiVGltZXN0YW1wIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBvYmosIHdyaXRlcik6CisgICAgICAgICMgSmF2YSB0aW1lc3RhbXAgZXhwZWN0cyBtaWxsaXNlY29uZHMgaW50ZWdlcgorICAgICAgICAjIEhhdmUgdG8gdXNlIGludCBiZWNhdXNlIG9mIGxlZ2FjeSBQeXRob24KKyAgICAgICAgdHMgPSBpbnQocm91bmQob2JqICogMTAwMCkpCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCB0cykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCB0cywgcmVhZGVyKToKKyAgICAgICAgIyBQeXRob24gdGltZXN0YW1wIGV4cGVjdHMgc2Vjb25kcworICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHRzIC8gMTAwMC4wKQorCisKK2NsYXNzIF9OdW1iZXJJTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKTogICMgYmVjYXVzZSBpc2luc3RhbmNlKEZhbHNlLCBpbnQpIGFuZCBpc2luc3RhbmNlKFRydWUsIGludCkKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgorICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHYpCisKKworY2xhc3MgTGlzdElPKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBMaXN0VHlwZQorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpMaXN0IgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBsLCB3cml0ZXIpOgorICAgICAgICBuZXdfbGlzdCA9IFtdCisgICAgICAgIGZvciBvYmogaW4gbDoKKyAgICAgICAgICAgIG5ld19saXN0LmFwcGVuZCh3cml0ZXIudG9EaWN0KG9iaikpCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiTGlzdCIsIG5ld19saXN0KQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGwsIHJlYWRlcik6CisgICAgICAgIG5ld19saXN0ID0gW10KKyAgICAgICAgZm9yIG9iaiBpbiBsOgorICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKHJlYWRlci50b09iamVjdChvYmopKQorICAgICAgICByZXR1cm4gbmV3X2xpc3QKKworCitjbGFzcyBTZXRJTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gU2V0VHlwZQorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpTZXQiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIHMsIHdyaXRlcik6CisgICAgICAgIG5ld19saXN0ID0gW10KKyAgICAgICAgZm9yIG9iaiBpbiBzOgorICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKHdyaXRlci50b0RpY3Qob2JqKSkKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJTZXQiLCBuZXdfbGlzdCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBzLCByZWFkZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgQnkgZGVmYXVsdCwgcmV0dXJucyBhIHB5dGhvbiBzZXQKKworICAgICAgICBJbiBjYXNlIEphdmEgcmV0dXJucyBudW1lcmljIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgd2hpY2gKKyAgICAgICAgcHl0aG9uIGRvbid0IHJlY29nbml6ZSwgY29lcmNlIGFuZCByZXR1cm4gYSBsaXN0LgorICAgICAgICBTZWUgY29tbWVudHMgb2YgVElOS0VSUE9QLTE4NDQgZm9yIG1vcmUgZGV0YWlscworICAgICAgICAiIiIKKyAgICAgICAgbmV3X2xpc3QgPSBbcmVhZGVyLnRvT2JqZWN0KG9iaikgZm9yIG9iaiBpbiBzXQorICAgICAgICBuZXdfc2V0ID0gc2V0KG5ld19saXN0KQorICAgICAgICBpZiBsZW4obmV3X2xpc3QpICE9IGxlbihuZXdfc2V0KToKKyAgICAgICAgICAgIGxvZy53YXJuaW5nKCJDb2VyY2luZyBnOlNldCB0byBsaXN0IGR1ZSB0byBqYXZhIG51bWVyaWMgdmFsdWVzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiU2VlIFRJTktFUlBPUC0xODQ0IGZvciBtb3JlIGRldGFpbHMuIikKKyAgICAgICAgICAgIHJldHVybiBuZXdfbGlzdAorCisgICAgICAgIHJldHVybiBuZXdfc2V0CisKKworY2xhc3MgTWFwVHlwZShfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gRGljdFR5cGUKKyAgICBncmFwaHNvbl90eXBlID0gImc6TWFwIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBkLCB3cml0ZXIpOgorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGtleSBpbiBkOgorICAgICAgICAgICAgbC5hcHBlbmQod3JpdGVyLnRvRGljdChrZXkpKQorICAgICAgICAgICAgbC5hcHBlbmQod3JpdGVyLnRvRGljdChkW2tleV0pKQorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoIk1hcCIsIGwpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgbCwgcmVhZGVyKToKKyAgICAgICAgbmV3X2RpY3QgPSB7fQorICAgICAgICBpZiBsZW4obCkgPiAwOgorICAgICAgICAgICAgeCA9IDAKKyAgICAgICAgICAgIHdoaWxlIHggPCBsZW4obCk6CisgICAgICAgICAgICAgICAgbmV3X2RpY3RbSGFzaGFibGVEaWN0Lm9mKHJlYWRlci50b09iamVjdChsW3hdKSldID0gcmVhZGVyLnRvT2JqZWN0KGxbeCArIDFdKQorICAgICAgICAgICAgICAgIHggPSB4ICsgMgorICAgICAgICByZXR1cm4gbmV3X2RpY3QKKworCitjbGFzcyBCdWxrU2V0SU8oX0dyYXBoU09OVHlwZUlPKToKKyAgICBncmFwaHNvbl90eXBlID0gImc6QnVsa1NldCIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBsLCByZWFkZXIpOgorICAgICAgICBuZXdfbGlzdCA9IFtdCisKKyAgICAgICAgIyB0aGlzIGFwcHJvYWNoIGJhc2ljYWxseSBtaW1pY3Mgd2hhdCBjdXJyZW50bHkgZXhpc3RlZCBpbiAzLjMuNCBhbmQgcHJpb3IgdmVyc2lvbnMgd2hlcmUgQnVsa1NldCBpcworICAgICAgICAjIGJhc2ljYWxseSBqdXN0IGNvZXJjZWQgdG8gbGlzdC4gdGhlIGxpbWl0YXRpb24gaGVyZSBpcyB0aGF0IGlmIHRoZSB2YWx1ZSBvZiBhIGJ1bGsgZXhjZWVkcyB0aGUgc2l6ZSBvZgorICAgICAgICAjIGEgbGlzdCAoaW50byB0aGUgbG9uZyBzcGFjZSkgdGhlbiBzdHVmZiB3b24ndCB3b3JrIG5pY2UuCisgICAgICAgIGlmIGxlbihsKSA+IDA6CisgICAgICAgICAgICB4ID0gMAorICAgICAgICAgICAgd2hpbGUgeCA8IGxlbihsKToKKyAgICAgICAgICAgICAgICBvYmogPSByZWFkZXIudG9PYmplY3QobFt4XSkKKyAgICAgICAgICAgICAgICBidWxrID0gcmVhZGVyLnRvT2JqZWN0KGxbeCArIDFdKQorICAgICAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKGJ1bGspOgorICAgICAgICAgICAgICAgICAgICBuZXdfbGlzdC5hcHBlbmQob2JqKQorICAgICAgICAgICAgICAgIHggPSB4ICsgMgorICAgICAgICByZXR1cm4gbmV3X2xpc3QKKworCitjbGFzcyBGbG9hdElPKF9OdW1iZXJJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBGbG9hdFR5cGUKKyAgICBncmFwaHNvbl90eXBlID0gImc6RmxvYXQiCisgICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkZsb2F0IgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxpZiBtYXRoLmlzbmFuKG4pOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJOYU4iKQorICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPiAwOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJJbmZpbml0eSIpCisgICAgICAgIGVsaWYgbWF0aC5pc2luZihuKSBhbmQgbiA8IDA6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgIi1JbmZpbml0eSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCB2LCBfKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgorICAgICAgICAgICAgaWYgdiA9PSAnTmFOJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ25hbicpCisgICAgICAgICAgICBlbGlmIHYgPT0gIkluZmluaXR5IjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCisgICAgICAgICAgICBlbGlmIHYgPT0gIi1JbmZpbml0eSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCctaW5mJykKKworICAgICAgICByZXR1cm4gY2xzLnB5dGhvbl90eXBlKHYpCisKKworY2xhc3MgQmlnRGVjaW1hbElPKF9OdW1iZXJJTyk6CisgICAgcHl0aG9uX3R5cGUgPSBEZWNpbWFsCisgICAgZ3JhcGhzb25fdHlwZSA9ICJneDpCaWdEZWNpbWFsIgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJCaWdEZWNpbWFsIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGJvb2wpOiAgIyBiZWNhdXNlIGlzaW5zdGFuY2UoRmFsc2UsIGludCkgYW5kIGlzaW5zdGFuY2UoVHJ1ZSwgaW50KQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxpZiBtYXRoLmlzbmFuKG4pOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJOYU4iLCAiZ3giKQorICAgICAgICBlbGlmIG1hdGguaXNpbmYobikgYW5kIG4gPiAwOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsICJJbmZpbml0eSIsICJneCIpCisgICAgICAgIGVsaWYgbWF0aC5pc2luZihuKSBhbmQgbiA8IDA6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgIi1JbmZpbml0eSIsICJneCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgc3RyKG4pLCAiZ3giKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgorICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cik6CisgICAgICAgICAgICBpZiB2ID09ICdOYU4nOgorICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKCduYW4nKQorICAgICAgICAgICAgZWxpZiB2ID09ICJJbmZpbml0eSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoJ2luZicpCisgICAgICAgICAgICBlbGlmIHYgPT0gIi1JbmZpbml0eSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoJy1pbmYnKQorCisgICAgICAgIHJldHVybiBEZWNpbWFsKHYpCisKKworY2xhc3MgRG91YmxlSU8oRmxvYXRJTyk6CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOkRvdWJsZSIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiRG91YmxlIgorCisKK2NsYXNzIEludDY0SU8oX051bWJlcklPKToKKyAgICBweXRob25fdHlwZSA9IExvbmdUeXBlCisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOkludDY0IgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJJbnQ2NCIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKKyAgICAgICAgIyBpZiB3ZSBleGNlZWQgSmF2YSBsb25nIHJhbmdlIHRoZW4gd2UgbmVlZCBhIEJpZ0ludGVnZXIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKToKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGVsaWYgbiA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIG4gPiA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCaWdJbnRlZ2VyIiwgc3RyKG4pLCAiZ3giKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCisKKworY2xhc3MgQmlnSW50ZWdlcklPKEludDY0SU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6QmlnSW50ZWdlciIKKworCitjbGFzcyBJbnQzMklPKEludDY0SU8pOgorICAgIHB5dGhvbl90eXBlID0gSW50VHlwZQorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpJbnQzMiIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiSW50MzIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGljdGlmeShjbHMsIG4sIHdyaXRlcik6CisgICAgICAgICMgaWYgd2UgZXhjZWVkIEphdmEgaW50IHJhbmdlIHRoZW4gd2UgbmVlZCBhIGxvbmcKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKToKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGVsaWYgbiA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIG4gPiA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKCJCaWdJbnRlZ2VyIiwgc3RyKG4pLCAiZ3giKQorICAgICAgICBlbGlmIG4gPCAtMjE0NzQ4MzY0OCBvciBuID4gMjE0NzQ4MzY0NzoKKyAgICAgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZSgiSW50NjQiLCBuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4pCisKK2NsYXNzIEJ5dGVJTyhfTnVtYmVySU8pOgorICAgIHB5dGhvbl90eXBlID0gU2luZ2xlQnl0ZQorICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6Qnl0ZSIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiQnl0ZSIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBib29sKTogICMgYmVjYXVzZSBpc2luc3RhbmNlKEZhbHNlLCBpbnQpIGFuZCBpc2luc3RhbmNlKFRydWUsIGludCkKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIHJldHVybiBHcmFwaFNPTlV0aWwudHlwZWRWYWx1ZShjbHMuZ3JhcGhzb25fYmFzZV90eXBlLCBuLCAiZ3giKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgorICAgICAgICByZXR1cm4gaW50Ll9fbmV3X18oU2luZ2xlQnl0ZSwgdikKKworCitjbGFzcyBCeXRlQnVmZmVySU8oX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IEJ5dGVCdWZmZXJUeXBlCisgICAgZ3JhcGhzb25fdHlwZSA9ICJneDpCeXRlQnVmZmVyIgorICAgIGdyYXBoc29uX2Jhc2VfdHlwZSA9ICJCeXRlQnVmZmVyIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgIiIuam9pbihjaHIoeCkgZm9yIHggaW4gbiksICJneCIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6CisgICAgICAgIHJldHVybiBjbHMucHl0aG9uX3R5cGUodiwgInV0ZjgiKQorCisKK2NsYXNzIENoYXJJTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIHB5dGhvbl90eXBlID0gU2luZ2xlQ2hhcgorICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6Q2hhciIKKyAgICBncmFwaHNvbl9iYXNlX3R5cGUgPSAiQ2hhciIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkaWN0aWZ5KGNscywgbiwgd3JpdGVyKToKKyAgICAgICAgcmV0dXJuIEdyYXBoU09OVXRpbC50eXBlZFZhbHVlKGNscy5ncmFwaHNvbl9iYXNlX3R5cGUsIG4sICJneCIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgdiwgXyk6CisgICAgICAgIHJldHVybiBzdHIuX19uZXdfXyhTaW5nbGVDaGFyLCB2KQorCisKK2NsYXNzIER1cmF0aW9uSU8oX0dyYXBoU09OVHlwZUlPKToKKyAgICBweXRob25fdHlwZSA9IHRpbWVkZWx0YQorICAgIGdyYXBoc29uX3R5cGUgPSAiZ3g6RHVyYXRpb24iCisgICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkR1cmF0aW9uIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBuLCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgZHVyYXRpb25faXNvZm9ybWF0KG4pLCAiZ3giKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIHYsIF8pOgorICAgICAgICByZXR1cm4gcGFyc2VfZHVyYXRpb24odikKKworCitjbGFzcyBWZXJ0ZXhEZXNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBncmFwaHNvbl90eXBlID0gImc6VmVydGV4IgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIHJldHVybiBWZXJ0ZXgocmVhZGVyLnRvT2JqZWN0KGRbImlkIl0pLCBkLmdldCgibGFiZWwiLCAidmVydGV4IikpCisKKworY2xhc3MgRWRnZURlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpFZGdlIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIHJldHVybiBFZGdlKHJlYWRlci50b09iamVjdChkWyJpZCJdKSwKKyAgICAgICAgICAgICAgICAgICAgVmVydGV4KHJlYWRlci50b09iamVjdChkWyJvdXRWIl0pLCBkLmdldCgib3V0VkxhYmVsIiwgInZlcnRleCIpKSwKKyAgICAgICAgICAgICAgICAgICAgZC5nZXQoImxhYmVsIiwgImVkZ2UiKSwKKyAgICAgICAgICAgICAgICAgICAgVmVydGV4KHJlYWRlci50b09iamVjdChkWyJpblYiXSksIGQuZ2V0KCJpblZMYWJlbCIsICJ2ZXJ0ZXgiKSkpCisKKworY2xhc3MgVmVydGV4UHJvcGVydHlEZXNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBncmFwaHNvbl90eXBlID0gImc6VmVydGV4UHJvcGVydHkiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgdmVydGV4ID0gVmVydGV4KHJlYWRlci50b09iamVjdChkLmdldCgidmVydGV4IikpKSBpZiAidmVydGV4IiBpbiBkIGVsc2UgTm9uZQorICAgICAgICByZXR1cm4gVmVydGV4UHJvcGVydHkocmVhZGVyLnRvT2JqZWN0KGRbImlkIl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFsibGFiZWwiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci50b09iamVjdChkWyJ2YWx1ZSJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleCkKKworCitjbGFzcyBQcm9wZXJ0eURlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpQcm9wZXJ0eSIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgorICAgICAgICBlbGVtZW50ID0gcmVhZGVyLnRvT2JqZWN0KGRbImVsZW1lbnQiXSkgaWYgImVsZW1lbnQiIGluIGQgZWxzZSBOb25lCisgICAgICAgIHJldHVybiBQcm9wZXJ0eShkWyJrZXkiXSwgcmVhZGVyLnRvT2JqZWN0KGRbInZhbHVlIl0pLCBlbGVtZW50KQorCisKK2NsYXNzIFBhdGhEZXNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBncmFwaHNvbl90eXBlID0gImc6UGF0aCIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgorICAgICAgICByZXR1cm4gUGF0aChyZWFkZXIudG9PYmplY3QoZFsibGFiZWxzIl0pLCByZWFkZXIudG9PYmplY3QoZFsib2JqZWN0cyJdKSkKKworCitjbGFzcyBURGVzZXJpYWxpemVyKF9HcmFwaFNPTlR5cGVJTyk6CisgICAgZ3JhcGhzb25fdHlwZSA9ICJnOlQiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgcmV0dXJuIFRbZF0KKworCitjbGFzcyBEaXJlY3Rpb25JTyhfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpEaXJlY3Rpb24iCisgICAgZ3JhcGhzb25fYmFzZV90eXBlID0gIkRpcmVjdGlvbiIKKyAgICBweXRob25fdHlwZSA9IERpcmVjdGlvbgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRpY3RpZnkoY2xzLCBkLCB3cml0ZXIpOgorICAgICAgICByZXR1cm4gR3JhcGhTT05VdGlsLnR5cGVkVmFsdWUoY2xzLmdyYXBoc29uX2Jhc2VfdHlwZSwgZC5uYW1lLCAiZyIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb2JqZWN0aWZ5KGNscywgZCwgcmVhZGVyKToKKyAgICAgICAgcmV0dXJuIERpcmVjdGlvbltkXQorCisKK2NsYXNzIFRyYXZlcnNhbE1ldHJpY3NEZXNlcmlhbGl6ZXIoX0dyYXBoU09OVHlwZUlPKToKKyAgICBncmFwaHNvbl90eXBlID0gImc6VHJhdmVyc2FsTWV0cmljcyIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvYmplY3RpZnkoY2xzLCBkLCByZWFkZXIpOgorICAgICAgICByZXR1cm4gcmVhZGVyLnRvT2JqZWN0KGQpCisKKworY2xhc3MgTWV0cmljc0Rlc2VyaWFsaXplcihfR3JhcGhTT05UeXBlSU8pOgorICAgIGdyYXBoc29uX3R5cGUgPSAiZzpNZXRyaWNzIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9iamVjdGlmeShjbHMsIGQsIHJlYWRlcik6CisgICAgICAgIHJldHVybiByZWFkZXIudG9PYmplY3QoZCkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vdXRpbC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9ncmVtbGluX3B5dGhvbi9zdHJ1Y3R1cmUvaW8vdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmZkNzJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL2dyZW1saW5fcHl0aG9uL3N0cnVjdHVyZS9pby91dGlsLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworY2xhc3MgSGFzaGFibGVEaWN0KGRpY3QpOgorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGhhc2godHVwbGUoc29ydGVkKHNlbGYuaXRlbXMoKSkpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gaGFzaCh0dXBsZShzb3J0ZWQoc3RyKHgpIGZvciB4IGluIHNlbGYuaXRlbXMoKSkpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9mKGNscywgbyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobywgKHR1cGxlLCBzZXQsIGxpc3QpKToKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShbY2xzLm9mKGUpIGZvciBlIGluIG9dKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG8sIChkaWN0LCBIYXNoYWJsZURpY3QpKToKKyAgICAgICAgICAgIHJldHVybiBvCisKKyAgICAgICAgbmV3X28gPSBIYXNoYWJsZURpY3QoKQorICAgICAgICBmb3IgaywgdiBpbiBvLml0ZW1zKCk6CisgICAgICAgICAgICBuZXdfb1trXSA9IGNscy5vZih2KQorICAgICAgICByZXR1cm4gbmV3X28KKwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3JhZGlzaC9mZWF0dXJlX3N0ZXBzLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3JhZGlzaC9mZWF0dXJlX3N0ZXBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTgwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vcmFkaXNoL2ZlYXR1cmVfc3RlcHMucHkKQEAgLTAsMCArMSwyOTUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGpzb24KK2ltcG9ydCByZQorZnJvbSBncmVtbGluX3B5dGhvbi5zdGF0aWNzIGltcG9ydCBsb25nCitmcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgUGF0aAorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmFub255bW91c190cmF2ZXJzYWwgaW1wb3J0IHRyYXZlcnNhbAorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmdyYXBoX3RyYXZlcnNhbCBpbXBvcnQgX18KK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IEJhcnJpZXIsIENhcmRpbmFsaXR5LCBQLCBUZXh0UCwgUG9wLCBTY29wZSwgQ29sdW1uLCBPcmRlciwgRGlyZWN0aW9uLCBULCBQaWNrLCBPcGVyYXRvciwgSU8sIFdpdGhPcHRpb25zCitmcm9tIHJhZGlzaCBpbXBvcnQgZ2l2ZW4sIHdoZW4sIHRoZW4KK2Zyb20gaGFtY3Jlc3QgaW1wb3J0ICoKKworcmVnZXhfYWxsID0gcmUuY29tcGlsZShyIlBvcFwuYWxsIikKK3JlZ2V4X2FuZCA9IHJlLmNvbXBpbGUociIoWyguLFxzXSlhbmRcKCIpCityZWdleF9hcyA9IHJlLmNvbXBpbGUociIoWyguLFxzXSlhc1woIikKK3JlZ2V4X2Zyb20gPSByZS5jb21waWxlKHIiKFsoLixcc10pZnJvbVwoIikKK3JlZ2V4X2dsb2JhbCA9IHJlLmNvbXBpbGUociIoWyguLFxzXSlnbG9iYWwiKQorcmVnZXhfY2FyZGxpc3QgPSByZS5jb21waWxlKHIiQ2FyZGluYWxpdHlcLmxpc3QiKQorcmVnZXhfaW4gPSByZS5jb21waWxlKHIiKFsoLixcc10paW5cKCIpCityZWdleF9pcyA9IHJlLmNvbXBpbGUociIoWyguLFxzXSlpc1woIikKK3JlZ2V4X25vdCA9IHJlLmNvbXBpbGUociIoWyguLFxzXSlub3RcKCIpCityZWdleF9vciA9IHJlLmNvbXBpbGUociIoWyguLFxzXSlvclwoIikKK3JlZ2V4X3dpdGggPSByZS5jb21waWxlKHIiKFsoLixcc10pd2l0aFwoIikKK3JlZ2V4X3RydWUgPSByZS5jb21waWxlKHIiKHRydWUpIikKK3JlZ2V4X2ZhbHNlID0gcmUuY29tcGlsZShyIihmYWxzZSkiKQorcmVnZXhfbnVsbCA9IHJlLmNvbXBpbGUociIobnVsbCkiKQorCitvdXRWID0gX18ub3V0VgorbGFiZWwgPSBfXy5sYWJlbAoraW5WID0gX18uaW5WCitwcm9qZWN0ID0gX18ucHJvamVjdAordGFpbCA9IF9fLnRhaWwKKworaWdub3JlcyA9IFtdCisKKworQGdpdmVuKCJ0aGUge2dyYXBoX25hbWU6d30gZ3JhcGgiKQorZGVmIGNob29zZV9ncmFwaChzdGVwLCBncmFwaF9uYW1lKToKKyAgICBzdGVwLmNvbnRleHQuZ3JhcGhfbmFtZSA9IGdyYXBoX25hbWUKKyAgICBzdGVwLmNvbnRleHQuZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUoc3RlcC5jb250ZXh0LnJlbW90ZV9jb25uW2dyYXBoX25hbWVdKQorCisKK0BnaXZlbigidGhlIGdyYXBoIGluaXRpYWxpemVyIG9mIikKK2RlZiBpbml0aWFsaXplX2dyYXBoKHN0ZXApOgorICAgIHQgPSBfbWFrZV90cmF2ZXJzYWwoc3RlcC5jb250ZXh0LmcsIHN0ZXAudGV4dCwge30pCisKKyAgICAjIGp1c3QgYmUgc3VyZSB0aGF0IHRoZSB0cmF2ZXJzYWwgcmV0dXJucyBzb21ldGhpbmcgdG8gcHJvdmUgdGhhdCBpdCB3b3JrZWQgdG8gc29tZSBkZWdyZWUuIHByb2JhYmx5CisgICAgIyBpcyBvdmVya2lsbCB0byB0cnkgdG8gYXNzZXJ0IHRoZSBjb21wbGV0ZSBzdWNjZXNzIG9mIHRoaXMgaW5pdCBvcGVyYXRpb24uIHByZXN1bWFibHkgdGhlIHRlc3QKKyAgICAjIHN1aXRlIHdvdWxkIGZhaWwgZWxzZXdoZXJlIGlmIHRoaXMgZGlkbid0IHdvcmsgd2hpY2ggd291bGQgaGVscCBpZGVudGlmeSBhIHByb2JsZW0uCisgICAgcmVzdWx0ID0gdC50b0xpc3QoKQorICAgIGFzc2VydCBsZW4ocmVzdWx0KSA+IDAKKworICAgICMgYWRkIHRoZSBmaXJzdCByZXN1bHQgLSBpZiBhIG1hcCAtIHRvIHRoZSBiaW5kaW5ncy4gdGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZW4gcGFyYW1ldGVycyBmb3IKKyAgICAjIHRoZSB0ZXN0IHRyYXZlcnNhbCBuZWVkIHRvIGNvbWUgZnJvbSB0aGUgb3JpZ2luYWwgZ3JhcGggaW5pdGlhbGl6ZXIgKGkuZS4gYSBuZXcgZ3JhcGggaXMgY3JlYXRlZAorICAgICMgYW5kIHlvdSBuZWVkIHRoZSBpZCBvZiBhIHZlcnRleCBmcm9tIHRoYXQgZ3JhcGgpCisKKworQGdpdmVuKCJhbiB1bnN1cHBvcnRlZCB0ZXN0IikKK2RlZiB1bnN1cHBvcnRlZF9zY2VuYXJpbyhzdGVwKToKKyAgICAjIHRoaXMgaXMgYSBkbyBub3RoaW5nIHN0ZXAgYXMgdGhlIHRlc3QgY2FuJ3QgYmUgc3VwcG9ydGVkIGZvciB3aGF0ZXZlciByZWFzb24KKyAgICByZXR1cm4KKworCitAZ2l2ZW4oInVzaW5nIHRoZSBwYXJhbWV0ZXIge3BhcmFtX25hbWU6d30gZGVmaW5lZCBhcyB7cGFyYW06UXVvdGVkU3RyaW5nfSIpCitkZWYgYWRkX3BhcmFtZXRlcihzdGVwLCBwYXJhbV9uYW1lLCBwYXJhbSk6CisgICAgaWYgbm90IGhhc2F0dHIoc3RlcC5jb250ZXh0LCAidHJhdmVyc2FsX3BhcmFtcyIpOgorICAgICAgICBzdGVwLmNvbnRleHQudHJhdmVyc2FsX3BhcmFtcyA9IHt9CisKKyAgICBzdGVwLmNvbnRleHQudHJhdmVyc2FsX3BhcmFtc1twYXJhbV9uYW1lXSA9IF9jb252ZXJ0KHBhcmFtLnJlcGxhY2UoJ1xcIicsICciJyksIHN0ZXAuY29udGV4dCkKKworCitAZ2l2ZW4oInRoZSB0cmF2ZXJzYWwgb2YiKQorZGVmIHRyYW5zbGF0ZV90cmF2ZXJzYWwoc3RlcCk6CisgICAgc3RlcC5jb250ZXh0Lmlnbm9yZSA9IGlnbm9yZXMuX19jb250YWluc19fKHN0ZXAudGV4dCkKKyAgICBzdGVwLmNvbnRleHQudHJhdmVyc2FsID0gX21ha2VfdHJhdmVyc2FsKAorICAgICAgICBzdGVwLmNvbnRleHQuZywgc3RlcC50ZXh0LAorICAgICAgICBzdGVwLmNvbnRleHQudHJhdmVyc2FsX3BhcmFtcyBpZiBoYXNhdHRyKHN0ZXAuY29udGV4dCwgInRyYXZlcnNhbF9wYXJhbXMiKSBlbHNlIHt9KQorCisKK0B3aGVuKCJpdGVyYXRlZCB0byBsaXN0IikKK2RlZiBpdGVyYXRlX3RoZV90cmF2ZXJzYWwoc3RlcCk6CisgICAgaWYgc3RlcC5jb250ZXh0Lmlnbm9yZToKKyAgICAgICAgcmV0dXJuCisgICAgCisgICAgc3RlcC5jb250ZXh0LnJlc3VsdCA9IGxpc3QobWFwKGxhbWJkYSB4OiBfY29udmVydF9yZXN1bHRzKHgpLCBzdGVwLmNvbnRleHQudHJhdmVyc2FsLnRvTGlzdCgpKSkKKworCitAd2hlbigiaXRlcmF0ZWQgbmV4dCIpCitkZWYgbmV4dF90aGVfdHJhdmVyc2FsKHN0ZXApOgorICAgIGlmIHN0ZXAuY29udGV4dC5pZ25vcmU6CisgICAgICAgIHJldHVybgorCisgICAgc3RlcC5jb250ZXh0LnJlc3VsdCA9IGxpc3QobWFwKGxhbWJkYSB4OiBfY29udmVydF9yZXN1bHRzKHgpLCBzdGVwLmNvbnRleHQudHJhdmVyc2FsLm5leHQoKSkpCisKKworQHRoZW4oInRoZSByZXN1bHQgc2hvdWxkIGJlIHtjaGFyYWN0ZXJpemVkX2FzOnd9IikKK2RlZiBhc3NlcnRfcmVzdWx0KHN0ZXAsIGNoYXJhY3Rlcml6ZWRfYXMpOgorICAgIGlmIHN0ZXAuY29udGV4dC5pZ25vcmU6CisgICAgICAgIHJldHVybgorCisgICAgaWYgY2hhcmFjdGVyaXplZF9hcyA9PSAiZW1wdHkiOiAgICAgICAgIyBubyByZXN1bHRzCisgICAgICAgIGFzc2VydF90aGF0KGxlbihzdGVwLmNvbnRleHQucmVzdWx0KSwgZXF1YWxfdG8oMCkpCisgICAgZWxpZiBjaGFyYWN0ZXJpemVkX2FzID09ICJvcmRlcmVkIjogICAgIyByZXN1bHRzIGFzc2VydGVkIGluIHRoZSBvcmRlciBvZiB0aGUgZGF0YSB0YWJsZQorICAgICAgICBfdGFibGVfYXNzZXJ0aW9uKHN0ZXAudGFibGUsIHN0ZXAuY29udGV4dC5yZXN1bHQsIHN0ZXAuY29udGV4dCwgVHJ1ZSkKKyAgICBlbGlmIGNoYXJhY3Rlcml6ZWRfYXMgPT0gInVub3JkZXJlZCI6ICAjIHJlc3VsdHMgYXNzZXJ0ZWQgaW4gYW55IG9yZGVyCisgICAgICAgIF90YWJsZV9hc3NlcnRpb24oc3RlcC50YWJsZSwgc3RlcC5jb250ZXh0LnJlc3VsdCwgc3RlcC5jb250ZXh0LCBGYWxzZSkKKyAgICBlbGlmIGNoYXJhY3Rlcml6ZWRfYXMgPT0gIm9mIjogICAgICAgICAjIHJlc3VsdHMgbWF5IGJlIG9mIGFueSBvZiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBkYXRhIHRhYmxlCisgICAgICAgIF9hbnlfYXNzZXJ0aW9uKHN0ZXAudGFibGUsIHN0ZXAuY29udGV4dC5yZXN1bHQsIHN0ZXAuY29udGV4dCkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGRhdGEgY2hhcmFjdGVyaXphdGlvbiBvZiAiICsgY2hhcmFjdGVyaXplZF9hcykKKworCitAdGhlbigidGhlIGdyYXBoIHNob3VsZCByZXR1cm4ge2NvdW50OmR9IGZvciBjb3VudCBvZiB7dHJhdmVyc2FsX3N0cmluZzpRdW90ZWRTdHJpbmd9IikKK2RlZiBhc3NlcnRfc2lkZV9lZmZlY3RzKHN0ZXAsIGNvdW50LCB0cmF2ZXJzYWxfc3RyaW5nKToKKyAgICBpZiBzdGVwLmNvbnRleHQuaWdub3JlOgorICAgICAgICByZXR1cm4KKworICAgIHQgPSBfbWFrZV90cmF2ZXJzYWwoc3RlcC5jb250ZXh0LmcsIHRyYXZlcnNhbF9zdHJpbmcucmVwbGFjZSgnXFwiJywgJyInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29udGV4dC50cmF2ZXJzYWxfcGFyYW1zIGlmIGhhc2F0dHIoc3RlcC5jb250ZXh0LCAidHJhdmVyc2FsX3BhcmFtcyIpIGVsc2Uge30pCisgICAgYXNzZXJ0X3RoYXQodC5jb3VudCgpLm5leHQoKSwgZXF1YWxfdG8oY291bnQpKQorCisKK0B0aGVuKCJ0aGUgcmVzdWx0IHNob3VsZCBoYXZlIGEgY291bnQgb2Yge2NvdW50OmR9IikKK2RlZiBhc3NlcnRfY291bnQoc3RlcCwgY291bnQpOgorICAgIGFzc2VydF90aGF0KGxlbihsaXN0KHN0ZXAuY29udGV4dC5yZXN1bHQpKSwgZXF1YWxfdG8oY291bnQpKQorCisKK0B0aGVuKCJub3RoaW5nIHNob3VsZCBoYXBwZW4gYmVjYXVzZSIpCitkZWYgbm90aGluZ19oYXBwZW5pbmcoc3RlcCk6CisgICAgcmV0dXJuCisKKworZGVmIF9jb252ZXJ0KHZhbCwgY3R4KToKKyAgICBncmFwaF9uYW1lID0gY3R4LmdyYXBoX25hbWUKKyAgICBpZiBpc2luc3RhbmNlKHZhbCwgZGljdCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBkaWN0aW9uYXJ5IGtleXMvdmFsdWVzCisgICAgICAgIG4gPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiB2YWwuaXRlbXMoKToKKyAgICAgICAgICAgIG5bX2NvbnZlcnQoa2V5LCBjdHgpXSA9IF9jb252ZXJ0KHZhbHVlLCBjdHgpCisgICAgICAgIHJldHVybiBuCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2gociJebFxbLipcXSQiLCB2YWwpOiAgICAgICAgICAgIyBwYXJzZSBsaXN0CisgICAgICAgIHJldHVybiBbXSBpZiB2YWwgPT0gImxbXSIgZWxzZSBsaXN0KG1hcCgobGFtYmRhIHg6IF9jb252ZXJ0KHgsIGN0eCkpLCB2YWxbMjotMV0uc3BsaXQoIiwiKSkpCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2gociJec1xbLipcXSQiLCB2YWwpOiAgICAgICAgICAgIyBwYXJzZSBzZXQKKyAgICAgICAgcmV0dXJuIHNldCgpIGlmIHZhbCA9PSAic1tdIiBlbHNlIHNldChtYXAoKGxhbWJkYSB4OiBfY29udmVydCh4LCBjdHgpKSwgdmFsWzI6LTFdLnNwbGl0KCIsIikpKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKHIiXmRcWy4qXF1cLltpbGZkbV0kIiwgdmFsKTogICMgcGFyc2UgbnVtZXJpYworICAgICAgICByZXR1cm4gZmxvYXQodmFsWzI6LTNdKSBpZiB2YWxbMjotM10uX19jb250YWluc19fKCIuIikgZWxzZSBsb25nKHZhbFsyOi0zXSkKKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHIpIGFuZCByZS5tYXRjaChyIl52XFsuKlxdXC5pZCQiLCB2YWwpOiAgICAgICAjIHBhcnNlIHZlcnRleCBpZAorICAgICAgICByZXR1cm4gX19maW5kX2NhY2hlZF9lbGVtZW50KGN0eCwgZ3JhcGhfbmFtZSwgdmFsWzI6LTRdLCAidiIpLmlkCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2gociJedlxbLipcXVwuc2lkJCIsIHZhbCk6ICAgICAgIyBwYXJzZSB2ZXJ0ZXggaWQgYXMgc3RyaW5nCisgICAgICAgIHJldHVybiBzdHIoX19maW5kX2NhY2hlZF9lbGVtZW50KGN0eCwgZ3JhcGhfbmFtZSwgdmFsWzI6LTVdLCAidiIpLmlkKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKHIiXnZcWy4qXF0kIiwgdmFsKTogICAgICAgICAgICMgcGFyc2UgdmVydGV4CisgICAgICAgIHJldHVybiBfX2ZpbmRfY2FjaGVkX2VsZW1lbnQoY3R4LCBncmFwaF9uYW1lLCB2YWxbMjotMV0sICJ2IikKKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHIpIGFuZCByZS5tYXRjaChyIl5lXFsuKlxdXC5pZCQiLCB2YWwpOiAgICAgICAjIHBhcnNlIGVkZ2UgaWQKKyAgICAgICAgcmV0dXJuIF9fZmluZF9jYWNoZWRfZWxlbWVudChjdHgsIGdyYXBoX25hbWUsIHZhbFsyOi00XSwgImUiKS5pZAorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKHIiXmVcWy4qXF1cLnNpZCQiLCB2YWwpOiAgICAgICMgcGFyc2UgZWRnZSBpZCBhcyBzdHJpbmcKKyAgICAgICAgcmV0dXJuIHN0cihfX2ZpbmRfY2FjaGVkX2VsZW1lbnQoY3R4LCBncmFwaF9uYW1lLCB2YWxbMjotNV0sICJlIikuaWQpCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2gociJeZVxbLipcXSQiLCB2YWwpOiAgICAgICAgICAgIyBwYXJzZSBlZGdlCisgICAgICAgIHJldHVybiBfX2ZpbmRfY2FjaGVkX2VsZW1lbnQoY3R4LCBncmFwaF9uYW1lLCB2YWxbMjotMV0sICJlIikKKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHIpIGFuZCByZS5tYXRjaChyIl5tXFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIGpzb24gYXMgYSBtYXAKKyAgICAgICAgcmV0dXJuIF9jb252ZXJ0KGpzb24ubG9hZHModmFsWzI6LTFdKSwgY3R4KQorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKHIiXnBcWy4qXF0kIiwgdmFsKTogICAgICAgICAgICMgcGFyc2UgcGF0aAorICAgICAgICBwYXRoX29iamVjdHMgPSBsaXN0KG1hcCgobGFtYmRhIHg6IF9jb252ZXJ0KHgsIGN0eCkpLCB2YWxbMjotMV0uc3BsaXQoIiwiKSkpCisgICAgICAgIHJldHVybiBQYXRoKFtzZXQoW10pXSwgcGF0aF9vYmplY3RzKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cikgYW5kIHJlLm1hdGNoKHIiXmNcWy4qXF0kIiwgdmFsKTogICAgICAgICAgICMgcGFyc2UgbGFtYmRhL2Nsb3N1cmUKKyAgICAgICAgcmV0dXJuIGxhbWJkYTogKHZhbFsyOi0xXSwgImdyZW1saW4tZ3Jvb3Z5IikKKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHIpIGFuZCByZS5tYXRjaChyIl50XFsuKlxdJCIsIHZhbCk6ICAgICAgICAgICAjIHBhcnNlIGluc3RhbmNlIG9mIFQgZW51bQorICAgICAgICByZXR1cm4gVFt2YWxbMjotMV1dCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKSBhbmQgcmUubWF0Y2gociJeRFxbLipcXSQiLCB2YWwpOiAgICAgICAgICAgIyBwYXJzZSBpbnN0YW5jZSBvZiBEaXJlY3Rpb24gZW51bQorICAgICAgICByZXR1cm4gRGlyZWN0aW9uW3ZhbFsyOi0xXV0KKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHIpIGFuZCByZS5tYXRjaChyIl5udWxsJCIsIHZhbCk6ICAgICAgICAgICAgICAjIHBhcnNlIG51bGwgdG8gTm9uZQorICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB2YWwKKworCitkZWYgX19maW5kX2NhY2hlZF9lbGVtZW50KGN0eCwgZ3JhcGhfbmFtZSwgaWRlbnRpZmllciwgZWxlbWVudF90eXBlKToKKyAgICBpZiBncmFwaF9uYW1lID09ICJlbXB0eSI6CisgICAgICAgIGNhY2hlID0gX19jcmVhdGVfbG9va3VwX3YoY3R4LnJlbW90ZV9jb25uWyJlbXB0eSJdKSBpZiBlbGVtZW50X3R5cGUgPT0gInYiIGVsc2UgX19jcmVhdGVfbG9va3VwX2UoY3R4LnJlbW90ZV9jb25uWyJlbXB0eSJdKQorICAgIGVsc2U6CisgICAgICAgIGNhY2hlID0gY3R4Lmxvb2t1cF92W2dyYXBoX25hbWVdIGlmIGVsZW1lbnRfdHlwZSA9PSAidiIgZWxzZSBjdHgubG9va3VwX2VbZ3JhcGhfbmFtZV0KKworICAgIHJldHVybiBjYWNoZVtpZGVudGlmaWVyXQorCisKK2RlZiBfY29udmVydF9yZXN1bHRzKHZhbCk6CisgICAgaWYgaXNpbnN0YW5jZSh2YWwsIFBhdGgpOgorICAgICAgICAjIGtpbGwgb3V0IGxhYmVscyBhcyB0aGV5IGFyZW4ndCBpbiB0aGUgYXNzZXJ0aW9uIGxvZ2ljCisgICAgICAgIHJldHVybiBQYXRoKFtzZXQoW10pXSwgdmFsLm9iamVjdHMpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHZhbAorCisKK2RlZiBfYW55X2Fzc2VydGlvbihkYXRhLCByZXN1bHQsIGN0eCk6CisgICAgY29udmVydGVkID0gW19jb252ZXJ0KGxpbmVbJ3Jlc3VsdCddLCBjdHgpIGZvciBsaW5lIGluIGRhdGFdCisgICAgZm9yIHIgaW4gcmVzdWx0OgorICAgICAgICBhc3NlcnRfdGhhdChyLCBpc19pbihjb252ZXJ0ZWQpKQorCisKK2RlZiBfdGFibGVfYXNzZXJ0aW9uKGRhdGEsIHJlc3VsdCwgY3R4LCBvcmRlcmVkKToKKyAgICAjIHJlc3VsdHMgZnJvbSB0cmF2ZXJzYWwgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMgYXMgdGhlIGZlYXR1cmUgZGF0YSB0YWJsZQorICAgIGFzc2VydF90aGF0KGxlbihyZXN1bHQpLCBlcXVhbF90byhsZW4oZGF0YSkpLCAicmVzdWx0OiIgKyBzdHIocmVzdWx0KSkKKworICAgIHJlc3VsdHNfdG9fdGVzdCA9IGxpc3QocmVzdWx0KQorCisgICAgIyBmaW5kcyBhIG1hdGNoIGluIHRoZSByZXN1bHRzIGZvciBlYWNoIGxpbmUgb2YgZGF0YSB0byBhc3NlcnQgYW5kIHRoZW4gcmVtb3ZlcyB0aGF0IGl0ZW0KKyAgICAjIGZyb20gdGhlIGxpc3QgLSBpbiB0aGUgZW5kIHRoZXJlIHNob3VsZCBiZSBubyBpdGVtcyBsZWZ0IG92ZXIgYW5kIGVhY2ggd2lsbCBoYXZlIGJlZW4gYXNzZXJ0ZWQKKyAgICBmb3IgaXgsIGxpbmUgaW4gZW51bWVyYXRlKGRhdGEpOgorICAgICAgICB2YWwgPSBfY29udmVydChsaW5lWydyZXN1bHQnXSwgY3R4KQorCisgICAgICAgICMgY2xlYXIgdGhlIGxhYmVscyBzaW5jZSB3ZSBkb24ndCBkZWZpbmUgdGhlbSBpbiAuZmVhdHVyZSBmaWxlcworICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgUGF0aCk6CisgICAgICAgICAgICB2YWwubGFiZWxzID0gW3NldChbXSldCisKKyAgICAgICAgaWYgb3JkZXJlZDoKKyAgICAgICAgICAgIGFzc2VydF90aGF0KHJlc3VsdHNfdG9fdGVzdFtpeF0sIGVxdWFsX3RvKHZhbCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnRfdGhhdCh2YWwsIGlzX2luKHJlc3VsdHNfdG9fdGVzdCkpCisgICAgICAgICAgICByZXN1bHRzX3RvX3Rlc3QucmVtb3ZlKHZhbCkKKworICAgIGlmIG5vdCBvcmRlcmVkOgorICAgICAgICBhc3NlcnRfdGhhdChsZW4ocmVzdWx0c190b190ZXN0KSwgaXNfKDApKQorCisKK2RlZiBfdHJhbnNsYXRlKHRyYXZlcnNhbF8pOgorICAgIHJlcGxhY2VkID0gdHJhdmVyc2FsXy5yZXBsYWNlKCJcbiIsICIiKQorICAgIHJlcGxhY2VkID0gcmVnZXhfYWxsLnN1YihyIlBvcC5hbGxfIiwgcmVwbGFjZWQpCisgICAgcmVwbGFjZWQgPSByZWdleF9jYXJkbGlzdC5zdWIociJDYXJkaW5hbGl0eS5saXN0XyIsIHJlcGxhY2VkKQorICAgIHJlcGxhY2VkID0gcmVnZXhfYW5kLnN1YihyIlwxYW5kXygiLCByZXBsYWNlZCkKKyAgICByZXBsYWNlZCA9IHJlZ2V4X2Zyb20uc3ViKHIiXDFmcm9tXygiLCByZXBsYWNlZCkKKyAgICByZXBsYWNlZCA9IHJlZ2V4X2dsb2JhbC5zdWIociJcMWdsb2JhbF8iLCByZXBsYWNlZCkKKyAgICByZXBsYWNlZCA9IHJlZ2V4X2FzLnN1YihyIlwxYXNfKCIsIHJlcGxhY2VkKQorICAgIHJlcGxhY2VkID0gcmVnZXhfaXMuc3ViKHIiXDFpc18oIiwgcmVwbGFjZWQpCisgICAgcmVwbGFjZWQgPSByZWdleF9ub3Quc3ViKHIiXDFub3RfKCIsIHJlcGxhY2VkKQorICAgIHJlcGxhY2VkID0gcmVnZXhfb3Iuc3ViKHIiXDFvcl8oIiwgcmVwbGFjZWQpCisgICAgcmVwbGFjZWQgPSByZWdleF9pbi5zdWIociJcMWluXygiLCByZXBsYWNlZCkKKyAgICByZXBsYWNlZCA9IHJlZ2V4X3dpdGguc3ViKHIiXDF3aXRoXygiLCByZXBsYWNlZCkKKyAgICByZXBsYWNlZCA9IHJlZ2V4X3RydWUuc3ViKHIiVHJ1ZSIsIHJlcGxhY2VkKQorICAgIHJlcGxhY2VkID0gcmVnZXhfZmFsc2Uuc3ViKHIiRmFsc2UiLCByZXBsYWNlZCkKKyAgICByZXR1cm4gcmVnZXhfbnVsbC5zdWIociJOb25lIiwgcmVwbGFjZWQpCisKKworZGVmIF9tYWtlX3RyYXZlcnNhbChnLCB0cmF2ZXJzYWxfc3RyaW5nLCBwYXJhbXMpOgorICAgIGIgPSB7ImciOiBnLAorICAgICAgICAgIl9fIjogX18sCisgICAgICAgICAiQmFycmllciI6IEJhcnJpZXIsCisgICAgICAgICAiQ2FyZGluYWxpdHkiOiBDYXJkaW5hbGl0eSwKKyAgICAgICAgICJDb2x1bW4iOiBDb2x1bW4sCisgICAgICAgICAiRGlyZWN0aW9uIjogRGlyZWN0aW9uLAorICAgICAgICAgIk9yZGVyIjogT3JkZXIsCisgICAgICAgICAiUCI6IFAsCisgICAgICAgICAiVGV4dFAiOiBUZXh0UCwKKyAgICAgICAgICJJTyI6IElPLAorICAgICAgICAgIlBpY2siOiBQaWNrLAorICAgICAgICAgIlBvcCI6IFBvcCwKKyAgICAgICAgICJTY29wZSI6IFNjb3BlLAorICAgICAgICAgIk9wZXJhdG9yIjogT3BlcmF0b3IsCisgICAgICAgICAiVCI6IFQsCisgICAgICAgICAiV2l0aE9wdGlvbnMiOiBXaXRoT3B0aW9uc30KKworICAgIGIudXBkYXRlKHBhcmFtcykKKworICAgIHJldHVybiBldmFsKF90cmFuc2xhdGUodHJhdmVyc2FsX3N0cmluZyksIGIpCisKKworZGVmIF9fY3JlYXRlX2xvb2t1cF92KHJlbW90ZSk6CisgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlKQorCisgICAgIyBob2xkIGEgbWFwIG9mIG5hbWUvdmVydGV4IGZvciB1c2UgaW4gYXNzZXJ0aW5nIHJlc3VsdHMKKyAgICByZXR1cm4gZy5WKCkuZ3JvdXAoKS5ieSgnbmFtZScpLmJ5KHRhaWwoKSkubmV4dCgpCisKKworZGVmIF9fY3JlYXRlX2xvb2t1cF9lKHJlbW90ZSk6CisgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlKQorCisgICAgIyBob2xkIGEgbWFwIG9mIHRoZSAibmFtZSIvZWRnZSBmb3IgdXNlIGluIGFzc2VydGluZyByZXN1bHRzIC0gIm5hbWUiIGluIHRoaXMgY29udGV4dCBpcyBpbiB0aGUgZm9ybSBvZgorICAgICMgb3V0Z29pbmdWLWxhYmVsLT5pbmNvbWluZ1YKKyAgICByZXR1cm4gZy5FKCkuZ3JvdXAoKS4gXAorICAgICAgICBieShsYW1iZGE6ICgiaXQub3V0VmVydGV4KCkudmFsdWUoJ25hbWUnKSArICctJyArIGl0LmxhYmVsKCkgKyAnLT4nICsgaXQuaW5WZXJ0ZXgoKS52YWx1ZSgnbmFtZScpIiwgImdyZW1saW4tZ3Jvb3Z5IikpLiBcCisgICAgICAgIGJ5KHRhaWwoKSkubmV4dCgpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vcmFkaXNoL3RlcnJhaW4ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vcmFkaXNoL3RlcnJhaW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4Zjg2NAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi9yYWRpc2gvdGVycmFpbi5weQpAQCAtMCwwICsxLDExNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuYW5vbnltb3VzX3RyYXZlcnNhbCBpbXBvcnQgdHJhdmVyc2FsCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBfXworZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIgaW1wb3J0IHNlcmlhbGl6ZXIKK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLmRyaXZlcl9yZW1vdGVfY29ubmVjdGlvbiBpbXBvcnQgRHJpdmVyUmVtb3RlQ29ubmVjdGlvbgorZnJvbSByYWRpc2ggaW1wb3J0IGJlZm9yZSwgYWZ0ZXIsIHdvcmxkCisKK291dFYgPSBfXy5vdXRWCitsYWJlbCA9IF9fLmxhYmVsCitpblYgPSBfXy5pblYKK3Byb2plY3QgPSBfXy5wcm9qZWN0Cit0YWlsID0gX18udGFpbAorCisKK0BiZWZvcmUuYWxsCitkZWYgcHJlcGFyZV9zdGF0aWNfdHJhdmVyc2FsX3NvdXJjZShmZWF0dXJlcywgbWFya2VyKToKKyAgICAjIGFzIHRoZSB2YXJpb3VzIHRyYXZlcnNhbCBzb3VyY2VzIGZvciB0ZXN0aW5nIGRvIG5vdCBjaGFuZ2UgdGhlaXIgZGF0YSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZS1jcmVhdGUgcmVtb3RlcworICAgICMgYW5kIGNsaWVudCBzaWRlIGxvb2t1cCBkYXRhIG92ZXIgYW5kIG92ZXIuIGl0IGNhbiBiZSBjcmVhdGVkIG9uY2UgZm9yIGFsbCB0ZXN0cyBhbmQgYmUgcmV1c2VkLgorICAgIGNhY2hlID0ge30KKyAgICBmb3IgZ3JhcGhfbmFtZSBpbiAoKCJtb2Rlcm4iLCAiZ21vZGVybiIpLCAoImNsYXNzaWMiLCAiZ2NsYXNzaWMiKSwgKCJjcmV3IiwgImdjcmV3IiksICgiZ3JhdGVmdWwiLCAiZ2dyYXRlZnVsIiksICgic2luayIsICJnc2luayIpKToKKyAgICAgICAgY2FjaGVbZ3JhcGhfbmFtZVswXV0gPSB7fQorICAgICAgICByZW1vdGUgPSBfX2NyZWF0ZV9yZW1vdGUoZ3JhcGhfbmFtZVsxXSkKKyAgICAgICAgY2FjaGVbZ3JhcGhfbmFtZVswXV1bInJlbW90ZV9jb25uIl0gPSBfX2NyZWF0ZV9yZW1vdGUoZ3JhcGhfbmFtZVsxXSkKKyAgICAgICAgY2FjaGVbZ3JhcGhfbmFtZVswXV1bImxvb2t1cF92Il0gPSBfX2NyZWF0ZV9sb29rdXBfdihyZW1vdGUpCisgICAgICAgIGNhY2hlW2dyYXBoX25hbWVbMF1dWyJsb29rdXBfZSJdID0gX19jcmVhdGVfbG9va3VwX2UocmVtb3RlKQorCisgICAgIyBzdG9yZSB0aGUgY2FjaGUgb24gdGhlIGdsb2JhbCBjb250ZXh0IHNvIHRoYXQgcmVtb3RlcyBjYW4gYmUgc2h1dGRvd24gY2xlYW5seSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0cworICAgIHdvcmxkLmNhY2hlID0gY2FjaGUKKworICAgICMgaXRlcmF0ZSBlYWNoIGZlYXR1cmUgYW5kIGFwcGx5IHRoZSBjYWNoZWQgcmVtb3Rlcy9sb29rdXBzIHRvIGVhY2ggc2NlbmFyaW8gY29udGV4dCBzbyB0aGF0IHRoZXkgYXJlCisgICAgIyBhY2Nlc3NpYmxlIHRvIHRoZSBmZWF0dXJlIHN0ZXBzIGZvciB0ZXN0IGxvZ2ljCisgICAgZm9yIGZlYXR1cmUgaW4gZmVhdHVyZXM6CisgICAgICAgIGZvciBzY2VuYXJpbyBpbiBmZWF0dXJlLmFsbF9zY2VuYXJpb3M6CisgICAgICAgICAgICBzY2VuYXJpby5jb250ZXh0LnJlbW90ZV9jb25uID0ge30KKyAgICAgICAgICAgIHNjZW5hcmlvLmNvbnRleHQubG9va3VwX3YgPSB7fQorICAgICAgICAgICAgc2NlbmFyaW8uY29udGV4dC5sb29rdXBfZSA9IHt9CisKKyAgICAgICAgICAgIGZvciBncmFwaF9uYW1lIGluICgibW9kZXJuIiwgImNsYXNzaWMiLCAiY3JldyIsICJncmF0ZWZ1bCIsICJzaW5rIik6CisgICAgICAgICAgICAgICAgc2NlbmFyaW8uY29udGV4dC5yZW1vdGVfY29ubltncmFwaF9uYW1lXSA9IGNhY2hlW2dyYXBoX25hbWVdWyJyZW1vdGVfY29ubiJdCisgICAgICAgICAgICAgICAgc2NlbmFyaW8uY29udGV4dC5sb29rdXBfdltncmFwaF9uYW1lXSA9IGNhY2hlW2dyYXBoX25hbWVdWyJsb29rdXBfdiJdCisgICAgICAgICAgICAgICAgc2NlbmFyaW8uY29udGV4dC5sb29rdXBfZVtncmFwaF9uYW1lXSA9IGNhY2hlW2dyYXBoX25hbWVdWyJsb29rdXBfZSJdCisKKyAgICAgICAgICAgICMgc2V0dXAgdGhlICJlbXB0eSIgbG9va3VwcyBhcyBuZWVkZWQKKyAgICAgICAgICAgIHNjZW5hcmlvLmNvbnRleHQubG9va3VwX3ZbImVtcHR5Il0gPSB7fQorICAgICAgICAgICAgc2NlbmFyaW8uY29udGV4dC5sb29rdXBfZVsiZW1wdHkiXSA9IHt9CisKKworQGJlZm9yZS5lYWNoX3NjZW5hcmlvCitkZWYgcHJlcGFyZV90cmF2ZXJzYWxfc291cmNlKHNjZW5hcmlvKToKKyAgICAjIHNvbWUgdGVzdHMgY3JlYXRlIGRhdGEgLSBjcmVhdGUgYSBmcmVzaCByZW1vdGUgdG8gdGhlIGVtcHR5IGdyYXBoIGFuZCBjbGVhciB0aGF0IGdyYXBoIHByaW9yIHRvIGVhY2ggdGVzdAorICAgIHJlbW90ZSA9IF9fY3JlYXRlX3JlbW90ZSgiZ2dyYXBoIikKKyAgICBzY2VuYXJpby5jb250ZXh0LnJlbW90ZV9jb25uWyJlbXB0eSJdID0gcmVtb3RlCisgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlKQorICAgIGcuVigpLmRyb3AoKS5pdGVyYXRlKCkKKworCitAYWZ0ZXIuZWFjaF9zY2VuYXJpbworZGVmIGNsb3NlX3RyYXZlcnNhbF9zb3VyY2Uoc2NlbmFyaW8pOgorICAgIHNjZW5hcmlvLmNvbnRleHQucmVtb3RlX2Nvbm5bImVtcHR5Il0uY2xvc2UoKQorCisKK0BhZnRlci5hbGwKK2RlZiBjbG9zZV9zdGF0aWNfdHJhdmVyc2FsX3NvdXJjZShmZWF0dXJlcywgbWFya2VyKToKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiB3b3JsZC5jYWNoZS5pdGVtcygpOgorICAgICAgICB2YWx1ZVsicmVtb3RlX2Nvbm4iXS5jbG9zZSgpCisKKworZGVmIF9fY3JlYXRlX3JlbW90ZShzZXJ2ZXJfZ3JhcGhfbmFtZSk6CisgICAgaWYgbm90KCJzZXJpYWxpemVyIiBpbiB3b3JsZC5jb25maWcudXNlcl9kYXRhKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGVzdCBjb25maWd1cmF0aW9uIHJlcXVpcmVzIHNldHRpbmcgb2YgLS11c2VyLWRhdGE9InNlcmlhbGl6ZXI9e21pbWUtdHlwZX0iJykKKworICAgIGlmIHdvcmxkLmNvbmZpZy51c2VyX2RhdGFbInNlcmlhbGl6ZXIiXSA9PSAiYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtqc29uIjoKKyAgICAgICAgcyA9IHNlcmlhbGl6ZXIuR3JhcGhTT05TZXJpYWxpemVyc1YzZDAoKQorICAgIGVsaWYgd29ybGQuY29uZmlnLnVzZXJfZGF0YVsic2VyaWFsaXplciJdID09ICJhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMCI6CisgICAgICAgIHMgPSBzZXJpYWxpemVyLkdyYXBoQmluYXJ5U2VyaWFsaXplcnNWMSgpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignc2VyaWFsaXplciBub3QgZm91bmQgLSAnICsgd29ybGQuY29uZmlnLnVzZXJfZGF0YVsic2VyaWFsaXplciJdKQorCisgICAgcmV0dXJuIERyaXZlclJlbW90ZUNvbm5lY3Rpb24oJ3dzOi8vbG9jYWxob3N0OjQ1OTQwL2dyZW1saW4nLCBzZXJ2ZXJfZ3JhcGhfbmFtZSwgbWVzc2FnZV9zZXJpYWxpemVyPXMpCisKKworZGVmIF9fY3JlYXRlX2xvb2t1cF92KHJlbW90ZSk6CisgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlKQorCisgICAgIyBob2xkIGEgbWFwIG9mIG5hbWUvdmVydGV4IGZvciB1c2UgaW4gYXNzZXJ0aW5nIHJlc3VsdHMKKyAgICByZXR1cm4gZy5WKCkuZ3JvdXAoKS5ieSgnbmFtZScpLmJ5KHRhaWwoKSkubmV4dCgpCisKKworZGVmIF9fY3JlYXRlX2xvb2t1cF9lKHJlbW90ZSk6CisgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlKQorCisgICAgIyBob2xkIGEgbWFwIG9mIHRoZSAibmFtZSIvZWRnZSBmb3IgdXNlIGluIGFzc2VydGluZyByZXN1bHRzIC0gIm5hbWUiIGluIHRoaXMgY29udGV4dCBpcyBpbiB0aGUgZm9ybSBvZgorICAgICMgb3V0Z29pbmdWLWxhYmVsLT5pbmNvbWluZ1YKKyAgICByZXR1cm4gZy5FKCkuZ3JvdXAoKS4gXAorICAgICAgICBieShsYW1iZGE6ICgiaXQub3V0VmVydGV4KCkudmFsdWUoJ25hbWUnKSArICctJyArIGl0LmxhYmVsKCkgKyAnLT4nICsgaXQuaW5WZXJ0ZXgoKS52YWx1ZSgnbmFtZScpIiwgImdyZW1saW4tZ3Jvb3Z5IikpLiBcCisgICAgICAgIGJ5KHRhaWwoKSkubmV4dCgpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vc2V0dXAuY2ZnIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3NldHVwLmNmZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3NldHVwLmNmZwpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3NldHVwLmNmZwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3NldHVwLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTU5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vc2V0dXAucHkKQEAgLTAsMCArMSw5NCBAQAorIiIiCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorIiIiCitpbXBvcnQgY29kZWNzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCisKKyMgRm9sZGVyIGNvbnRhaW5pbmcgdGhlIHNldHVwLnB5Cityb290ID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCisKKyMgUGF0aCB0byBfX3ZlcnNpb25fXyBtb2R1bGUKK3ZlcnNpb25fZmlsZSA9IG9zLnBhdGguam9pbihyb290LCAnZ3JlbWxpbl9weXRob24nLCAnX192ZXJzaW9uX18ucHknKQorCisjIENoZWNrIGlmIHRoaXMgaXMgYSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorIyBJZiBub3QgY3JlYXRlIHRoZSBfX3ZlcnNpb25fXyBtb2R1bGUgY29udGFpbmluZyB0aGUgdmVyc2lvbgoraWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihyb290LCAnUEtHLUlORk8nKSk6CisgICAgdGltZXN0YW1wID0gaW50KG9zLmdldGVudignVElNRVNUQU1QJywgdGltZS50aW1lKCkgKiAxMDAwKSkgLyAxMDAwCisgICAgZmQgPSBjb2RlY3Mub3Blbih2ZXJzaW9uX2ZpbGUsICd3JywgJ3V0Zi04JykKKyAgICBmZC53cml0ZSgiJycnIikKKyAgICBmZC53cml0ZShfX2RvY19fKQorICAgIGZkLndyaXRlKCInJydcbiIpCisgICAgZmQud3JpdGUoJ3ZlcnNpb24gICA9ICVyXG4nICUgb3MuZ2V0ZW52KCdWRVJTSU9OJywgJz8nKS5yZXBsYWNlKCctU05BUFNIT1QnLCAnLmRldi0lZCcgJSB0aW1lc3RhbXApKQorICAgIGZkLndyaXRlKCd0aW1lc3RhbXAgPSAlZFxuJyAlIHRpbWVzdGFtcCkKKyAgICBmZC5jbG9zZSgpCisjIExvYWQgdmVyc2lvbgorZnJvbSBncmVtbGluX3B5dGhvbiBpbXBvcnQgX192ZXJzaW9uX18KKwordmVyc2lvbiA9IF9fdmVyc2lvbl9fLnZlcnNpb24KKworaW5zdGFsbF9yZXF1aXJlcyA9IFsKKyAgICAnYWVudW0+PTEuNC41LDwzLjAuMCcsCisgICAgJ3Rvcm5hZG8+PTQuNC4xLDw2LjAnLAorICAgICdzaXg+PTEuMTAuMCw8Mi4wLjAnLAorICAgICdpc29kYXRlPj0wLjYuMCw8MS4wLjAnLAorICAgICdweXBhcnNpbmc+PTIuNC43LDwzLjAuMCcKK10KKworaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKToKKyAgICBpbnN0YWxsX3JlcXVpcmVzICs9IFsnZnV0dXJlcz49My4wLjUsPDQuMC4wJ10KKworaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCA1KToKKyAgICBpbnN0YWxsX3JlcXVpcmVzICs9IFsncHlwYXJzaW5nPj0yLjQuNiw8My4wLjAnXQorCitzZXR1cCgKKyAgICBuYW1lPSdncmVtbGlucHl0aG9uJywKKyAgICB2ZXJzaW9uPXZlcnNpb24sCisgICAgcGFja2FnZXM9WydncmVtbGluX3B5dGhvbicsICdncmVtbGluX3B5dGhvbi5kcml2ZXInLAorICAgICAgICAgICAgICAnZ3JlbWxpbl9weXRob24uZHJpdmVyLnRvcm5hZG8nLCAnZ3JlbWxpbl9weXRob24ucHJvY2VzcycsCisgICAgICAgICAgICAgICdncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUnLCAnZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvJ10sCisgICAgbGljZW5zZT0nQXBhY2hlIDInLAorICAgIHVybD0naHR0cDovL3RpbmtlcnBvcC5hcGFjaGUub3JnJywKKyAgICBkZXNjcmlwdGlvbj0nR3JlbWxpbi1QeXRob24gZm9yIEFwYWNoZSBUaW5rZXJQb3AnLAorICAgIGxvbmdfZGVzY3JpcHRpb249Y29kZWNzLm9wZW4oIlJFQURNRS5yc3QiLCAiciIsICJVVEYtOCIpLnJlYWQoKSwKKyAgICBsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZT0ndGV4dC94LXJzdCcsCisgICAgdGVzdF9zdWl0ZT0idGVzdHMiLAorICAgIGRhdGFfZmlsZXM9WygiIiwgWyJMSUNFTlNFIiwgIk5PVElDRSJdKV0sCisgICAgc2V0dXBfcmVxdWlyZXM9WworICAgICAgICAncHl0ZXN0LXJ1bm5lcicsCisgICAgXSwKKyAgICB0ZXN0c19yZXF1aXJlPVsKKyAgICAgICAgJ3B5dGVzdD49NC42LjQsPDUuMC4wJywKKyAgICAgICAgJ21vY2s+PTMuMC41LDw0LjAuMCcsCisgICAgICAgICdyYWRpc2gtYmRkPT0wLjguNicsCisgICAgICAgICdQeUhhbWNyZXN0Pj0xLjkuMCw8Mi4wLjAnCisgICAgXSwKKyAgICBpbnN0YWxsX3JlcXVpcmVzPWluc3RhbGxfcmVxdWlyZXMsCisgICAgZXh0cmFfcmVxdWlyZT17CisgICAgICAgICdrZXJiZXJvcyc6ICdrZXJiZXJvcz49MS4zLjAsPDIuMC4wJyAgICAjIERvZXMgbm90IGluc3RhbGwgaW4gTWljcm9zb2Z0IFdpbmRvd3MKKyAgICB9LAorICAgIGNsYXNzaWZpZXJzPVsKKyAgICAgICAgIkludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMiLAorICAgICAgICAiTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UiLAorICAgICAgICAiTmF0dXJhbCBMYW5ndWFnZSA6OiBFbmdsaXNoIiwKKyAgICAgICAgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQiLAorICAgICAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNSIsCisgICAgXQorKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL19faW5pdF9fLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvX19pbml0X18ucHkKcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL2NvbmZ0ZXN0LnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL2NvbmZ0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmJiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvY29uZnRlc3QucHkKQEAgLTAsMCArMSwxNjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvbmN1cnJlbnQuZnV0dXJlcworaW1wb3J0IHB5dGVzdAoraW1wb3J0IHNvY2tldAorCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKKworZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIuY2xpZW50IGltcG9ydCBDbGllbnQKK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLmNvbm5lY3Rpb24gaW1wb3J0IENvbm5lY3Rpb24KK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyIGltcG9ydCBzZXJpYWxpemVyCitmcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb24gaW1wb3J0ICgKKyAgICBEcml2ZXJSZW1vdGVDb25uZWN0aW9uKQorZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIucHJvdG9jb2wgaW1wb3J0IEdyZW1saW5TZXJ2ZXJXU1Byb3RvY29sCitmcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5zZXJpYWxpemVyIGltcG9ydCAoCisgICAgR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplciwgR3JhcGhTT05TZXJpYWxpemVyc1YyZDAsIEdyYXBoU09OU2VyaWFsaXplcnNWM2QwLAorICAgIEdyYXBoQmluYXJ5U2VyaWFsaXplcnNWMSkKK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLnRvcm5hZG8udHJhbnNwb3J0IGltcG9ydCBUb3JuYWRvVHJhbnNwb3J0CisKK2dyZW1saW5fc2VydmVyX3VybCA9ICd3czovL2xvY2FsaG9zdDp7fS9ncmVtbGluJworYW5vbnltb3VzX3VybCA9IGdyZW1saW5fc2VydmVyX3VybC5mb3JtYXQoNDU5NDApCitiYXNpY191cmwgPSBncmVtbGluX3NlcnZlcl91cmwuZm9ybWF0KDQ1OTQxKQora2VyYmVyb3NfdXJsID0gZ3JlbWxpbl9zZXJ2ZXJfdXJsLmZvcm1hdCg0NTk0MikKK2tlcmJlcml6ZWRfc2VydmljZSA9ICd0ZXN0LXNlcnZpY2VAe30nLmZvcm1hdChzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBjb25uZWN0aW9uKHJlcXVlc3QpOgorICAgIHByb3RvY29sID0gR3JlbWxpblNlcnZlcldTUHJvdG9jb2woCisgICAgICAgIEdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXIoKSwKKyAgICAgICAgdXNlcm5hbWU9J3N0ZXBoZW4nLCBwYXNzd29yZD0ncGFzc3dvcmQnKQorICAgIGV4ZWN1dG9yID0gY29uY3VycmVudC5mdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcig1KQorICAgIHBvb2wgPSBxdWV1ZS5RdWV1ZSgpCisgICAgdHJ5OgorICAgICAgICBjb25uID0gQ29ubmVjdGlvbihhbm9ueW1vdXNfdXJsLCAnZ21vZGVybicsIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IFRvcm5hZG9UcmFuc3BvcnQoKSwgZXhlY3V0b3IsIHBvb2wpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCkKKyAgICAgICAgcHl0ZXN0LnNraXAoJ0dyZW1saW4gU2VydmVyIGlzIG5vdCBydW5uaW5nJykKKyAgICBlbHNlOgorICAgICAgICBkZWYgZmluKCk6CisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpCisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgcmVxdWVzdC5hZGRmaW5hbGl6ZXIoZmluKQorICAgICAgICByZXR1cm4gY29ubgorCisKK0BweXRlc3QuZml4dHVyZQorZGVmIGNsaWVudChyZXF1ZXN0KToKKyAgICB0cnk6CisgICAgICAgIGNsaWVudCA9IENsaWVudChhbm9ueW1vdXNfdXJsLCAnZ21vZGVybicpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHB5dGVzdC5za2lwKCdHcmVtbGluIFNlcnZlciBpcyBub3QgcnVubmluZycpCisgICAgZWxzZToKKyAgICAgICAgZGVmIGZpbigpOgorICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKyAgICAgICAgcmVxdWVzdC5hZGRmaW5hbGl6ZXIoZmluKQorICAgICAgICByZXR1cm4gY2xpZW50CisKKworQHB5dGVzdC5maXh0dXJlKHBhcmFtcz1bJ2Jhc2ljJywgJ2tlcmJlcm9zJ10pCitkZWYgYXV0aGVudGljYXRlZF9jbGllbnQocmVxdWVzdCk6CisgICAgdHJ5OgorICAgICAgICBpZiByZXF1ZXN0LnBhcmFtID09ICdiYXNpYyc6CisgICAgICAgICAgICBjbGllbnQgPSBDbGllbnQoYmFzaWNfdXJsLCAnZ21vZGVybicsIHVzZXJuYW1lPSdzdGVwaGVuJywgcGFzc3dvcmQ9J3Bhc3N3b3JkJykKKyAgICAgICAgZWxpZiByZXF1ZXN0LnBhcmFtID09ICdrZXJiZXJvcyc6CisgICAgICAgICAgICBjbGllbnQgPSBDbGllbnQoa2VyYmVyb3NfdXJsLCAnZ21vZGVybicsIGtlcmJlcml6ZWRfc2VydmljZT1rZXJiZXJpemVkX3NlcnZpY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIG9wdGlvbiAtICIgKyByZXF1ZXN0LnBhcmFtKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBweXRlc3Quc2tpcCgnR3JlbWxpbiBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBmaW4oKToKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpCisgICAgICAgIHJlcXVlc3QuYWRkZmluYWxpemVyKGZpbikKKyAgICAgICAgcmV0dXJuIGNsaWVudAorCisKK0BweXRlc3QuZml4dHVyZShwYXJhbXM9WydncmFwaHNvbnYyJywgJ2dyYXBoc29udjMnLCAnZ3JhcGhiaW5hcnl2MSddKQorZGVmIHJlbW90ZV9jb25uZWN0aW9uKHJlcXVlc3QpOgorICAgIHRyeToKKyAgICAgICAgaWYgcmVxdWVzdC5wYXJhbSA9PSAnZ3JhcGhiaW5hcnl2MSc6CisgICAgICAgICAgICByZW1vdGVfY29ubiA9IERyaXZlclJlbW90ZUNvbm5lY3Rpb24oYW5vbnltb3VzX3VybCwgJ2dtb2Rlcm4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc2VyaWFsaXplcj1zZXJpYWxpemVyLkdyYXBoQmluYXJ5U2VyaWFsaXplcnNWMSgpKQorICAgICAgICBlbGlmIHJlcXVlc3QucGFyYW0gPT0gJ2dyYXBoc29udjInOgorICAgICAgICAgICAgcmVtb3RlX2Nvbm4gPSBEcml2ZXJSZW1vdGVDb25uZWN0aW9uKGFub255bW91c191cmwsICdnbW9kZXJuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9c2VyaWFsaXplci5HcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCgpKQorICAgICAgICBlbGlmIHJlcXVlc3QucGFyYW0gPT0gJ2dyYXBoc29udjMnOgorICAgICAgICAgICAgcmVtb3RlX2Nvbm4gPSBEcml2ZXJSZW1vdGVDb25uZWN0aW9uKGFub255bW91c191cmwsICdnbW9kZXJuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9c2VyaWFsaXplci5HcmFwaFNPTlNlcmlhbGl6ZXJzVjNkMCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBzZXJpYWxpemVyIG9wdGlvbiAtICIgKyByZXF1ZXN0LnBhcmFtKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBweXRlc3Quc2tpcCgnR3JlbWxpbiBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBmaW4oKToKKyAgICAgICAgICAgIHJlbW90ZV9jb25uLmNsb3NlKCkKKyAgICAgICAgcmVxdWVzdC5hZGRmaW5hbGl6ZXIoZmluKQorICAgICAgICByZXR1cm4gcmVtb3RlX2Nvbm4KKworCitAcHl0ZXN0LmZpeHR1cmUocGFyYW1zPVsnYmFzaWMnLCAna2VyYmVyb3MnXSkKK2RlZiByZW1vdGVfY29ubmVjdGlvbl9hdXRoZW50aWNhdGVkKHJlcXVlc3QpOgorICAgIHRyeToKKyAgICAgICAgaWYgcmVxdWVzdC5wYXJhbSA9PSAnYmFzaWMnOgorICAgICAgICAgICAgcmVtb3RlX2Nvbm4gPSBEcml2ZXJSZW1vdGVDb25uZWN0aW9uKGJhc2ljX3VybCwgJ2dtb2Rlcm4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPSdzdGVwaGVuJywgcGFzc3dvcmQ9J3Bhc3N3b3JkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9c2VyaWFsaXplci5HcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCgpKQorICAgICAgICBlbGlmIHJlcXVlc3QucGFyYW0gPT0gJ2tlcmJlcm9zJzoKKyAgICAgICAgICAgIHJlbW90ZV9jb25uID0gRHJpdmVyUmVtb3RlQ29ubmVjdGlvbihrZXJiZXJvc191cmwsICdnbW9kZXJuJywga2VyYmVyaXplZF9zZXJ2aWNlPWtlcmJlcml6ZWRfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9c2VyaWFsaXplci5HcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBhdXRoZW50aWNhdGlvbiBvcHRpb24gLSAiICsgcmVxdWVzdC5wYXJhbSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcHl0ZXN0LnNraXAoJ0dyZW1saW4gU2VydmVyIGlzIG5vdCBydW5uaW5nJykKKyAgICBlbHNlOgorICAgICAgICBkZWYgZmluKCk6CisgICAgICAgICAgICByZW1vdGVfY29ubi5jbG9zZSgpCisgICAgICAgIHJlcXVlc3QuYWRkZmluYWxpemVyKGZpbikKKyAgICAgICAgcmV0dXJuIHJlbW90ZV9jb25uCisKKworQHB5dGVzdC5maXh0dXJlCitkZWYgcmVtb3RlX2Nvbm5lY3Rpb25fZ3JhcGhzb25WMihyZXF1ZXN0KToKKyAgICB0cnk6CisgICAgICAgIHJlbW90ZV9jb25uID0gRHJpdmVyUmVtb3RlQ29ubmVjdGlvbihhbm9ueW1vdXNfdXJsLCAnZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NlcmlhbGl6ZXI9c2VyaWFsaXplci5HcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCgpKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBweXRlc3Quc2tpcCgnR3JlbWxpbiBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBmaW4oKToKKyAgICAgICAgICAgIHJlbW90ZV9jb25uLmNsb3NlKCkKKyAgICAgICAgcmVxdWVzdC5hZGRmaW5hbGl6ZXIoZmluKQorICAgICAgICByZXR1cm4gcmVtb3RlX2Nvbm4KKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBncmFwaHNvbl9zZXJpYWxpemVyX3YyKHJlcXVlc3QpOgorICAgIHJldHVybiBHcmFwaFNPTlNlcmlhbGl6ZXJzVjJkMCgpCisKKworQHB5dGVzdC5maXh0dXJlCitkZWYgZ3JhcGhzb25fc2VyaWFsaXplcl92MyhyZXF1ZXN0KToKKyAgICByZXR1cm4gR3JhcGhTT05TZXJpYWxpemVyc1YzZDAoKQorCisKK0BweXRlc3QuZml4dHVyZQorZGVmIGdyYXBoYmluYXJ5X3NlcmlhbGl6ZXJfdjEocmVxdWVzdCk6CisgICAgcmV0dXJuIEdyYXBoQmluYXJ5U2VyaWFsaXplcnNWMSgpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvZHJpdmVyL19faW5pdF9fLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL2RyaXZlci9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL2RyaXZlci9fX2luaXRfXy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL2RyaXZlci9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL2RyaXZlci90ZXN0X2NsaWVudC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9kcml2ZXIvdGVzdF9jbGllbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyZThjMgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9kcml2ZXIvdGVzdF9jbGllbnQucHkKQEAgLTAsMCArMSwzMjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdXVpZAorCitmcm9tIGdyZW1saW5fcHl0aG9uLmRyaXZlci5jbGllbnQgaW1wb3J0IENsaWVudAorZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIucHJvdG9jb2wgaW1wb3J0IEdyZW1saW5TZXJ2ZXJFcnJvcgorZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIucmVxdWVzdCBpbXBvcnQgUmVxdWVzdE1lc3NhZ2UKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5ncmFwaF90cmF2ZXJzYWwgaW1wb3J0IF9fCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3Muc3RyYXRlZ2llcyBpbXBvcnQgT3B0aW9uc1N0cmF0ZWd5Citmcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgR3JhcGgKKworX19hdXRob3JfXyA9ICdEYXZpZCBNLiBCcm93biAoZGF2ZWJzaG93QGdtYWlsLmNvbSknCisKKworZGVmIHRlc3RfY29ubmVjdGlvbihjb25uZWN0aW9uKToKKyAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQorICAgIHQgPSBnLlYoKQorICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKKyAgICByZXN1bHRzX3NldCA9IGNvbm5lY3Rpb24ud3JpdGUobWVzc2FnZSkucmVzdWx0KCkKKyAgICBmdXR1cmUgPSByZXN1bHRzX3NldC5hbGwoKQorICAgIHJlc3VsdHMgPSBmdXR1cmUucmVzdWx0KCkKKyAgICBhc3NlcnQgbGVuKHJlc3VsdHMpID09IDYKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShyZXN1bHRzLCBsaXN0KQorICAgIGFzc2VydCByZXN1bHRzX3NldC5kb25lLmRvbmUoKQorICAgIGFzc2VydCAnaG9zdCcgaW4gcmVzdWx0c19zZXQuc3RhdHVzX2F0dHJpYnV0ZXMKKworCitkZWYgdGVzdF9jbGllbnRfc2ltcGxlX2V2YWwoY2xpZW50KToKKyAgICBhc3NlcnQgY2xpZW50LnN1Ym1pdCgnMSArIDEnKS5hbGwoKS5yZXN1bHQoKVswXSA9PSAyCisKKworZGVmIHRlc3RfY2xpZW50X3NpbXBsZV9ldmFsX2JpbmRpbmdzKGNsaWVudCk6CisgICAgYXNzZXJ0IGNsaWVudC5zdWJtaXQoJ3ggKyB4Jywgeyd4JzogMn0pLmFsbCgpLnJlc3VsdCgpWzBdID09IDQKKworCitkZWYgdGVzdF9jbGllbnRfZXZhbF90cmF2ZXJzYWwoY2xpZW50KToKKyAgICBhc3NlcnQgbGVuKGNsaWVudC5zdWJtaXQoJ2cuVigpJykuYWxsKCkucmVzdWx0KCkpID09IDYKKworCitkZWYgdGVzdF9jbGllbnRfZXJyb3IoY2xpZW50KToKKyAgICB0cnk6CisgICAgICAgICMgc2hvdWxkIGZpcmUgYW4gZXhjZXB0aW9uCisgICAgICAgIGNsaWVudC5zdWJtaXQoJzEvMCcpLmFsbCgpLnJlc3VsdCgpCisgICAgICAgIGFzc2VydCBGYWxzZQorICAgIGV4Y2VwdCBHcmVtbGluU2VydmVyRXJyb3IgYXMgZXg6CisgICAgICAgIGFzc2VydCAnZXhjZXB0aW9ucycgaW4gZXguc3RhdHVzX2F0dHJpYnV0ZXMKKyAgICAgICAgYXNzZXJ0ICdzdGFja1RyYWNlJyBpbiBleC5zdGF0dXNfYXR0cmlidXRlcworCisKK2RlZiB0ZXN0X2NsaWVudF9jb25uZWN0aW9uX3Bvb2xfYWZ0ZXJfZXJyb3IoY2xpZW50KToKKyAgICAjIE92ZXJ3cml0ZSBmaXh0dXJlIHdpdGggcG9vbF9zaXplPTEgY2xpZW50CisgICAgY2xpZW50ID0gQ2xpZW50KCd3czovL2xvY2FsaG9zdDo0NTk0MC9ncmVtbGluJywgJ2dtb2Rlcm4nLCBwb29sX3NpemU9MSkKKworICAgIHRyeToKKyAgICAgICAgIyBzaG91bGQgZmlyZSBhbiBleGNlcHRpb24KKyAgICAgICAgY2xpZW50LnN1Ym1pdCgnMS8wJykuYWxsKCkucmVzdWx0KCkKKyAgICAgICAgYXNzZXJ0IEZhbHNlCisgICAgZXhjZXB0IEdyZW1saW5TZXJ2ZXJFcnJvciBhcyBnc2U6CisgICAgICAgICMgZXhwZWN0aW5nIHRoZSBwb29sIHNpemUgdG8gYmUgMSBhZ2FpbiBhZnRlciBxdWVyeSByZXR1cm5lZAorICAgICAgICBhc3NlcnQgZ3NlLnN0YXR1c19jb2RlID09IDU5NworICAgICAgICBhc3NlcnQgY2xpZW50LmF2YWlsYWJsZV9wb29sX3NpemUgPT0gMQorCisKK2RlZiB0ZXN0X2NsaWVudF9ieXRlY29kZShjbGllbnQpOgorICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCisgICAgdCA9IGcuVigpCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQorICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2CisKKworZGVmIHRlc3RfY2xpZW50X2J5dGVjb2RlX29wdGlvbnMoY2xpZW50KToKKyAgICAjIHNtb2tlIHRlc3QgdG8gdmFsaWRhdGUgc2VyaWFsaXphdGlvbiBvZiBPcHRpb25zU3RyYXRlZ3kuIG5vIHdheSB0byByZWFsbHkgdmFsaWRhdGUgdGhpcyBmcm9tIGFuIGludGVncmF0aW9uCisgICAgIyB0ZXN0IHBlcnNwZWN0aXZlIGJlY2F1c2UgdGhlcmUncyBubyB3YXkgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHN0cmF0ZWd5IHZpYSBieXRlY29kZQorICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCisgICAgdCA9IGcud2l0aFN0cmF0ZWdpZXMoT3B0aW9uc1N0cmF0ZWd5KG9wdGlvbnM9eyJ4IjogInRlc3QiLCAieSI6IFRydWV9KSkuVigpCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQorICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2CisgICAgIyMKKyAgICB0ID0gZy53aXRoXygieCIsICJ0ZXN0Iikud2l0aF8oInkiLCBUcnVlKS5WKCkKKyAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCisgICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKKyAgICBhc3NlcnQgbGVuKHJlc3VsdF9zZXQuYWxsKCkucmVzdWx0KCkpID09IDYKKworCitkZWYgdGVzdF9pdGVyYXRlX3Jlc3VsdF9zZXQoY2xpZW50KToKKyAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQorICAgIHQgPSBnLlYoKQorICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKKyAgICByZXN1bHRfc2V0ID0gY2xpZW50LnN1Ym1pdChtZXNzYWdlKQorICAgIHJlc3VsdHMgPSBbXQorICAgIGZvciByZXN1bHQgaW4gcmVzdWx0X3NldDoKKyAgICAgICAgcmVzdWx0cyArPSByZXN1bHQKKyAgICBhc3NlcnQgbGVuKHJlc3VsdHMpID09IDYKKworCitkZWYgdGVzdF9jbGllbnRfYXN5bmMoY2xpZW50KToKKyAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQorICAgIHQgPSBnLlYoKQorICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKKyAgICBmdXR1cmUgPSBjbGllbnQuc3VibWl0QXN5bmMobWVzc2FnZSkKKyAgICByZXN1bHRfc2V0ID0gZnV0dXJlLnJlc3VsdCgpCisgICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2CisKKworZGVmIHRlc3RfY29ubmVjdGlvbl9zaGFyZShjbGllbnQpOgorICAgICMgT3ZlcndyaXRlIGZpeHR1cmUgd2l0aCBwb29sX3NpemU9MSBjbGllbnQKKyAgICBjbGllbnQgPSBDbGllbnQoJ3dzOi8vbG9jYWxob3N0OjQ1OTQwL2dyZW1saW4nLCAnZ21vZGVybicsIHBvb2xfc2l6ZT0xKQorICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCisgICAgdCA9IGcuVigpCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQorICAgIG1lc3NhZ2UyID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCisgICAgZnV0dXJlID0gY2xpZW50LnN1Ym1pdEFzeW5jKG1lc3NhZ2UpCisgICAgZnV0dXJlMiA9IGNsaWVudC5zdWJtaXRBc3luYyhtZXNzYWdlMikKKworICAgIHJlc3VsdF9zZXQyID0gZnV0dXJlMi5yZXN1bHQoKQorICAgIGFzc2VydCBsZW4ocmVzdWx0X3NldDIuYWxsKCkucmVzdWx0KCkpID09IDYKKworICAgICMgVGhpcyBmdXR1cmUgaGFzIHRvIGZpbmlzaCBmb3IgdGhlIHNlY29uZCB0byB5aWVsZCByZXN1bHQgLSBwb29sX3NpemU9MQorICAgIGFzc2VydCBmdXR1cmUuZG9uZSgpCisgICAgcmVzdWx0X3NldCA9IGZ1dHVyZS5yZXN1bHQoKQorICAgIGFzc2VydCBsZW4ocmVzdWx0X3NldC5hbGwoKS5yZXN1bHQoKSkgPT0gNgorCisKK2RlZiB0ZXN0X211bHRpX2Nvbm5fcG9vbChjbGllbnQpOgorICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCisgICAgdCA9IGcuVigpCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnbW9kZXJuJ319KQorICAgIG1lc3NhZ2UyID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCisgICAgY2xpZW50ID0gQ2xpZW50KCd3czovL2xvY2FsaG9zdDo0NTk0MC9ncmVtbGluJywgJ2cnLCBwb29sX3NpemU9MSkKKyAgICBmdXR1cmUgPSBjbGllbnQuc3VibWl0QXN5bmMobWVzc2FnZSkKKyAgICBmdXR1cmUyID0gY2xpZW50LnN1Ym1pdEFzeW5jKG1lc3NhZ2UyKQorCisgICAgcmVzdWx0X3NldDIgPSBmdXR1cmUyLnJlc3VsdCgpCisgICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0Mi5hbGwoKS5yZXN1bHQoKSkgPT0gNgorCisgICAgIyB3aXRoIGNvbm5lY3Rpb24gcG9vbCBgZnV0dXJlYCBtYXkgb3IgbWF5IG5vdCBiZSBkb25lIGhlcmUKKyAgICByZXN1bHRfc2V0ID0gZnV0dXJlLnJlc3VsdCgpCisgICAgYXNzZXJ0IGxlbihyZXN1bHRfc2V0LmFsbCgpLnJlc3VsdCgpKSA9PSA2CisKKworZGVmIHRlc3RfbXVsdGlfdGhyZWFkX3Bvb2woY2xpZW50KToKKyAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQorICAgIHRyYXZlcnNhbHMgPSBbZy5WKCksCisgICAgICAgICAgICAgICAgICBnLlYoKS5jb3VudCgpLAorICAgICAgICAgICAgICAgICAgZy5FKCksCisgICAgICAgICAgICAgICAgICBnLkUoKS5jb3VudCgpCisgICAgICAgICAgICAgICAgICBdCisgICAgcmVzdWx0cyA9IFtbXSBmb3IgXyBpbiB0cmF2ZXJzYWxzXQorCisgICAgIyBVc2UgYSBjb25kaXRpb24gdmFyaWFibGUgdG8gc3luY2hyb25pc2UgYSBncm91cCBvZiB0aHJlYWRzLCB3aGljaCBzaG91bGQgYWxzbyBpbmplY3Qgc29tZQorICAgICMgbm9uLWRldGVybWluaXNtIGludG8gdGhlIHJ1bi10aW1lIGV4ZWN1dGlvbiBvcmRlcgorICAgIGNvbmRpdGlvbiA9IHRocmVhZGluZy5Db25kaXRpb24oKQorCisgICAgZGVmIHRocmVhZF9ydW4odHIsIHJlc3VsdF9saXN0KToKKyAgICAgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0ci5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZ21vZGVybid9fSkKKyAgICAgICAgd2l0aCBjb25kaXRpb246CisgICAgICAgICAgICBjb25kaXRpb24ud2FpdCg1KQorICAgICAgICByZXN1bHRfc2V0ID0gY2xpZW50LnN1Ym1pdChtZXNzYWdlKQorICAgICAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6CisgICAgICAgICAgICByZXN1bHRfbGlzdC5hcHBlbmQocmVzdWx0KQorCisgICAgdGhyZWFkcyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHJlc3VsdHMpKToKKyAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9dGhyZWFkX3J1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSh0cmF2ZXJzYWxzW2ldLCByZXN1bHRzW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0ZXN0X211bHRpX3RocmVhZF9wb29sXyVkIiAlIGkpCisgICAgICAgIHRocmVhZC5kYWVtb24gPSBUcnVlCisgICAgICAgIHRocmVhZHMuYXBwZW5kKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCkKKyAgICB3aXRoIGNvbmRpdGlvbjoKKyAgICAgICAgY29uZGl0aW9uLm5vdGlmeV9hbGwoKQorCisgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgdC5qb2luKDUpCisKKyAgICBhc3NlcnQgbGVuKHJlc3VsdHNbMF1bMF0pID09IDYKKyAgICBhc3NlcnQgcmVzdWx0c1sxXVswXVswXS5vYmplY3QgPT0gNgorICAgIGFzc2VydCBsZW4ocmVzdWx0c1syXVswXSkgPT0gNgorICAgIGFzc2VydCByZXN1bHRzWzNdWzBdWzBdLm9iamVjdCA9PSA2CisKKworZGVmIHRlc3RfY2xpZW50X2J5dGVjb2RlX3dpdGhfaW50KGNsaWVudCk6CisgICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkKKyAgICB0ID0gZy5WKCkuaGFzKCdhZ2UnLCA4NTE0MDE5NzI1ODUxMjIpLmNvdW50KCkKKyAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2dtb2Rlcm4nfX0pCisgICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKKyAgICByZXN1bHRzID0gW10KKyAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6CisgICAgICAgIHJlc3VsdHMgKz0gcmVzdWx0CisgICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxCisKKworZGVmIHRlc3RfbXVsdGlfcmVxdWVzdF9pbl9zZXNzaW9uKGNsaWVudCk6CisgICAgIyBPdmVyd3JpdGUgZml4dHVyZSB3aXRoIHNlc3Npb24gY2xpZW50CisgICAgc2Vzc2lvbl9pZCA9IHN0cih1dWlkLnV1aWQ0KCkpCisgICAgY2xpZW50ID0gQ2xpZW50KCd3czovL2xvY2FsaG9zdDo0NTk0MC9ncmVtbGluJywgJ2cnLCBzZXNzaW9uPXNlc3Npb25faWQpCisKKyAgICBhc3NlcnQgY2xpZW50LnN1Ym1pdCgneCA9IDEnKS5hbGwoKS5yZXN1bHQoKVswXSA9PSAxCisgICAgYXNzZXJ0IGNsaWVudC5zdWJtaXQoJ3ggKyAyJykuYWxsKCkucmVzdWx0KClbMF0gPT0gMworCisgICAgY2xpZW50LmNsb3NlKCkKKworICAgICMgYXR0ZW1wdCByZWNvbm5lY3QgdG8gc2Vzc2lvbiBhbmQgbWFrZSBzdXJlICJ4IiBpcyBubyBsb25nZXIgYSB0aGluZworICAgIGNsaWVudCA9IENsaWVudCgnd3M6Ly9sb2NhbGhvc3Q6NDU5NDAvZ3JlbWxpbicsICdnJywgc2Vzc2lvbj1zZXNzaW9uX2lkKQorICAgIHRyeToKKyAgICAgICAgIyBzaG91bGQgZmlyZSBhbiBleGNlcHRpb24KKyAgICAgICAgY2xpZW50LnN1Ym1pdCgneCcpLmFsbCgpLnJlc3VsdCgpCisgICAgICAgIGFzc2VydCBGYWxzZQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGFzc2VydCBUcnVlCisKKworZGVmIHRlc3RfY2xpZW50X3Bvb2xfaW5fc2Vzc2lvbihjbGllbnQpOgorICAgICMgT3ZlcndyaXRlIGZpeHR1cmUgd2l0aCBwb29sX3NpemU9MiBjbGllbnQKKyAgICB0cnk6CisgICAgICAgICMgc2hvdWxkIGZpcmUgYW4gZXhjZXB0aW9uCisgICAgICAgIGNsaWVudCA9IENsaWVudCgnd3M6Ly9sb2NhbGhvc3Q6NDU5NDAvZ3JlbWxpbicsICdnJywgc2Vzc2lvbj1zdHIodXVpZC51dWlkNCgpKSwgcG9vbF9zaXplPTIpCisgICAgICAgIGFzc2VydCBGYWxzZQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGFzc2VydCBUcnVlCisKKworZGVmIHRlc3RfYmlnX3Jlc3VsdF9zZXQoY2xpZW50KToKKyAgICBnID0gR3JhcGgoKS50cmF2ZXJzYWwoKQorICAgIHQgPSBnLmluamVjdCgxKS5yZXBlYXQoX18uYWRkVigncGVyc29uJykucHJvcGVydHkoJ25hbWUnLCBfXy5sb29wcygpKSkudGltZXMoMjAwMDApLmNvdW50KCkKKyAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2cnfX0pCisgICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKKyAgICByZXN1bHRzID0gW10KKyAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6CisgICAgICAgIHJlc3VsdHMgKz0gcmVzdWx0CisgICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxCisKKyAgICB0ID0gZy5WKCkubGltaXQoMTApCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQorICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgorICAgICAgICByZXN1bHRzICs9IHJlc3VsdAorICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAKKworICAgIHQgPSBnLlYoKS5saW1pdCgxMDApCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQorICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgorICAgICAgICByZXN1bHRzICs9IHJlc3VsdAorICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAwCisKKyAgICB0ID0gZy5WKCkubGltaXQoMTAwMCkKKyAgICBtZXNzYWdlID0gUmVxdWVzdE1lc3NhZ2UoJ3RyYXZlcnNhbCcsICdieXRlY29kZScsIHsnZ3JlbWxpbic6IHQuYnl0ZWNvZGUsICdhbGlhc2VzJzogeydnJzogJ2cnfX0pCisgICAgcmVzdWx0X3NldCA9IGNsaWVudC5zdWJtaXQobWVzc2FnZSkKKyAgICByZXN1bHRzID0gW10KKyAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6CisgICAgICAgIHJlc3VsdHMgKz0gcmVzdWx0CisgICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxMDAwCisKKyAgICB0ID0gZy5WKCkubGltaXQoMTAwMDApCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQorICAgIHJlc3VsdF9zZXQgPSBjbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgorICAgICAgICByZXN1bHRzICs9IHJlc3VsdAorICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAwMDAKKworCitkZWYgdGVzdF9iaWdfcmVzdWx0X3NldF9zZWN1cmUoYXV0aGVudGljYXRlZF9jbGllbnQpOgorICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpCisgICAgdCA9IGcuaW5qZWN0KDEpLnJlcGVhdChfXy5hZGRWKCdwZXJzb24nKS5wcm9wZXJ0eSgnbmFtZScsIF9fLmxvb3BzKCkpKS50aW1lcygyMDAwMCkuY291bnQoKQorICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZyd9fSkKKyAgICByZXN1bHRfc2V0ID0gYXV0aGVudGljYXRlZF9jbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgorICAgICAgICByZXN1bHRzICs9IHJlc3VsdAorICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMQorCisgICAgdCA9IGcuVigpLmxpbWl0KDEwKQorICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZyd9fSkKKyAgICByZXN1bHRfc2V0ID0gYXV0aGVudGljYXRlZF9jbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgorICAgICAgICByZXN1bHRzICs9IHJlc3VsdAorICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAKKworICAgIHQgPSBnLlYoKS5saW1pdCgxMDApCisgICAgbWVzc2FnZSA9IFJlcXVlc3RNZXNzYWdlKCd0cmF2ZXJzYWwnLCAnYnl0ZWNvZGUnLCB7J2dyZW1saW4nOiB0LmJ5dGVjb2RlLCAnYWxpYXNlcyc6IHsnZyc6ICdnJ319KQorICAgIHJlc3VsdF9zZXQgPSBhdXRoZW50aWNhdGVkX2NsaWVudC5zdWJtaXQobWVzc2FnZSkKKyAgICByZXN1bHRzID0gW10KKyAgICBmb3IgcmVzdWx0IGluIHJlc3VsdF9zZXQ6CisgICAgICAgIHJlc3VsdHMgKz0gcmVzdWx0CisgICAgYXNzZXJ0IGxlbihyZXN1bHRzKSA9PSAxMDAKKworICAgIHQgPSBnLlYoKS5saW1pdCgxMDAwKQorICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZyd9fSkKKyAgICByZXN1bHRfc2V0ID0gYXV0aGVudGljYXRlZF9jbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgorICAgICAgICByZXN1bHRzICs9IHJlc3VsdAorICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAwMAorCisgICAgdCA9IGcuVigpLmxpbWl0KDEwMDAwKQorICAgIG1lc3NhZ2UgPSBSZXF1ZXN0TWVzc2FnZSgndHJhdmVyc2FsJywgJ2J5dGVjb2RlJywgeydncmVtbGluJzogdC5ieXRlY29kZSwgJ2FsaWFzZXMnOiB7J2cnOiAnZyd9fSkKKyAgICByZXN1bHRfc2V0ID0gYXV0aGVudGljYXRlZF9jbGllbnQuc3VibWl0KG1lc3NhZ2UpCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRfc2V0OgorICAgICAgICByZXN1bHRzICs9IHJlc3VsdAorICAgIGFzc2VydCBsZW4ocmVzdWx0cykgPT0gMTAwMDAKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9kcml2ZXIvdGVzdF9kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb24ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfZHJpdmVyX3JlbW90ZV9jb25uZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOWRiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfZHJpdmVyX3JlbW90ZV9jb25uZWN0aW9uLnB5CkBAIC0wLDAgKzEsMjE5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gZ3JlbWxpbl9weXRob24gaW1wb3J0IHN0YXRpY3MKK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLnByb3RvY29sIGltcG9ydCBHcmVtbGluU2VydmVyRXJyb3IKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RhdGljcyBpbXBvcnQgbG9uZworZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgVHJhdmVyc2VyCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBUcmF2ZXJzYWxTdHJhdGVneQorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgQmluZGluZ3MKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IFAsIE9yZGVyLCBUCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBfXworZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmFub255bW91c190cmF2ZXJzYWwgaW1wb3J0IHRyYXZlcnNhbAorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFZlcnRleAorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnN0cmF0ZWdpZXMgaW1wb3J0IFN1YmdyYXBoU3RyYXRlZ3ksIFJlc2VydmVkS2V5c1ZlcmlmaWNhdGlvblN0cmF0ZWd5LCBTZWVkU3RyYXRlZ3kKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLnV0aWwgaW1wb3J0IEhhc2hhYmxlRGljdAorZnJvbSBncmVtbGluX3B5dGhvbi5kcml2ZXIuc2VyaWFsaXplciBpbXBvcnQgR3JhcGhTT05TZXJpYWxpemVyc1YyZDAKKworX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJworCisKK2NsYXNzIFRlc3REcml2ZXJSZW1vdGVDb25uZWN0aW9uKG9iamVjdCk6CisgICAgZGVmIHRlc3RfdHJhdmVyc2FscyhzZWxmLCByZW1vdGVfY29ubmVjdGlvbik6CisgICAgICAgIHN0YXRpY3MubG9hZF9zdGF0aWNzKGdsb2JhbHMoKSkKKyAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCisKKyAgICAgICAgYXNzZXJ0IGxvbmcoNikgPT0gZy5WKCkuY291bnQoKS50b0xpc3QoKVswXQorICAgICAgICAjICMKKyAgICAgICAgYXNzZXJ0IFZlcnRleCgxKSA9PSBnLlYoMSkubmV4dCgpCisgICAgICAgIGFzc2VydCAxID09IGcuVigxKS5pZCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgVHJhdmVyc2VyKFZlcnRleCgxKSkgPT0gZy5WKDEpLm5leHRUcmF2ZXJzZXIoKQorICAgICAgICBhc3NlcnQgMSA9PSBsZW4oZy5WKDEpLnRvTGlzdCgpKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShnLlYoMSkudG9MaXN0KCksIGxpc3QpCisgICAgICAgIHJlc3VsdHMgPSBnLlYoKS5yZXBlYXQob3V0KCkpLnRpbWVzKDIpLm5hbWUKKyAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IDIgPT0gbGVuKHJlc3VsdHMpCisgICAgICAgIGFzc2VydCAibG9wIiBpbiByZXN1bHRzCisgICAgICAgIGFzc2VydCAicmlwcGxlIiBpbiByZXN1bHRzCisgICAgICAgICMgIworICAgICAgICBhc3NlcnQgMTAgPT0gZy5WKCkucmVwZWF0KGJvdGgoKSkudGltZXMoNSlbMDoxMF0uY291bnQoKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IDEgPT0gZy5WKCkucmVwZWF0KGJvdGgoKSkudGltZXMoNSlbMDoxXS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgMCA9PSBnLlYoKS5yZXBlYXQoYm90aCgpKS50aW1lcyg1KVswOjBdLmNvdW50KCkubmV4dCgpCisgICAgICAgIGFzc2VydCA0ID09IGcuVigpWzI6XS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgMiA9PSBnLlYoKVs6Ml0uY291bnQoKS5uZXh0KCkKKyAgICAgICAgIyAjCisgICAgICAgIHJlc3VsdHMgPSBnLndpdGhTaWRlRWZmZWN0KCdhJywgWydqb3NoJywgJ3BldGVyJ10pLlYoMSkub3V0KCdjcmVhdGVkJykuaW5fKCdjcmVhdGVkJykudmFsdWVzKCduYW1lJykud2hlcmUoUC53aXRoaW4oJ2EnKSkudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IDIgPT0gbGVuKHJlc3VsdHMpCisgICAgICAgIGFzc2VydCAnam9zaCcgaW4gcmVzdWx0cworICAgICAgICBhc3NlcnQgJ3BldGVyJyBpbiByZXN1bHRzCisgICAgICAgICMgIworICAgICAgICByZXN1bHRzID0gZy5WKCkub3V0KCkucHJvZmlsZSgpLnRvTGlzdCgpCisgICAgICAgIGFzc2VydCAxID09IGxlbihyZXN1bHRzKQorICAgICAgICBhc3NlcnQgJ21ldHJpY3MnIGluIHJlc3VsdHNbMF0KKyAgICAgICAgYXNzZXJ0ICdkdXInIGluIHJlc3VsdHNbMF0KKyAgICAgICAgIyAjCisgICAgICAgIHJlc3VsdHMgPSBnLlYoKS5oYXMoJ25hbWUnLCAncGV0ZXInKS5hc18oJ2EnKS5vdXQoJ2NyZWF0ZWQnKS5hc18oJ2InKS5zZWxlY3QoJ2EnLCAnYicpLmJ5KAorICAgICAgICAgICAgX18udmFsdWVNYXAoKSkudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IDEgPT0gbGVuKHJlc3VsdHMpCisgICAgICAgIGFzc2VydCAncGV0ZXInID09IHJlc3VsdHNbMF1bJ2EnXVsnbmFtZSddWzBdCisgICAgICAgIGFzc2VydCAzNSA9PSByZXN1bHRzWzBdWydhJ11bJ2FnZSddWzBdCisgICAgICAgIGFzc2VydCAnbG9wJyA9PSByZXN1bHRzWzBdWydiJ11bJ25hbWUnXVswXQorICAgICAgICBhc3NlcnQgJ2phdmEnID09IHJlc3VsdHNbMF1bJ2InXVsnbGFuZyddWzBdCisgICAgICAgIGFzc2VydCAyID09IGxlbihyZXN1bHRzWzBdWydhJ10pCisgICAgICAgIGFzc2VydCAyID09IGxlbihyZXN1bHRzWzBdWydiJ10pCisgICAgICAgICMgIworICAgICAgICByZXN1bHRzID0gZy5WKDEpLmluamVjdChnLlYoMikubmV4dCgpKS52YWx1ZXMoJ25hbWUnKS50b0xpc3QoKQorICAgICAgICBhc3NlcnQgMiA9PSBsZW4ocmVzdWx0cykKKyAgICAgICAgYXNzZXJ0ICdtYXJrbycgaW4gcmVzdWx0cworICAgICAgICBhc3NlcnQgJ3ZhZGFzJyBpbiByZXN1bHRzCisgICAgICAgICMgIworICAgICAgICByZXN1bHRzID0gZy5WKCkuaGFzKCdwZXJzb24nLCAnbmFtZScsICdtYXJrbycpLm1hcChsYW1iZGE6ICgiaXQuZ2V0KCkudmFsdWUoJ25hbWUnKSIsICJncmVtbGluLWdyb292eSIpKS50b0xpc3QoKQorICAgICAgICBhc3NlcnQgMSA9PSBsZW4ocmVzdWx0cykKKyAgICAgICAgYXNzZXJ0ICdtYXJrbycgaW4gcmVzdWx0cworICAgICAgICAjICMKKyAgICAgICAgIyB0aGlzIHRlc3QganVzdCB2YWxpZGF0ZXMgdGhhdCB0aGUgdW5kZXJzY29yZWQgdmVyc2lvbnMgb2Ygc3RlcHMgY29uZmxpY3Rpbmcgd2l0aCBHcmVtbGluIHdvcmsKKyAgICAgICAgIyBwcm9wZXJseSBhbmQgY2FuIGJlIHJlbW92ZWQgd2hlbiB0aGUgb2xkIHN0ZXBzIGFyZSByZW1vdmVkIC0gVElOS0VSUE9QLTIyNzIKKyAgICAgICAgcmVzdWx0cyA9IGcuVigpLmZpbHRlcl8oX18udmFsdWVzKCdhZ2UnKS5zdW1fKCkuYW5kXygKKyAgICAgICAgICAgIF9fLm1heF8oKS5pc18oZ3QoMCkpLCBfXy5taW5fKCkuaXNfKGd0KDApKSkpLnJhbmdlXygwLCAxKS5pZF8oKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IDEgPT0gcmVzdWx0cworICAgICAgICAjICMKKyAgICAgICAgIyB0ZXN0IGJpbmRpbmcgaW4gUAorICAgICAgICByZXN1bHRzID0gZy5WKCkuaGFzKCdwZXJzb24nLCAnYWdlJywgQmluZGluZ3Mub2YoJ3gnLCBsdCgzMCkpKS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgMiA9PSByZXN1bHRzCisgICAgICAgICMgIworICAgICAgICAjIHRlc3QgZGljdCBrZXlzIHdoaWNoIGNhbiBvbmx5IHdvcmsgb24gR3JhcGhCaW5hcnkgYW5kIEdyYXBoU09OMyB3aGljaCBpbmNsdWRlIHNwZWNpZmljIHNlcmlhbGl6YXRpb24KKyAgICAgICAgIyB0eXBlcyBmb3IgZGljdAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZW1vdGVfY29ubmVjdGlvbi5fY2xpZW50Ll9tZXNzYWdlX3NlcmlhbGl6ZXIsIEdyYXBoU09OU2VyaWFsaXplcnNWMmQwKToKKyAgICAgICAgICAgIHJlc3VsdHMgPSBnLlYoKS5oYXMoJ3BlcnNvbicsICduYW1lJywgJ21hcmtvJykuZWxlbWVudE1hcCgibmFtZSIpLmdyb3VwQ291bnQoKS5uZXh0KCkKKyAgICAgICAgICAgIGFzc2VydCB7SGFzaGFibGVEaWN0Lm9mKHtULmlkOiAxLCBULmxhYmVsOiAncGVyc29uJywgJ25hbWUnOiAnbWFya28nfSk6IDF9ID09IHJlc3VsdHMKKworICAgIGRlZiB0ZXN0X2xhbWJkYV90cmF2ZXJzYWxzKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uKToKKyAgICAgICAgc3RhdGljcy5sb2FkX3N0YXRpY3MoZ2xvYmFscygpKQorICAgICAgICBhc3NlcnQgInJlbW90ZWNvbm5lY3Rpb25bd3M6Ly9sb2NhbGhvc3Q6NDU5NDAvZ3JlbWxpbixnbW9kZXJuXSIgPT0gc3RyKHJlbW90ZV9jb25uZWN0aW9uKQorICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikKKworICAgICAgICBhc3NlcnQgMjQuMCA9PSBnLndpdGhTYWNrKDEuMCwgbGFtYmRhOiAoInggLT4geCArIDEiLCAiZ3JlbWxpbi1ncm9vdnkiKSkuVigpLmJvdGgoKS5zYWNrKCkuc3VtKCkubmV4dCgpCisgICAgICAgIGFzc2VydCAyNC4wID09IGcud2l0aFNhY2sobGFtYmRhOiAoInsxLjBkfSIsICJncmVtbGluLWdyb292eSIpLCBsYW1iZGE6ICgieCAtPiB4ICsgMSIsICJncmVtbGluLWdyb292eSIpKS5WKCkuYm90aCgpLnNhY2soKS5zdW0oKS5uZXh0KCkKKworICAgICAgICBhc3NlcnQgNDguMCA9PSBnLndpdGhTYWNrKDEuMCwgbGFtYmRhOiAoIngsIHkgLT4gIHggKyB5ICsgMSIsICJncmVtbGluLWdyb292eSIpKS5WKCkuYm90aCgpLnNhY2soKS5zdW0oKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IDQ4LjAgPT0gZy53aXRoU2FjayhsYW1iZGE6ICgiezEuMGR9IiwgImdyZW1saW4tZ3Jvb3Z5IiksIGxhbWJkYTogKCJ4LCB5IC0+ICB4ICsgeSArIDEiLCAiZ3JlbWxpbi1ncm9vdnkiKSkuVigpLmJvdGgoKS5zYWNrKCkuc3VtKCkubmV4dCgpCisKKyAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZiwgcmVtb3RlX2Nvbm5lY3Rpb24pOgorICAgICAgICBzdGF0aWNzLmxvYWRfc3RhdGljcyhnbG9iYWxzKCkpCisgICAgICAgIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHJlbW90ZV9jb25uZWN0aW9uKQorCisgICAgICAgIHQgPSBnLlYoKS5jb3VudCgpCisgICAgICAgIGFzc2VydCB0Lmhhc05leHQoKQorICAgICAgICBhc3NlcnQgdC5oYXNOZXh0KCkKKyAgICAgICAgYXNzZXJ0IHQuaGFzTmV4dCgpCisgICAgICAgIGFzc2VydCB0Lmhhc05leHQoKQorICAgICAgICBhc3NlcnQgdC5oYXNOZXh0KCkKKyAgICAgICAgYXNzZXJ0IDYgPT0gdC5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IG5vdCh0Lmhhc05leHQoKSkKKyAgICAgICAgYXNzZXJ0IG5vdCh0Lmhhc05leHQoKSkKKyAgICAgICAgYXNzZXJ0IG5vdCh0Lmhhc05leHQoKSkKKyAgICAgICAgYXNzZXJ0IG5vdCh0Lmhhc05leHQoKSkKKyAgICAgICAgYXNzZXJ0IG5vdCh0Lmhhc05leHQoKSkKKworICAgICAgICB0ID0gZy5WKCkuaGFzKCduYW1lJywgUC53aXRoaW4oJ21hcmtvJywgJ3BldGVyJykpLnZhbHVlcygnbmFtZScpLm9yZGVyKCkKKyAgICAgICAgYXNzZXJ0ICJtYXJrbyIgPT0gdC5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IHQuaGFzTmV4dCgpCisgICAgICAgIGFzc2VydCB0Lmhhc05leHQoKQorICAgICAgICBhc3NlcnQgdC5oYXNOZXh0KCkKKyAgICAgICAgYXNzZXJ0IHQuaGFzTmV4dCgpCisgICAgICAgIGFzc2VydCB0Lmhhc05leHQoKQorICAgICAgICBhc3NlcnQgInBldGVyIiA9PSB0Lm5leHQoKQorICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQorICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQorICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQorICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQorICAgICAgICBhc3NlcnQgbm90KHQuaGFzTmV4dCgpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQubmV4dCgpCisgICAgICAgICAgICBhc3NlcnQgRmFsc2UKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBhc3NlcnQgVHJ1ZQorCisgICAgZGVmIHRlc3Rfc3RyYXRlZ2llcyhzZWxmLCByZW1vdGVfY29ubmVjdGlvbik6CisgICAgICAgIHN0YXRpY3MubG9hZF9zdGF0aWNzKGdsb2JhbHMoKSkKKyAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pLiBcCisgICAgICAgICAgICB3aXRoU3RyYXRlZ2llcyhUcmF2ZXJzYWxTdHJhdGVneSgiU3ViZ3JhcGhTdHJhdGVneSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZlcnRpY2VzIjogX18uaGFzTGFiZWwoInBlcnNvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlZGdlcyI6IF9fLmhhc0xhYmVsKCJjcmVhdGVkIil9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU3ViZ3JhcGhTdHJhdGVneSIpKQorICAgICAgICBhc3NlcnQgNCA9PSBnLlYoKS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgMCA9PSBnLkUoKS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgMSA9PSBnLlYoKS5sYWJlbCgpLmRlZHVwKCkuY291bnQoKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IDQgPT0gZy5WKCkuZmlsdGVyKGxhbWJkYTogKCJ4IC0+IHRydWUiLCAiZ3JlbWxpbi1ncm9vdnkiKSkuY291bnQoKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0ICJwZXJzb24iID09IGcuVigpLmxhYmVsKCkuZGVkdXAoKS5uZXh0KCkKKyAgICAgICAgIworICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikuIFwKKyAgICAgICAgICAgIHdpdGhTdHJhdGVnaWVzKFN1YmdyYXBoU3RyYXRlZ3kodmVydGljZXM9X18uaGFzTGFiZWwoInBlcnNvbiIpLCBlZGdlcz1fXy5oYXNMYWJlbCgiY3JlYXRlZCIpKSkKKyAgICAgICAgYXNzZXJ0IDQgPT0gZy5WKCkuY291bnQoKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IDAgPT0gZy5FKCkuY291bnQoKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IDEgPT0gZy5WKCkubGFiZWwoKS5kZWR1cCgpLmNvdW50KCkubmV4dCgpCisgICAgICAgIGFzc2VydCAicGVyc29uIiA9PSBnLlYoKS5sYWJlbCgpLmRlZHVwKCkubmV4dCgpCisgICAgICAgICMKKyAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pLiBcCisgICAgICAgICAgICB3aXRoU3RyYXRlZ2llcyhTdWJncmFwaFN0cmF0ZWd5KGVkZ2VzPV9fLmhhc0xhYmVsKCJjcmVhdGVkIikpKQorICAgICAgICBhc3NlcnQgNiA9PSBnLlYoKS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgNCA9PSBnLkUoKS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgMSA9PSBnLkUoKS5sYWJlbCgpLmRlZHVwKCkuY291bnQoKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0ICJjcmVhdGVkIiA9PSBnLkUoKS5sYWJlbCgpLmRlZHVwKCkubmV4dCgpCisgICAgICAgICMKKyAgICAgICAgZyA9IGcud2l0aG91dFN0cmF0ZWdpZXMoU3ViZ3JhcGhTdHJhdGVneSkuIFwKKyAgICAgICAgICAgIHdpdGhDb21wdXRlcih2ZXJ0aWNlcz1fXy5oYXMoIm5hbWUiLCAibWFya28iKSwgZWRnZXM9X18ubGltaXQoMCkpCisgICAgICAgIGFzc2VydCAxID09IGcuVigpLmNvdW50KCkubmV4dCgpCisgICAgICAgIGFzc2VydCAwID09IGcuRSgpLmNvdW50KCkubmV4dCgpCisgICAgICAgIGFzc2VydCAicGVyc29uIiA9PSBnLlYoKS5sYWJlbCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgIm1hcmtvIiA9PSBnLlYoKS5uYW1lLm5leHQoKQorICAgICAgICAjCisgICAgICAgIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHJlbW90ZV9jb25uZWN0aW9uKS53aXRoQ29tcHV0ZXIoKQorICAgICAgICBhc3NlcnQgNiA9PSBnLlYoKS5jb3VudCgpLm5leHQoKQorICAgICAgICBhc3NlcnQgNiA9PSBnLkUoKS5jb3VudCgpLm5leHQoKQorICAgICAgICAjCisgICAgICAgIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKHJlbW90ZV9jb25uZWN0aW9uKS53aXRoU3RyYXRlZ2llcyhTZWVkU3RyYXRlZ3koMTIzNDUpKQorICAgICAgICBzaHVmZmxlZFJlc3VsdCA9IGcuVigpLnZhbHVlcygibmFtZSIpLm9yZGVyKCkuYnkoT3JkZXIuc2h1ZmZsZSkudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IHNodWZmbGVkUmVzdWx0ID09IGcuVigpLnZhbHVlcygibmFtZSIpLm9yZGVyKCkuYnkoT3JkZXIuc2h1ZmZsZSkudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IHNodWZmbGVkUmVzdWx0ID09IGcuVigpLnZhbHVlcygibmFtZSIpLm9yZGVyKCkuYnkoT3JkZXIuc2h1ZmZsZSkudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IHNodWZmbGVkUmVzdWx0ID09IGcuVigpLnZhbHVlcygibmFtZSIpLm9yZGVyKCkuYnkoT3JkZXIuc2h1ZmZsZSkudG9MaXN0KCkKKyAgICAgICAgIworICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikuIFwKKyAgICAgICAgICAgIHdpdGhTdHJhdGVnaWVzKFJlc2VydmVkS2V5c1ZlcmlmaWNhdGlvblN0cmF0ZWd5KHRocm93X2V4Y2VwdGlvbj1UcnVlKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiaWQiLCAicGxlYXNlLWRvbid0LXVzZS1pZCIpLml0ZXJhdGUoKQorICAgICAgICAgICAgYXNzZXJ0IEZhbHNlCisgICAgICAgIGV4Y2VwdCBHcmVtbGluU2VydmVyRXJyb3IgYXMgZ3NlOgorICAgICAgICAgICAgYXNzZXJ0IGdzZS5zdGF0dXNfY29kZSA9PSA1MDAKKworICAgIGRlZiB0ZXN0X2Nsb25lKHNlbGYsIHJlbW90ZV9jb25uZWN0aW9uKToKKyAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb24pCisgICAgICAgIHQgPSBnLlYoKS5jb3VudCgpCisgICAgICAgIGFzc2VydCA2ID09IHQubmV4dCgpCisgICAgICAgIGFzc2VydCA2ID09IHQuY2xvbmUoKS5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IDYgPT0gdC5jbG9uZSgpLm5leHQoKQorCisgICAgZGVmIHRlc3RfYXV0aGVudGljYXRlZChzZWxmLCByZW1vdGVfY29ubmVjdGlvbl9hdXRoZW50aWNhdGVkKToKKyAgICAgICAgc3RhdGljcy5sb2FkX3N0YXRpY3MoZ2xvYmFscygpKQorICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbl9hdXRoZW50aWNhdGVkKQorCisgICAgICAgIGFzc2VydCBsb25nKDYpID09IGcuVigpLmNvdW50KCkudG9MaXN0KClbMF0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9kcml2ZXIvdGVzdF9kcml2ZXJfcmVtb3RlX2Nvbm5lY3Rpb25fdGhyZWFkZWQucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfZHJpdmVyX3JlbW90ZV9jb25uZWN0aW9uX3RocmVhZGVkLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfZHJpdmVyX3JlbW90ZV9jb25uZWN0aW9uX3RocmVhZGVkLnB5CnJlbmFtZSB0byBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvZHJpdmVyL3Rlc3RfZHJpdmVyX3JlbW90ZV9jb25uZWN0aW9uX3RocmVhZGVkLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvZHJpdmVyL3Rlc3Rfc2VyaWFsaXplci5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9kcml2ZXIvdGVzdF9zZXJpYWxpemVyLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvZHJpdmVyL3Rlc3Rfc2VyaWFsaXplci5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL2RyaXZlci90ZXN0X3NlcmlhbGl6ZXIucHkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9wcm9jZXNzL19faW5pdF9fLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3Byb2Nlc3MvX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9wcm9jZXNzL19faW5pdF9fLnB5CnJlbmFtZSB0byBncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvcHJvY2Vzcy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL3Byb2Nlc3MvdGVzdF9kc2wucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvcHJvY2Vzcy90ZXN0X2RzbC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL3Byb2Nlc3MvdGVzdF9kc2wucHkKcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9wcm9jZXNzL3Rlc3RfZHNsLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvcHJvY2Vzcy90ZXN0X3N0cmF0ZWdpZXMucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvcHJvY2Vzcy90ZXN0X3N0cmF0ZWdpZXMucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9wcm9jZXNzL3Rlc3Rfc3RyYXRlZ2llcy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3Byb2Nlc3MvdGVzdF9zdHJhdGVnaWVzLnB5CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvcHJvY2Vzcy90ZXN0X3RyYXZlcnNhbC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9wcm9jZXNzL3Rlc3RfdHJhdmVyc2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2M1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvcHJvY2Vzcy90ZXN0X3RyYXZlcnNhbC5weQpAQCAtMCwwICsxLDExNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitfX2F1dGhvcl9fID0gJ01hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSknCisKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBHcmFwaAorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmFub255bW91c190cmF2ZXJzYWwgaW1wb3J0IHRyYXZlcnNhbAorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgUAorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgQmluZGluZywgQmluZGluZ3MKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5ncmFwaF90cmF2ZXJzYWwgaW1wb3J0IF9fCisKKworY2xhc3MgVGVzdFRyYXZlcnNhbChvYmplY3QpOgorICAgIGRlZiB0ZXN0X2J5dGVjb2RlKHNlbGYpOgorICAgICAgICBnID0gdHJhdmVyc2FsKCkud2l0aEdyYXBoKEdyYXBoKCkpCisgICAgICAgIGJ5dGVjb2RlID0gZy5WKCkub3V0KCJjcmVhdGVkIikuYnl0ZWNvZGUKKyAgICAgICAgYXNzZXJ0IDAgPT0gbGVuKGJ5dGVjb2RlLmJpbmRpbmdzLmtleXMoKSkKKyAgICAgICAgYXNzZXJ0IDAgPT0gbGVuKGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMpCisgICAgICAgIGFzc2VydCAyID09IGxlbihieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKKyAgICAgICAgYXNzZXJ0ICJWIiA9PSBieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1swXVswXQorICAgICAgICBhc3NlcnQgIm91dCIgPT0gYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV1bMF0KKyAgICAgICAgYXNzZXJ0ICJjcmVhdGVkIiA9PSBieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1sxXVsxXQorICAgICAgICBhc3NlcnQgMSA9PSBsZW4oYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMF0pCisgICAgICAgIGFzc2VydCAyID09IGxlbihieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1sxXSkKKyAgICAgICAgIyMKKyAgICAgICAgYnl0ZWNvZGUgPSBnLndpdGhTYWNrKDEpLkUoKS5ncm91cENvdW50KCkuYnkoIndlaWdodCIpLmJ5dGVjb2RlCisgICAgICAgIGFzc2VydCAwID09IGxlbihieXRlY29kZS5iaW5kaW5ncy5rZXlzKCkpCisgICAgICAgIGFzc2VydCAxID09IGxlbihieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zKQorICAgICAgICBhc3NlcnQgIndpdGhTYWNrIiA9PSBieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zWzBdWzBdCisgICAgICAgIGFzc2VydCAxID09IGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnNbMF1bMV0KKyAgICAgICAgYXNzZXJ0IDMgPT0gbGVuKGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zKQorICAgICAgICBhc3NlcnQgIkUiID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzBdWzBdCisgICAgICAgIGFzc2VydCAiZ3JvdXBDb3VudCIgPT0gYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV1bMF0KKyAgICAgICAgYXNzZXJ0ICJieSIgPT0gYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMl1bMF0KKyAgICAgICAgYXNzZXJ0ICJ3ZWlnaHQiID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzJdWzFdCisgICAgICAgIGFzc2VydCAxID09IGxlbihieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1swXSkKKyAgICAgICAgYXNzZXJ0IDEgPT0gbGVuKGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzFdKQorICAgICAgICBhc3NlcnQgMiA9PSBsZW4oYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMl0pCisgICAgICAgICMjCisgICAgICAgIGJ5dGVjb2RlID0gZy5WKEJpbmRpbmdzLm9mKCdhJywgWzEsIDIsIDNdKSkgXAorICAgICAgICAgICAgLm91dChCaW5kaW5ncy5vZignYicsICdjcmVhdGVkJykpIFwKKyAgICAgICAgICAgIC53aGVyZShfXy5pbl8oQmluZGluZ3Mub2YoJ2MnLCAnY3JlYXRlZCcpLCBCaW5kaW5ncy5vZignZCcsICdrbm93cycpKSBcCisgICAgICAgICAgICAuY291bnQoKS5pc18oQmluZGluZ3Mub2YoJ2UnLCBQLmd0KDIpKSkpLmJ5dGVjb2RlCisgICAgICAgIGFzc2VydCA1ID09IGxlbihieXRlY29kZS5iaW5kaW5ncy5rZXlzKCkpCisgICAgICAgIGFzc2VydCBbMSwyLDNdID09IGJ5dGVjb2RlLmJpbmRpbmdzWydhJ10KKyAgICAgICAgYXNzZXJ0ICdjcmVhdGVkJyA9PSBieXRlY29kZS5iaW5kaW5nc1snYiddCisgICAgICAgIGFzc2VydCAnY3JlYXRlZCcgPT0gYnl0ZWNvZGUuYmluZGluZ3NbJ2MnXQorICAgICAgICBhc3NlcnQgJ2tub3dzJyA9PSBieXRlY29kZS5iaW5kaW5nc1snZCddCisgICAgICAgIGFzc2VydCBQLmd0KDIpID09IGJ5dGVjb2RlLmJpbmRpbmdzWydlJ10KKyAgICAgICAgYXNzZXJ0IEJpbmRpbmcoJ2InLCAnY3JlYXRlZCcpID09IGJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zWzFdWzFdCisgICAgICAgIGFzc2VydCAnYmluZGluZ1tiPWNyZWF0ZWRdJyA9PSBzdHIoYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV1bMV0pCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGhhc2goYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnNbMV1bMV0pLCBpbnQpCisKKyAgICBkZWYgdGVzdF9QKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB0aGF0IHRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGlzIHJlc3BlY3RlZAorICAgICAgICBhc3NlcnQgImFuZChlcShhKSxsdChiKSkiID09IHN0cihQLmVxKCJhIikuYW5kXyhQLmx0KCJiIikpKQorICAgICAgICBhc3NlcnQgImFuZChvcihsdChiKSxndChjKSksbmVxKGQpKSIgPT0gc3RyKFAubHQoImIiKS5vcl8oUC5ndCgiYyIpKS5hbmRfKFAubmVxKCJkIikpKQorICAgICAgICBhc3NlcnQgImFuZChvcihsdChiKSxndChjKSksb3IobmVxKGQpLGd0ZShlKSkpIiA9PSBzdHIoCisgICAgICAgICAgICBQLmx0KCJiIikub3JfKFAuZ3QoImMiKSkuYW5kXyhQLm5lcSgiZCIpLm9yXyhQLmd0ZSgiZSIpKSkpCisKKyAgICBkZWYgdGVzdF9hbm9ueW1vdXNfdHJhdmVyc2FsKHNlbGYpOgorICAgICAgICBieXRlY29kZSA9IF9fLl9fKDEpLmJ5dGVjb2RlCisgICAgICAgIGFzc2VydCAwID09IGxlbihieXRlY29kZS5iaW5kaW5ncy5rZXlzKCkpCisgICAgICAgIGFzc2VydCAwID09IGxlbihieXRlY29kZS5zb3VyY2VfaW5zdHJ1Y3Rpb25zKQorICAgICAgICBhc3NlcnQgMSA9PSBsZW4oYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMpCisgICAgICAgIGFzc2VydCAiaW5qZWN0IiA9PSBieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1swXVswXQorICAgICAgICBhc3NlcnQgMSA9PSBieXRlY29kZS5zdGVwX2luc3RydWN0aW9uc1swXVsxXQorICAgICAgICAjIworICAgICAgICBieXRlY29kZSA9IF9fLnN0YXJ0KCkuYnl0ZWNvZGUKKyAgICAgICAgYXNzZXJ0IDAgPT0gbGVuKGJ5dGVjb2RlLmJpbmRpbmdzLmtleXMoKSkKKyAgICAgICAgYXNzZXJ0IDAgPT0gbGVuKGJ5dGVjb2RlLnNvdXJjZV9pbnN0cnVjdGlvbnMpCisgICAgICAgIGFzc2VydCAwID09IGxlbihieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKKworICAgIGRlZiB0ZXN0X2Nsb25lX3RyYXZlcnNhbChzZWxmKToKKyAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhHcmFwaChHcmFwaCgpKQorICAgICAgICBvcmlnaW5hbCA9IGcuVigpLm91dCgiY3JlYXRlZCIpCisgICAgICAgIGNsb25lID0gb3JpZ2luYWwuY2xvbmUoKS5vdXQoImtub3dzIikKKyAgICAgICAgY2xvbmVDbG9uZSA9IGNsb25lLmNsb25lKCkub3V0KCJjcmVhdGVkIikKKworICAgICAgICBhc3NlcnQgMiA9PSBsZW4ob3JpZ2luYWwuYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMpCisgICAgICAgIGFzc2VydCAzID09IGxlbihjbG9uZS5ieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKKyAgICAgICAgYXNzZXJ0IDQgPT0gbGVuKGNsb25lQ2xvbmUuYnl0ZWNvZGUuc3RlcF9pbnN0cnVjdGlvbnMpCisKKyAgICAgICAgb3JpZ2luYWwuaGFzKCJwZXJzb24iLCAibmFtZSIsICJtYXJrbyIpCisgICAgICAgIGNsb25lLlYoKS5vdXQoKQorCisgICAgICAgIGFzc2VydCAzID09IGxlbihvcmlnaW5hbC5ieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKKyAgICAgICAgYXNzZXJ0IDUgPT0gbGVuKGNsb25lLmJ5dGVjb2RlLnN0ZXBfaW5zdHJ1Y3Rpb25zKQorICAgICAgICBhc3NlcnQgNCA9PSBsZW4oY2xvbmVDbG9uZS5ieXRlY29kZS5zdGVwX2luc3RydWN0aW9ucykKKworICAgIGRlZiB0ZXN0X2VuZm9yY2VfYW5vbnltb3VzX2NoaWxkX3RyYXZlcnNhbChzZWxmKToKKyAgICAgICAgZyA9IHRyYXZlcnNhbCgpLndpdGhHcmFwaChHcmFwaCgpKQorICAgICAgICBnLlYoMCkuYWRkRSgic2VsZiIpLnRvKF9fLlYoMSkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZy5WKDApLmFkZEUoInNlbGYiKS50byhnLlYoMSkpCisgICAgICAgICAgICBhc3NlcnQgZmFsc2UKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvc3RydWN0dXJlL19faW5pdF9fLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9fX2luaXRfXy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9pby9fX2luaXRfXy5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL2p5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vX19pbml0X18ucHkKcmVuYW1lIHRvIGdyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9mdW5jdGlvbmFsaXR5aW8ucHkgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZnVuY3Rpb25hbGl0eWlvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZnVuY3Rpb25hbGl0eWlvLnB5CkBAIC0wLDAgKzEsOTYgQEAKKycnJworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKycnJworCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCB1dWlkCisKK2Zyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLnNlcmlhbGl6ZXIgaW1wb3J0IEdyYXBoU09OU2VyaWFsaXplcnNWMmQwCitmcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgR3JhcGgKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RhdGljcyBpbXBvcnQgKgorCisKK2RlZiB0ZXN0X3RpbWVzdGFtcChyZW1vdGVfY29ubmVjdGlvbik6CisgICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikKKyAgICB0cyA9IHRpbWVzdGFtcCgxNDgxNzUwMDc2Mjk1IC8gMTAwMCkKKyAgICByZXNwID0gZy5hZGRWKCd0ZXN0X3ZlcnRleCcpLnByb3BlcnR5KCd0cycsIHRzKQorICAgIHJlc3AgPSByZXNwLnRvTGlzdCgpCisgICAgdmlkID0gcmVzcFswXS5pZAorICAgIHRyeToKKyAgICAgICAgdHNfcHJvcCA9IGcuVih2aWQpLnByb3BlcnRpZXMoJ3RzJykudG9MaXN0KClbMF0KKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodHNfcHJvcC52YWx1ZSwgdGltZXN0YW1wKQorICAgICAgICBhc3NlcnQgdHNfcHJvcC52YWx1ZSA9PSB0cworICAgIGZpbmFsbHk6CisgICAgICAgIGcuVih2aWQpLmRyb3AoKS5pdGVyYXRlKCkKKworCitkZWYgdGVzdF9kYXRldGltZShyZW1vdGVfY29ubmVjdGlvbik6CisgICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikKKyAgICBkdCA9IGRhdGV0aW1lLmRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDApCisgICAgcmVzcCA9IGcuYWRkVigndGVzdF92ZXJ0ZXgnKS5wcm9wZXJ0eSgnZHQnLCBkdCkudG9MaXN0KCkKKyAgICB2aWQgPSByZXNwWzBdLmlkCisgICAgdHJ5OgorICAgICAgICBkdF9wcm9wID0gZy5WKHZpZCkucHJvcGVydGllcygnZHQnKS50b0xpc3QoKVswXQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkdF9wcm9wLnZhbHVlLCBkYXRldGltZS5kYXRldGltZSkKKyAgICAgICAgYXNzZXJ0IGR0X3Byb3AudmFsdWUgPT0gZHQKKyAgICBmaW5hbGx5OgorICAgICAgICBnLlYodmlkKS5kcm9wKCkuaXRlcmF0ZSgpCisKKworZGVmIHRlc3RfdXVpZChyZW1vdGVfY29ubmVjdGlvbik6CisgICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikKKyAgICB1aWQgPSB1dWlkLlVVSUQoIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiIpCisgICAgcmVzcCA9IGcuYWRkVigndGVzdF92ZXJ0ZXgnKS5wcm9wZXJ0eSgndXVpZCcsIHVpZCkudG9MaXN0KCkKKyAgICB2aWQgPSByZXNwWzBdLmlkCisgICAgdHJ5OgorICAgICAgICB1aWRfcHJvcCA9IGcuVih2aWQpLnByb3BlcnRpZXMoJ3V1aWQnKS50b0xpc3QoKVswXQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh1aWRfcHJvcC52YWx1ZSwgdXVpZC5VVUlEKQorICAgICAgICBhc3NlcnQgdWlkX3Byb3AudmFsdWUgPT0gdWlkCisgICAgZmluYWxseToKKyAgICAgICAgZy5WKHZpZCkuZHJvcCgpLml0ZXJhdGUoKQorCisKK2RlZiB0ZXN0X29kZF9iaXRzKHJlbW90ZV9jb25uZWN0aW9uKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZShyZW1vdGVfY29ubmVjdGlvbi5fY2xpZW50Ll9tZXNzYWdlX3NlcmlhbGl6ZXIsIEdyYXBoU09OU2VyaWFsaXplcnNWMmQwKToKKyAgICAgICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbikKKyAgICAgICAgY2hhcl9sb3dlciA9IHN0ci5fX25ld19fKFNpbmdsZUNoYXIsIGNocig3OCkpCisgICAgICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ2NoYXJfbG93ZXInLCBjaGFyX2xvd2VyKS50b0xpc3QoKQorICAgICAgICB2aWQgPSByZXNwWzBdLmlkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHYgPSBnLlYodmlkKS52YWx1ZXMoJ2NoYXJfbG93ZXInKS50b0xpc3QoKVswXQorICAgICAgICAgICAgYXNzZXJ0IHYgPT0gY2hhcl9sb3dlcgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZy5WKHZpZCkuZHJvcCgpLml0ZXJhdGUoKQorCisgICAgICAgIGNoYXJfdXBwZXIgPSBzdHIuX19uZXdfXyhTaW5nbGVDaGFyLCBjaHIoNTczNDQpKQorICAgICAgICByZXNwID0gZy5hZGRWKCd0ZXN0X3ZlcnRleCcpLnByb3BlcnR5KCdjaGFyX3VwcGVyJywgY2hhcl91cHBlcikudG9MaXN0KCkKKyAgICAgICAgdmlkID0gcmVzcFswXS5pZAorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ID0gZy5WKHZpZCkudmFsdWVzKCdjaGFyX3VwcGVyJykudG9MaXN0KClbMF0KKyAgICAgICAgICAgIGFzc2VydCB2ID09IGNoYXJfdXBwZXIKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGcuVih2aWQpLmRyb3AoKS5pdGVyYXRlKCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZHVyID0gZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9MTAwMCwgbWljcm9zZWNvbmRzPTEwMDApCisgICAgICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ2R1cicsIGR1cikudG9MaXN0KCkKKyAgICAgICAgdmlkID0gcmVzcFswXS5pZAorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ID0gZy5WKHZpZCkudmFsdWVzKCdkdXInKS50b0xpc3QoKVswXQorICAgICAgICAgICAgYXNzZXJ0IHYgPT0gZHVyCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBnLlYodmlkKS5kcm9wKCkuaXRlcmF0ZSgpCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZ3JhcGhiaW5hcnlWMS5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9ncmFwaGJpbmFyeVYxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTFiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZ3JhcGhiaW5hcnlWMS5weQpAQCAtMCwwICsxLDIyMSBAQAorIiIiCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorIiIiCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGNhbGVuZGFyCitpbXBvcnQgdGltZQoraW1wb3J0IHV1aWQKK2ltcG9ydCBtYXRoCitmcm9tIGRlY2ltYWwgaW1wb3J0ICoKKworZnJvbSBtb2NrIGltcG9ydCBNb2NrCisKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RhdGljcyBpbXBvcnQgdGltZXN0YW1wLCBsb25nLCBTaW5nbGVCeXRlLCBTaW5nbGVDaGFyLCBCeXRlQnVmZmVyVHlwZQorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFZlcnRleCwgRWRnZSwgUHJvcGVydHksIFZlcnRleFByb3BlcnR5LCBHcmFwaCwgUGF0aAorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhiaW5hcnlWMSBpbXBvcnQgR3JhcGhCaW5hcnlXcml0ZXIsIEdyYXBoQmluYXJ5UmVhZGVyLCBEYXRhVHlwZQorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgUCwgQmFycmllciwgQmluZGluZywgQnl0ZWNvZGUKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5zdHJhdGVnaWVzIGltcG9ydCBTdWJncmFwaFN0cmF0ZWd5Citmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBfXworCisKK2NsYXNzIFRlc3RHcmFwaEJpbmFyeVJlYWRlcihvYmplY3QpOgorICAgIGdyYXBoYmluYXJ5X3JlYWRlciA9IEdyYXBoQmluYXJ5UmVhZGVyKCkKKworCitjbGFzcyBUZXN0R3JhcGhTT05Xcml0ZXIob2JqZWN0KToKKyAgICBncmFwaGJpbmFyeV93cml0ZXIgPSBHcmFwaEJpbmFyeVdyaXRlcigpCisgICAgZ3JhcGhiaW5hcnlfcmVhZGVyID0gR3JhcGhCaW5hcnlSZWFkZXIoKQorCisgICAgZGVmIHRlc3RfbnVsbChzZWxmKToKKyAgICAgICAgYyA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoTm9uZSkpCisgICAgICAgIGFzc2VydCBjIGlzIE5vbmUKKworICAgIGRlZiB0ZXN0X2ludChzZWxmKToKKyAgICAgICAgeCA9IDEwMAorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6CisgICAgICAgIHggPSBsb25nKDEwMCkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKKyAgICAgICAgeCA9IGZsb2F0KDEwMC4wMDEpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgICAgIHggPSBmbG9hdCgnbmFuJykKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IG1hdGguaXNuYW4ob3V0cHV0KQorCisgICAgICAgIHggPSBmbG9hdCgnLWluZicpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKG91dHB1dCkgYW5kIG91dHB1dCA8IDAKKworICAgICAgICB4ID0gZmxvYXQoJ2luZicpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKG91dHB1dCkgYW5kIG91dHB1dCA+IDAKKworICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKKyAgICAgICAgeCA9IDEwMC4wMDEKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9kYXRlKHNlbGYpOgorICAgICAgICB4ID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxNiwgMTIsIDE0LCAxNiwgMTQsIDM2LCAyOTUwMDApCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYpOgorICAgICAgICB4ID0gdGltZXN0YW1wKDE0ODE3NTAwNzYyOTUgLyAxMDAwKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgeCA9ICJzZXJpYWxpemUgdGhpcyEiCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfaG9tb2dlbmVvdXNfbGlzdChzZWxmKToKKyAgICAgICAgeCA9IFsic2VyaWFsaXplIHRoaXMhIiwgInNlcmlhbGl6ZSB0aGF0ISIsICJzZXJpYWxpemUgdGhhdCEiLCJzdG9wIHRlbGxpbmcgbWUgd2hhdCB0byBzZXJpYWxpemUiXQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2hldGVyb2dlbmVvdXNfbGlzdChzZWxmKToKKyAgICAgICAgeCA9IFsic2VyaWFsaXplIHRoaXMhIiwgMCwgInNlcmlhbGl6ZSB0aGF0ISIsICJzZXJpYWxpemUgdGhhdCEiLCAxLCAic3RvcCB0ZWxsaW5nIG1lIHdoYXQgdG8gc2VyaWFsaXplIiwgMl0KKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9oZXRlcm9nZW5lb3VzX2xpc3Rfd2l0aF9ub25lKHNlbGYpOgorICAgICAgICB4ID0gWyJzZXJpYWxpemUgdGhpcyEiLCAwLCAic2VyaWFsaXplIHRoYXQhIiwgInNlcmlhbGl6ZSB0aGF0ISIsIDEsICJzdG9wIHRlbGxpbmcgbWUgd2hhdCB0byBzZXJpYWxpemUiLCAyLCBOb25lXQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2hvbW9nZW5lb3VzX3NldChzZWxmKToKKyAgICAgICAgeCA9IHsic2VyaWFsaXplIHRoaXMhIiwgInNlcmlhbGl6ZSB0aGF0ISIsICJzdG9wIHRlbGxpbmcgbWUgd2hhdCB0byBzZXJpYWxpemUifQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2hldGVyb2dlbmVvdXNfc2V0KHNlbGYpOgorICAgICAgICB4ID0geyJzZXJpYWxpemUgdGhpcyEiLCAwLCAic2VyaWFsaXplIHRoYXQhIiwgMSwgInN0b3AgdGVsbGluZyBtZSB3aGF0IHRvIHNlcmlhbGl6ZSIsIDJ9CisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfZGljdChzZWxmKToKKyAgICAgICAgeCA9IHsieW8iOiAid2hhdD8iLAorICAgICAgICAgICAgICJnbyI6ICJubyEiLAorICAgICAgICAgICAgICJudW1iZXIiOiAxMjMsCisgICAgICAgICAgICAgMzIxOiAiY3Jhenkgd2l0aCB0aGUgbnVtYmVyIGZvciBhIGtleSIsCisgICAgICAgICAgICAgOTg3OiBbImdvIiwgImRlZXAiLCB7ImhlcmUiOiAiISJ9XX0KKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0CisKKyAgICAgICAgeCA9IHsibWFya28iOiBbNjY2XSwgIm5vb25lIjogWyJibGFoIl19CisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgICAgIHggPSB7InJpcHBsZSI6IFtdLCAicGV0ZXIiOiBbImNyZWF0ZWQiXSwgIm5vb25lIjogWyJibGFoIl0sICJ2YWRhcyI6IFtdLAorICAgICAgICAgICAgICJqb3NoIjogWyJjcmVhdGVkIiwgImNyZWF0ZWQiXSwgImxvcCI6IFtdLCAibWFya28iOiBbNjY2LCAiY3JlYXRlZCIsICJrbm93cyIsICJrbm93cyJdfQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X3V1aWQoc2VsZik6CisgICAgICAgIHggPSB1dWlkLlVVSUQoIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiIpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfZWRnZShzZWxmKToKKyAgICAgICAgeCA9IEVkZ2UoMTIzLCBWZXJ0ZXgoMSwgJ3BlcnNvbicpLCAiZGV2ZWxvcGVkIiwgVmVydGV4KDEwLCAic29mdHdhcmUiKSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0CisgICAgICAgIGFzc2VydCB4LmluViA9PSBvdXRwdXQuaW5WCisgICAgICAgIGFzc2VydCB4Lm91dFYgPT0gb3V0cHV0Lm91dFYKKworICAgIGRlZiB0ZXN0X3BhdGgoc2VsZik6CisgICAgICAgIHggPSBQYXRoKFsieCIsICJ5IiwgInoiXSwgWzEsIDIsIDNdKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X3Byb3BlcnR5KHNlbGYpOgorICAgICAgICB4ID0gUHJvcGVydHkoIm5hbWUiLCAic3RlcGhlbiIsIE5vbmUpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfdmVydGV4KHNlbGYpOgorICAgICAgICB4ID0gVmVydGV4KDEyMywgInBlcnNvbiIpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfdmVydGV4cHJvcGVydHkoc2VsZik6CisgICAgICAgIHggPSBWZXJ0ZXhQcm9wZXJ0eSgxMjMsICJuYW1lIiwgInN0ZXBoZW4iLCBOb25lKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKyAgICAgICAgCisgICAgZGVmIHRlc3RfYmFycmllcihzZWxmKToKKyAgICAgICAgeCA9IEJhcnJpZXIubm9ybVNhY2sKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9iaW5kaW5nKHNlbGYpOgorICAgICAgICB4ID0gQmluZGluZygibmFtZSIsICJtYXJrbyIpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfYnl0ZWNvZGUoc2VsZik6CisgICAgICAgIHggPSBCeXRlY29kZSgpCisgICAgICAgIHguc291cmNlX2luc3RydWN0aW9ucy5hcHBlbmQoWyJ3aXRoU3RyYXRlZ2llcyIsICJTdWJncmFwaFN0cmF0ZWd5Il0pCisgICAgICAgIHguc3RlcF9pbnN0cnVjdGlvbnMuYXBwZW5kKFsiViIsIDEsIDIsIDNdKQorICAgICAgICB4LnN0ZXBfaW5zdHJ1Y3Rpb25zLmFwcGVuZChbIm91dCJdKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2J5dGUoc2VsZik6CisgICAgICAgIHggPSBpbnQuX19uZXdfXyhTaW5nbGVCeXRlLCAxKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2J5dGVidWZmZXIoc2VsZik6CisgICAgICAgIHggPSBCeXRlQnVmZmVyVHlwZSgiYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxIiwgInV0ZjgiKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2Jvb2xlYW4oc2VsZik6CisgICAgICAgIHggPSBUcnVlCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhiaW5hcnlfcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaGJpbmFyeV93cml0ZXIud3JpdGVPYmplY3QoeCkpCisgICAgICAgIGFzc2VydCB4ID09IG91dHB1dAorCisgICAgICAgIHggPSBGYWxzZQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6CisgICAgICAgIHggPSBzdHIuX19uZXdfXyhTaW5nbGVDaGFyLCBjaHIoNzYpKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKworICAgICAgICB4ID0gc3RyLl9fbmV3X18oU2luZ2xlQ2hhciwgY2hyKDU3MzQ0KSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaGJpbmFyeV9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoYmluYXJ5X3dyaXRlci53cml0ZU9iamVjdCh4KSkKKyAgICAgICAgYXNzZXJ0IHggPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9kdXJhdGlvbihzZWxmKToKKyAgICAgICAgeCA9IGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTEwMDAsIG1pY3Jvc2Vjb25kcz0xMDAwKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoYmluYXJ5X3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhiaW5hcnlfd3JpdGVyLndyaXRlT2JqZWN0KHgpKQorICAgICAgICBhc3NlcnQgeCA9PSBvdXRwdXQKKyAgICAgICAgCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvc3RydWN0dXJlL2lvL3Rlc3RfZ3JhcGhzb25WMmQwLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9pby90ZXN0X2dyYXBoc29uVjJkMC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M0ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9pby90ZXN0X2dyYXBoc29uVjJkMC5weQpAQCAtMCwwICsxLDUxOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitfX2F1dGhvcl9fID0gJ01hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSknCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGNhbGVuZGFyCitpbXBvcnQganNvbgoraW1wb3J0IHV1aWQKK2ltcG9ydCBtYXRoCitmcm9tIGRlY2ltYWwgaW1wb3J0ICoKKworZnJvbSBtb2NrIGltcG9ydCBNb2NrCisKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RhdGljcyBpbXBvcnQgKgorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFZlcnRleCwgRWRnZSwgUHJvcGVydHksIFZlcnRleFByb3BlcnR5LCBHcmFwaCwgUGF0aAorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WMmQwIGltcG9ydCBHcmFwaFNPTldyaXRlciwgR3JhcGhTT05SZWFkZXIsIEdyYXBoU09OVXRpbAoraW1wb3J0IGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYyZDAKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IFAKK2Zyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5zdHJhdGVnaWVzIGltcG9ydCBTdWJncmFwaFN0cmF0ZWd5Citmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBfXworCisKK2NsYXNzIFRlc3RHcmFwaFNPTlJlYWRlcihvYmplY3QpOgorICAgIGdyYXBoc29uX3JlYWRlciA9IEdyYXBoU09OUmVhZGVyKCkKKworICAgIGRlZiB0ZXN0X251bWJlcl9pbnB1dChzZWxmKToKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZ3g6Qnl0ZSIsCisgICAgICAgICAgICAiQHZhbHVlIjogMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgU2luZ2xlQnl0ZSkKKyAgICAgICAgYXNzZXJ0IDEgPT0geAorICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJnOkludDMyIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAzMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgaW50KQorICAgICAgICBhc3NlcnQgMzEgPT0geAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAzMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgbG9uZykKKyAgICAgICAgYXNzZXJ0IGxvbmcoMzEpID09IHgKKyAgICAgICAgIyMKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZzpGbG9hdCIsCisgICAgICAgICAgICAiQHZhbHVlIjogMzEuMworICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCisgICAgICAgIGFzc2VydCAzMS4zID09IHgKKyAgICAgICAgIyMKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgIkB2YWx1ZSI6IDMxLjIKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQorICAgICAgICBhc3NlcnQgMzEuMiA9PSB4CisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiTmFOIgorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCisgICAgICAgIGFzc2VydCBtYXRoLmlzbmFuKHgpCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiSW5maW5pdHkiCisgICAgICAgIH0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBmbG9hdCkKKyAgICAgICAgYXNzZXJ0IG1hdGguaXNpbmYoeCkgYW5kIHggPiAwCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiLUluZmluaXR5IgorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCisgICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4IDwgMAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAzMS4yCisgICAgICAgIH0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBEZWNpbWFsKQorICAgICAgICBhc3NlcnQgRGVjaW1hbCgzMS4yKSA9PSB4CisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgIkB2YWx1ZSI6IDEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgRGVjaW1hbCkKKyAgICAgICAgYXNzZXJ0IERlY2ltYWwoJzEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMScpID09IHgKKyAgICAgICAgIyMKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsCisgICAgICAgICAgICAiQHZhbHVlIjogIk5hTiIKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCisgICAgICAgIGFzc2VydCBtYXRoLmlzbmFuKHgpCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgIkB2YWx1ZSI6ICJJbmZpbml0eSIKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCisgICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4ID4gMAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiLUluZmluaXR5IgorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgRGVjaW1hbCkKKyAgICAgICAgYXNzZXJ0IG1hdGguaXNpbmYoeCkgYW5kIHggPCAwCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgIkB2YWx1ZSI6IDMxCisgICAgICAgIH0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBsb25nKQorICAgICAgICBhc3NlcnQgMzEgPT0geAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGxvbmcpCisgICAgICAgIGFzc2VydCAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEgPT0geAorCisgICAgZGVmIHRlc3RfZ3JhcGgoc2VsZik6CisgICAgICAgIHZlcnRleCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoIiIiCisgICAgICAgIHsiQHR5cGUiOiJnOlZlcnRleCIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoxfSwibGFiZWwiOiJwZXJzb24iLCJvdXRFIjp7ImNyZWF0ZWQiOlt7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6OX0sImluViI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjN9LCJwcm9wZXJ0aWVzIjp7IndlaWdodCI6eyJAdHlwZSI6Imc6RG91YmxlIiwiQHZhbHVlIjowLjR9fX1dLCJrbm93cyI6W3siaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjo3fSwiaW5WIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6Mn0sInByb3BlcnRpZXMiOnsid2VpZ2h0Ijp7IkB0eXBlIjoiZzpEb3VibGUiLCJAdmFsdWUiOjAuNX19fSx7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6OH0sImluViI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjR9LCJwcm9wZXJ0aWVzIjp7IndlaWdodCI6eyJAdHlwZSI6Imc6RG91YmxlIiwiQHZhbHVlIjoxLjB9fX1dfSwicHJvcGVydGllcyI6eyJuYW1lIjpbeyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjB9LCJ2YWx1ZSI6Im1hcmtvIn1dLCJhZ2UiOlt7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MX0sInZhbHVlIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6Mjl9fV19fX0iIiIpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZlcnRleCwgVmVydGV4KQorICAgICAgICBhc3NlcnQgInBlcnNvbiIgPT0gdmVydGV4LmxhYmVsCisgICAgICAgIGFzc2VydCAxID09IHZlcnRleC5pZAorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXguaWQsIGludCkKKyAgICAgICAgYXNzZXJ0IHZlcnRleCA9PSBWZXJ0ZXgoMSkKKyAgICAgICAgIyMKKyAgICAgICAgdmVydGV4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKKyAgICAgICAgeyJAdHlwZSI6Imc6VmVydGV4IiwgIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6RmxvYXQiLCJAdmFsdWUiOjQ1LjIzfX19IiIiKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXgsIFZlcnRleCkKKyAgICAgICAgYXNzZXJ0IDQ1LjIzID09IHZlcnRleC5pZAorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXguaWQsIEZsb2F0VHlwZSkKKyAgICAgICAgYXNzZXJ0ICJ2ZXJ0ZXgiID09IHZlcnRleC5sYWJlbAorICAgICAgICBhc3NlcnQgdmVydGV4ID09IFZlcnRleCg0NS4yMykKKyAgICAgICAgIyMKKyAgICAgICAgdmVydGV4X3Byb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKKyAgICAgICAgeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCAiQHZhbHVlIjp7ImlkIjoiYW5JZCIsImxhYmVsIjoiYUtleSIsInZhbHVlIjp0cnVlLCJ2ZXJ0ZXgiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjo5fX19IiIiKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXhfcHJvcGVydHksIFZlcnRleFByb3BlcnR5KQorICAgICAgICBhc3NlcnQgImFuSWQiID09IHZlcnRleF9wcm9wZXJ0eS5pZAorICAgICAgICBhc3NlcnQgImFLZXkiID09IHZlcnRleF9wcm9wZXJ0eS5sYWJlbAorICAgICAgICBhc3NlcnQgdmVydGV4X3Byb3BlcnR5LnZhbHVlCisgICAgICAgIGFzc2VydCB2ZXJ0ZXhfcHJvcGVydHkudmVydGV4ID09IFZlcnRleCg5KQorICAgICAgICAjIworICAgICAgICB2ZXJ0ZXhfcHJvcGVydHkgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgorICAgICAgICB7IkB0eXBlIjoiZzpWZXJ0ZXhQcm9wZXJ0eSIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoxfSwibGFiZWwiOiJuYW1lIiwidmFsdWUiOiJtYXJrbyJ9fSIiIikKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4X3Byb3BlcnR5LCBWZXJ0ZXhQcm9wZXJ0eSkKKyAgICAgICAgYXNzZXJ0IDEgPT0gdmVydGV4X3Byb3BlcnR5LmlkCisgICAgICAgIGFzc2VydCAibmFtZSIgPT0gdmVydGV4X3Byb3BlcnR5LmxhYmVsCisgICAgICAgIGFzc2VydCAibWFya28iID09IHZlcnRleF9wcm9wZXJ0eS52YWx1ZQorICAgICAgICBhc3NlcnQgdmVydGV4X3Byb3BlcnR5LnZlcnRleCBpcyBOb25lCisgICAgICAgICMjCisgICAgICAgIGVkZ2UgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgorICAgICAgICB7IkB0eXBlIjoiZzpFZGdlIiwgIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjE3fSwibGFiZWwiOiJrbm93cyIsImluViI6IngiLCJvdXRWIjoieSIsImluVkxhYmVsIjoieExhYiIsInByb3BlcnRpZXMiOnsiYUtleSI6ImFWYWx1ZSIsImJLZXkiOnRydWV9fX0iIiIpCisgICAgICAgICMgcHJpbnQgZWRnZQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlZGdlLCBFZGdlKQorICAgICAgICBhc3NlcnQgMTcgPT0gZWRnZS5pZAorICAgICAgICBhc3NlcnQgImtub3dzIiA9PSBlZGdlLmxhYmVsCisgICAgICAgIGFzc2VydCBlZGdlLmluViA9PSBWZXJ0ZXgoIngiLCAieExhYmVsIikKKyAgICAgICAgYXNzZXJ0IGVkZ2Uub3V0ViA9PSBWZXJ0ZXgoInkiLCAidmVydGV4IikKKyAgICAgICAgIyMKKyAgICAgICAgcHJvcGVydHkgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgorICAgICAgICB7IkB0eXBlIjoiZzpQcm9wZXJ0eSIsICJAdmFsdWUiOnsia2V5IjoiYUtleSIsInZhbHVlIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MTd9LCJlbGVtZW50Ijp7IkB0eXBlIjoiZzpFZGdlIiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MTIyfSwibGFiZWwiOiJrbm93cyIsImluViI6IngiLCJvdXRWIjoieSIsImluVkxhYmVsIjoieExhYiJ9fX19IiIiKQorICAgICAgICAjIHByaW50IHByb3BlcnR5CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHByb3BlcnR5LCBQcm9wZXJ0eSkKKyAgICAgICAgYXNzZXJ0ICJhS2V5IiA9PSBwcm9wZXJ0eS5rZXkKKyAgICAgICAgYXNzZXJ0IDE3ID09IHByb3BlcnR5LnZhbHVlCisgICAgICAgIGFzc2VydCBFZGdlKDEyMiwgVmVydGV4KCJ4IiksICJrbm93cyIsIFZlcnRleCgieSIpKSA9PSBwcm9wZXJ0eS5lbGVtZW50CisKKyAgICBkZWYgdGVzdF9wYXRoKHNlbGYpOgorICAgICAgICBwYXRoID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKKyAgICAgICAgICAgICIiInsiQHR5cGUiOiJnOlBhdGgiLCJAdmFsdWUiOnsibGFiZWxzIjpbWyJhIl0sWyJiIiwiYyJdLFtdXSwib2JqZWN0cyI6W3siQHR5cGUiOiJnOlZlcnRleCIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjF9LCJsYWJlbCI6InBlcnNvbiIsInByb3BlcnRpZXMiOnsibmFtZSI6W3siQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MH0sInZhbHVlIjoibWFya28iLCJsYWJlbCI6Im5hbWUifX1dLCJhZ2UiOlt7IkB0eXBlIjoiZzpWZXJ0ZXhQcm9wZXJ0eSIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjF9LCJ2YWx1ZSI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjI5fSwibGFiZWwiOiJhZ2UifX1dfX19LHsiQHR5cGUiOiJnOlZlcnRleCIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjN9LCJsYWJlbCI6InNvZnR3YXJlIiwicHJvcGVydGllcyI6eyJuYW1lIjpbeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjo0fSwidmFsdWUiOiJsb3AiLCJsYWJlbCI6Im5hbWUifX1dLCJsYW5nIjpbeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjo1fSwidmFsdWUiOiJqYXZhIiwibGFiZWwiOiJsYW5nIn19XX19fSwibG9wIl19fSIiIgorICAgICAgICApCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhdGgsIFBhdGgpCisgICAgICAgIGFzc2VydCAicGF0aFt2WzFdLCB2WzNdLCBsb3BdIiA9PSBzdHIocGF0aCkKKyAgICAgICAgYXNzZXJ0IFZlcnRleCgxKSA9PSBwYXRoWzBdCisgICAgICAgIGFzc2VydCBWZXJ0ZXgoMSkgPT0gcGF0aFsiYSJdCisgICAgICAgIGFzc2VydCAibG9wIiA9PSBwYXRoWzJdCisgICAgICAgIGFzc2VydCAzID09IGxlbihwYXRoKQorCisgICAgZGVmIHRlc3RfY3VzdG9tX21hcHBpbmcoc2VsZik6CisKKyAgICAgICAgIyBleHRlbmRlZCBtYXBwaW5nCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0eXBlX3N0cmluZyA9ICJ0ZXN0Olh0eXBlIgorICAgICAgICBvdmVycmlkZV9zdHJpbmcgPSAiZzpJbnQ2NCIKKyAgICAgICAgc2VyZGVzID0gTW9jaygpCisKKyAgICAgICAgcmVhZGVyID0gR3JhcGhTT05SZWFkZXIoZGVzZXJpYWxpemVyX21hcD17dHlwZV9zdHJpbmc6IHNlcmRlc30pCisgICAgICAgIGFzc2VydCB0eXBlX3N0cmluZyBpbiByZWFkZXIuZGVzZXJpYWxpemVycworCisgICAgICAgICMgYmFzZSBkaWN0cyBhcmUgbm90IG1vZGlmaWVkCisgICAgICAgIGFzc2VydCB0eXBlX3N0cmluZyBub3QgaW4gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjJkMC5fZGVzZXJpYWxpemVycworCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgbyA9IHJlYWRlci50b09iamVjdCh7R3JhcGhTT05VdGlsLlRZUEVfS0VZOiB0eXBlX3N0cmluZywgR3JhcGhTT05VdGlsLlZBTFVFX0tFWTogeH0pCisgICAgICAgIHNlcmRlcy5vYmplY3RpZnkuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgoeCwgcmVhZGVyKQorICAgICAgICBhc3NlcnQgbyBpcyBzZXJkZXMub2JqZWN0aWZ5KCkKKworICAgICAgICAjIG92ZXJyaWRkZW4gbWFwcGluZworICAgICAgICB0eXBlX3N0cmluZyA9ICJnOkludDY0IgorICAgICAgICBzZXJkZXMgPSBNb2NrKCkKKyAgICAgICAgcmVhZGVyID0gR3JhcGhTT05SZWFkZXIoZGVzZXJpYWxpemVyX21hcD17dHlwZV9zdHJpbmc6IHNlcmRlcywgb3ZlcnJpZGVfc3RyaW5nOiBzZXJkZXN9KQorICAgICAgICBhc3NlcnQgZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjJkMC5fZGVzZXJpYWxpemVyc1t0eXBlX3N0cmluZ10gaXMgbm90IHJlYWRlci5kZXNlcmlhbGl6ZXJzW3R5cGVfc3RyaW5nXQorCisgICAgICAgIHZhbHVlID0gMworICAgICAgICBvID0gcmVhZGVyLnRvT2JqZWN0KHtHcmFwaFNPTlV0aWwuVFlQRV9LRVk6IHR5cGVfc3RyaW5nLCBHcmFwaFNPTlV0aWwuVkFMVUVfS0VZOiB2YWx1ZX0pCisgICAgICAgIHNlcmRlcy5vYmplY3RpZnkuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgodmFsdWUsIHJlYWRlcikKKyAgICAgICAgYXNzZXJ0IG8gaXMgc2VyZGVzLm9iamVjdGlmeSgpCisKKyAgICBkZWYgdGVzdF9kYXRldGltZShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSBkYXRldGltZS5kYXRldGltZSgyMDE2LCAxMiwgMTQsIDE2LCAxNCwgMzYsIDI5NTAwMCkKKyAgICAgICAgcHRzID0gY2FsZW5kYXIudGltZWdtKGV4cGVjdGVkLnV0Y3RpbWV0dXBsZSgpKSArIGV4cGVjdGVkLm1pY3Jvc2Vjb25kIC8gMWU2CisgICAgICAgIHRzID0gaW50KHJvdW5kKHB0cyAqIDEwMDApKQorICAgICAgICBkdCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7IkB0eXBlIjogImc6RGF0ZSIsICJAdmFsdWUiOiB0c30pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkdCwgZGF0ZXRpbWUuZGF0ZXRpbWUpCisgICAgICAgICMgVElOS0VSUE9QLTE4NDgKKyAgICAgICAgYXNzZXJ0IGR0ID09IGV4cGVjdGVkCisKKyAgICBkZWYgdGVzdF90aW1lc3RhbXAoc2VsZik6CisgICAgICAgIGR0ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpUaW1lc3RhbXAiLCAiQHZhbHVlIjogMTQ4MTc1MDA3NjI5NX0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkdCwgdGltZXN0YW1wKQorICAgICAgICBhc3NlcnQgZmxvYXQoZHQpID09IDE0ODE3NTAwNzYuMjk1CisKKyAgICBkZWYgdGVzdF9kdXJhdGlvbihzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7IkB0eXBlIjogImd4OkR1cmF0aW9uIiwgIkB2YWx1ZSI6ICJQVDEyMEgifSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGQsIGRhdGV0aW1lLnRpbWVkZWx0YSkKKyAgICAgICAgYXNzZXJ0IGQgPT0gZGF0ZXRpbWUudGltZWRlbHRhKGhvdXJzPTEyMCkKKworICAgIGRlZiB0ZXN0X3V1aWQoc2VsZik6CisgICAgICAgIHByb3AgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAorICAgICAgICAgICAganNvbi5kdW1wcyh7J0B0eXBlJzogJ2c6VVVJRCcsICdAdmFsdWUnOiAiNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2In0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwcm9wLCB1dWlkLlVVSUQpCisgICAgICAgIGFzc2VydCBzdHIocHJvcCkgPT0gJzQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NicKKworICAgIGRlZiB0ZXN0X21ldHJpY3Moc2VsZik6CisgICAgICAgIHByb3AgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAorICAgICAgICAgICAganNvbi5kdW1wcyhbeydAdHlwZSc6ICdnOlRyYXZlcnNhbE1ldHJpY3MnLCAnQHZhbHVlJzogeydkdXInOiAxLjQ2ODU5NCwgJ21ldHJpY3MnOiBbCisgICAgICAgICAgICAgICAgeydAdHlwZSc6ICdnOk1ldHJpY3MnLCAnQHZhbHVlJzogeydkdXInOiAxLjM4MDk1NywgJ2NvdW50cyc6IHt9LCAnbmFtZSc6ICdHcmFwaFN0ZXAoX18uVigpKScsICdhbm5vdGF0aW9ucyc6IHsncGVyY2VudER1cic6IDk0LjAzMjU5MTcxNjk3NTU2fSwgJ2lkJzogJzQuMC4wKCknfX0sCisgICAgICAgICAgICAgICAgeydAdHlwZSc6ICdnOk1ldHJpY3MnLCAnQHZhbHVlJzogeydkdXInOiAwLjA4NzYzNywgJ2NvdW50cyc6IHt9LCAnbmFtZSc6ICdSZWZlcmVuY2VFbGVtZW50U3RlcCcsICdhbm5vdGF0aW9ucyc6IHsncGVyY2VudER1cic6IDUuOTY3NDA4MjgzMDI0NDQ0fSwgJ2lkJzogJzMuMC4wKCknfX0KKyAgICAgICAgICAgIF19fV0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwcm9wLCBsaXN0KQorICAgICAgICBhc3NlcnQgcHJvcCA9PSBbeydkdXInOiAxLjQ2ODU5NCwgJ21ldHJpY3MnOiBbCisgICAgICAgICAgICAgICAgeydkdXInOiAxLjM4MDk1NywgJ2NvdW50cyc6IHt9LCAnbmFtZSc6ICdHcmFwaFN0ZXAoX18uVigpKScsICdhbm5vdGF0aW9ucyc6IHsncGVyY2VudER1cic6IDk0LjAzMjU5MTcxNjk3NTU2fSwgJ2lkJzogJzQuMC4wKCknfSwKKyAgICAgICAgICAgICAgICB7J2R1cic6IDAuMDg3NjM3LCAnY291bnRzJzoge30sICduYW1lJzogJ1JlZmVyZW5jZUVsZW1lbnRTdGVwJywgJ2Fubm90YXRpb25zJzogeydwZXJjZW50RHVyJzogNS45Njc0MDgyODMwMjQ0NDR9LCAnaWQnOiAnMy4wLjAoKSd9CisgICAgICAgICAgICAgICAgXX1dCisKKyAgICBkZWYgdGVzdF9ieXRlYnVmZmVyKHNlbGYpOgorICAgICAgICBiYiA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCisgICAgICAgICAgICBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZ3g6Qnl0ZUJ1ZmZlciIsICJAdmFsdWUiOiAiYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxIn0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShiYiwgQnl0ZUJ1ZmZlclR5cGUpCisgICAgICAgIGFzc2VydCBCeXRlQnVmZmVyVHlwZSgiYzI5dFpTQmllWFJsY3lCbWIzSWdlVzkxIiwgInV0ZjgiKSA9PSBiYgorCisgICAgZGVmIHRlc3RfY2hhcihzZWxmKToKKyAgICAgICAgYyA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7IkB0eXBlIjogImd4OkNoYXIiLCAiQHZhbHVlIjogIkwifSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGMsIFNpbmdsZUNoYXIpCisgICAgICAgIGFzc2VydCBjaHIoNzYpID09IGMKKworICAgIGRlZiB0ZXN0X251bGwoc2VsZik6CisgICAgICAgIGMgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoTm9uZSkpCisgICAgICAgIGFzc2VydCBjIGlzIE5vbmUKKworCitjbGFzcyBUZXN0R3JhcGhTT05Xcml0ZXIob2JqZWN0KToKKyAgICBncmFwaHNvbl93cml0ZXIgPSBHcmFwaFNPTldyaXRlcigpCisgICAgZ3JhcGhzb25fcmVhZGVyID0gR3JhcGhTT05SZWFkZXIoKQorCisgICAgZGVmIHRlc3RfbnVtYmVycyhzZWxmKToKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6Qnl0ZSIsICJAdmFsdWUiOiAxfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGludC5fX25ld19fKFNpbmdsZUJ5dGUsIDEpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAyfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoMikpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IDg1MTQwMTk3MjU4NTEyMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChsb25nKDg1MTQwMTk3MjU4NTEyMikpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IC0yfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoLTIpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAtODUxNDAxOTcyNTg1MTIyfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoLTg1MTQwMTk3MjU4NTEyMikpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogLTF9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoLTEpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IDg1MTQwMTk3MjU4NTEyMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCg4NTE0MDE5NzI1ODUxMjIpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkRvdWJsZSIsICJAdmFsdWUiOiAzLjJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMy4yKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpEb3VibGUiLCAiQHZhbHVlIjogIk5hTiJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoZmxvYXQoJ25hbicpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpEb3VibGUiLCAiQHZhbHVlIjogIkluZmluaXR5In0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChmbG9hdCgnaW5mJykpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkRvdWJsZSIsICJAdmFsdWUiOiAiLUluZmluaXR5In0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChmbG9hdCgnLWluZicpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsICJAdmFsdWUiOiAiMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxIn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChEZWNpbWFsKCcxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEnKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLCAiQHZhbHVlIjogIk5hTiJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRGVjaW1hbCgnbmFuJykpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwgIkB2YWx1ZSI6ICJJbmZpbml0eSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRGVjaW1hbCgnaW5mJykpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwgIkB2YWx1ZSI6ICItSW5maW5pdHkifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KERlY2ltYWwoJy1pbmYnKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0ludGVnZXIiLCAiQHZhbHVlIjogIjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobG9uZygxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnSW50ZWdlciIsICJAdmFsdWUiOiAiMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxIn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEpKQorICAgICAgICBhc3NlcnQgIiIidHJ1ZSIiIiA9PSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChUcnVlKQorCisgICAgZGVmIHRlc3RfUChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0geydAdHlwZSc6ICdnOlAnLAorICAgICAgICAgICAgICAgICAgJ0B2YWx1ZSc6IHsKKyAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJzogJ2FuZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogW3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ2c6UCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdAdmFsdWUnOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJzogJ29yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IFt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ2c6UCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B2YWx1ZSc6IHsncHJlZGljYXRlJzogJ2x0JywgJ3ZhbHVlJzogJ2InfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J0B0eXBlJzogJ2c6UCcsICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6ICdndCcsICd2YWx1ZSc6ICdjJ319CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7J0B0eXBlJzogJ2c6UCcsICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6ICduZXEnLCAndmFsdWUnOiAnZCd9fV19fQorCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0ganNvbi5sb2FkcygKKyAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAubHQoImIiKS5vcl8oUC5ndCgiYyIpKS5hbmRfKFAubmVxKCJkIikpKSkKKworICAgICAgICByZXN1bHQgPSB7J0B0eXBlJzogJ2c6UCcsICdAdmFsdWUnOiB7J3ByZWRpY2F0ZSc6J3dpdGhpbicsJ3ZhbHVlJzogW3siQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfSx7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMn1dfX0KKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAud2l0aGluKFsxLCAyXSkpKQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC53aXRoaW4oMSwgMikpKQorCisgICAgICAgIHJlc3VsdCA9IHsnQHR5cGUnOiAnZzpQJywgJ0B2YWx1ZSc6IHsncHJlZGljYXRlJzond2l0aGluJywndmFsdWUnOiBbeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9XX19CisgICAgICAgIGFzc2VydCByZXN1bHQgPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQLndpdGhpbihbMV0pKSkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAud2l0aGluKDEpKSkKKworICAgIGRlZiB0ZXN0X3N0cmF0ZWdpZXMoc2VsZik6CisgICAgICAgICMgd2UgaGF2ZSBhIHByb3h5IG1vZGVsIGZvciBub3cgZ2l2ZW4gdGhhdCB3ZSBkb24ndCB3YW50IHRvIGhhdmUgdG8gaGF2ZSBnOlhYWCBhbGwgcmVnaXN0ZXJlZCBvbiB0aGUgR3JlbWxpbiB0cmF2ZXJzYWwgbWFjaGluZSAoeWV0KQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOlN1YmdyYXBoU3RyYXRlZ3kiLCAiQHZhbHVlIjoge319ID09IGpzb24ubG9hZHMoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChTdWJncmFwaFN0cmF0ZWd5KSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpTdWJncmFwaFN0cmF0ZWd5IiwgIkB2YWx1ZSI6IHsKKyAgICAgICAgICAgICJ2ZXJ0aWNlcyI6IHsiQHR5cGUiOiAiZzpCeXRlY29kZSIsICJAdmFsdWUiOiB7InN0ZXAiOiBbWyJoYXMiLCAibmFtZSIsICJtYXJrbyJdXX19fX0gPT0ganNvbi5sb2FkcygKKyAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFN1YmdyYXBoU3RyYXRlZ3kodmVydGljZXM9X18uaGFzKCJuYW1lIiwgIm1hcmtvIikpKSkKKworICAgIGRlZiB0ZXN0X2dyYXBoKHNlbGYpOgorICAgICAgICAjIFRPRE86IHRoaXMgYXNzZXJ0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggcHl0aG9uIDMgYW5kIG5vdyB0aGF0IHdlIHRlc3Qgd2l0aCBib3RoIDIgYW5kIDMgaXQgZmFpbHMKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpWZXJ0ZXgiLCAiQHZhbHVlIjogeyJpZCI6IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAxMn0sICJsYWJlbCI6ICJwZXJzb24ifX0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChWZXJ0ZXgobG9uZygxMiksICJwZXJzb24iKSkpCisKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpFZGdlIiwgIkB2YWx1ZSI6IHsiaWQiOiB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dFYiOiB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dFZMYWJlbCI6ICJwZXJzb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJrbm93cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluViI6IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5WTGFiZWwiOiAiZG9nIn19ID09IGpzb24ubG9hZHMoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChFZGdlKDcsIFZlcnRleCgwLCAicGVyc29uIiksICJrbm93cyIsIFZlcnRleCgxLCAiZG9nIikpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsICJAdmFsdWUiOiB7ImlkIjogImJsYWgiLCAibGFiZWwiOiAia2V5QSIsICJ2YWx1ZSI6IFRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0ZXgiOiAic3RlcGhlbiJ9fSA9PSBqc29uLmxvYWRzKAorICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVmVydGV4UHJvcGVydHkoImJsYWgiLCAia2V5QSIsIFRydWUsIFZlcnRleCgic3RlcGhlbiIpKSkpCisKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSI6IHsia2V5IjogIm5hbWUiLCAidmFsdWUiOiAibWFya28iLCAiZWxlbWVudCI6IHsiQHR5cGUiOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQHZhbHVlIjogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0ZXgiOiAidmVydGV4SWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxMjM0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiYUtleSJ9fX19ID09IGpzb24ubG9hZHMoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eSgibmFtZSIsICJtYXJrbyIsIFZlcnRleFByb3BlcnR5KDEyMzQsICJhS2V5IiwgMjEzNDUsIFZlcnRleCgidmVydGV4SWQiKSkpKSkKKworICAgICAgICB2ZXJ0ZXggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFZlcnRleCgxLCAicGVyc29uIikpKQorICAgICAgICBhc3NlcnQgMSA9PSB2ZXJ0ZXguaWQKKyAgICAgICAgYXNzZXJ0ICJwZXJzb24iID09IHZlcnRleC5sYWJlbAorCisgICAgICAgIGVkZ2UgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAorICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRWRnZSgzLCBWZXJ0ZXgoMSwgInBlcnNvbiIpLCAia25vd3MiLCBWZXJ0ZXgoMiwgImRvZyIpKSkpCisgICAgICAgIGFzc2VydCAia25vd3MiID09IGVkZ2UubGFiZWwKKyAgICAgICAgYXNzZXJ0IDMgPT0gZWRnZS5pZAorICAgICAgICBhc3NlcnQgMSA9PSBlZGdlLm91dFYuaWQKKyAgICAgICAgYXNzZXJ0IDIgPT0gZWRnZS5pblYuaWQKKworICAgICAgICB2ZXJ0ZXhfcHJvcGVydHkgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAorICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVmVydGV4UHJvcGVydHkoMSwgImFnZSIsIDMyLCBWZXJ0ZXgoMSkpKSkKKyAgICAgICAgYXNzZXJ0IDEgPT0gdmVydGV4X3Byb3BlcnR5LmlkCisgICAgICAgIGFzc2VydCAiYWdlIiA9PSB2ZXJ0ZXhfcHJvcGVydHkua2V5CisgICAgICAgIGFzc2VydCAzMiA9PSB2ZXJ0ZXhfcHJvcGVydHkudmFsdWUKKworICAgICAgICBwcm9wZXJ0eSA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUHJvcGVydHkoImFnZSIsIDMyLjIsIEVkZ2UoMSxWZXJ0ZXgoMiksImtub3dzIixWZXJ0ZXgoMykpKSkpCisgICAgICAgIGFzc2VydCAiYWdlIiA9PSBwcm9wZXJ0eS5rZXkKKyAgICAgICAgYXNzZXJ0IDMyLjIgPT0gcHJvcGVydHkudmFsdWUKKworICAgIGRlZiB0ZXN0X2N1c3RvbV9tYXBwaW5nKHNlbGYpOgorICAgICAgICAjIGV4dGVuZGVkIG1hcHBpbmcKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlcmRlcyA9IE1vY2soKQorICAgICAgICB3cml0ZXIgPSBHcmFwaFNPTldyaXRlcihzZXJpYWxpemVyX21hcD17WDogc2VyZGVzfSkKKyAgICAgICAgYXNzZXJ0IFggaW4gd3JpdGVyLnNlcmlhbGl6ZXJzCisKKyAgICAgICAgIyBiYXNlIGRpY3RzIGFyZSBub3QgbW9kaWZpZWQKKyAgICAgICAgYXNzZXJ0IFggbm90IGluIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYyZDAuX3NlcmlhbGl6ZXJzCisKKyAgICAgICAgb2JqID0gWCgpCisgICAgICAgIGQgPSB3cml0ZXIudG9EaWN0KG9iaikKKyAgICAgICAgc2VyZGVzLmRpY3RpZnkuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgob2JqLCB3cml0ZXIpCisgICAgICAgIGFzc2VydCBkIGlzIHNlcmRlcy5kaWN0aWZ5KCkKKworICAgICAgICAjIG92ZXJyaWRkZW4gbWFwcGluZworICAgICAgICBzZXJkZXMgPSBNb2NrKCkKKyAgICAgICAgd3JpdGVyID0gR3JhcGhTT05Xcml0ZXIoc2VyaWFsaXplcl9tYXA9e2ludDogc2VyZGVzfSkKKyAgICAgICAgYXNzZXJ0IGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYyZDAuX3NlcmlhbGl6ZXJzW2ludF0gaXMgbm90IHdyaXRlci5zZXJpYWxpemVyc1tpbnRdCisKKyAgICAgICAgdmFsdWUgPSAzCisgICAgICAgIGQgPSB3cml0ZXIudG9EaWN0KHZhbHVlKQorICAgICAgICBzZXJkZXMuZGljdGlmeS5hc3NlcnRfY2FsbGVkX29uY2Vfd2l0aCh2YWx1ZSwgd3JpdGVyKQorICAgICAgICBhc3NlcnQgZCBpcyBzZXJkZXMuZGljdGlmeSgpCisKKyAgICBkZWYgdGVzdF93cml0ZV9sb25nKHNlbGYpOgorICAgICAgICBtYXBwaW5nID0gc2VsZi5ncmFwaHNvbl93cml0ZXIudG9EaWN0KDEpCisgICAgICAgIGFzc2VydCBtYXBwaW5nWydAdHlwZSddID09ICdnOkludDMyJworICAgICAgICBhc3NlcnQgbWFwcGluZ1snQHZhbHVlJ10gPT0gMQorCisgICAgICAgIG1hcHBpbmcgPSBzZWxmLmdyYXBoc29uX3dyaXRlci50b0RpY3QobG9uZygxKSkKKyAgICAgICAgYXNzZXJ0IG1hcHBpbmdbJ0B0eXBlJ10gPT0gJ2c6SW50NjQnCisgICAgICAgIGFzc2VydCBtYXBwaW5nWydAdmFsdWUnXSA9PSAxCisKKyAgICBkZWYgdGVzdF9kYXRldGltZShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpEYXRlIiwgIkB2YWx1ZSI6IDE0ODE3NTAwNzYyOTV9LCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCisgICAgICAgIGR0ID0gZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCgxNDgxNzUwMDc2Mjk1IC8gMTAwMC4wKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChkdCkKKyAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOlRpbWVzdGFtcCIsICJAdmFsdWUiOiAxNDgxNzUwMDc2Mjk1fSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQorICAgICAgICB0cyA9IHRpbWVzdGFtcCgxNDgxNzUwMDc2Mjk1IC8gMTAwMC4wKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCh0cykKKyAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfZHVyYXRpb24oc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0ganNvbi5kdW1wcyh7IkB0eXBlIjogImd4OkR1cmF0aW9uIiwgIkB2YWx1ZSI6ICJQNUQifSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQorICAgICAgICBkID0gZGF0ZXRpbWUudGltZWRlbHRhKGhvdXJzPTEyMCkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoZCkKKyAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dAorCisgICAgZGVmIHRlc3RfdXVpZChzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsnQHR5cGUnOiAnZzpVVUlEJywgJ0B2YWx1ZSc6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYifSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQorICAgICAgICBwcm9wID0gdXVpZC5VVUlEKCI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChwcm9wKQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9ieXRlYnVmZmVyKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeydAdHlwZSc6ICdneDpCeXRlQnVmZmVyJywgJ0B2YWx1ZSc6ICdjMjl0WlNCaWVYUmxjeUJtYjNJZ2VXOTEnfSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQorICAgICAgICBiYiA9IEJ5dGVCdWZmZXJUeXBlKCJjMjl0WlNCaWVYUmxjeUJtYjNJZ2VXOTEiLCAidXRmOCIpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGJiKQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9jaGFyKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeydAdHlwZSc6ICdneDpDaGFyJywgJ0B2YWx1ZSc6ICdMJ30sIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKKyAgICAgICAgYyA9IHN0ci5fX25ld19fKFNpbmdsZUNoYXIsIGNocig3NikpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGMpCisgICAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBvdXRwdXQKKworCitjbGFzcyBUZXN0RnVuY3Rpb25hbEdyYXBoU09OSU8ob2JqZWN0KToKKyAgICAiIiJGdW5jdGlvbmFsIElPIHRlc3RzIiIiCisKKyAgICBkZWYgdGVzdF90aW1lc3RhbXAoc2VsZiwgcmVtb3RlX2Nvbm5lY3Rpb25fZ3JhcGhzb25WMik6CisgICAgICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb25fZ3JhcGhzb25WMikKKyAgICAgICAgdHMgPSB0aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDApCisgICAgICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ3RzJywgdHMpCisgICAgICAgIHJlc3AgPSByZXNwLnRvTGlzdCgpCisgICAgICAgIHZpZCA9IHJlc3BbMF0uaWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHNfcHJvcCA9IGcuVih2aWQpLnByb3BlcnRpZXMoJ3RzJykudG9MaXN0KClbMF0KKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRzX3Byb3AudmFsdWUsIHRpbWVzdGFtcCkKKyAgICAgICAgICAgIGFzc2VydCB0c19wcm9wLnZhbHVlID09IHRzCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiRXJyb3IgbWFraW5nIHJlcXVlc3QiCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBnLlYodmlkKS5kcm9wKCkuaXRlcmF0ZSgpCisKKyAgICBkZWYgdGVzdF9kYXRldGltZShzZWxmLCByZW1vdGVfY29ubmVjdGlvbl9ncmFwaHNvblYyKToKKyAgICAgICAgZyA9IEdyYXBoKCkudHJhdmVyc2FsKCkud2l0aFJlbW90ZShyZW1vdGVfY29ubmVjdGlvbl9ncmFwaHNvblYyKQorICAgICAgICBkdCA9IGRhdGV0aW1lLmRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAoMTQ4MTc1MDA3NjI5NSAvIDEwMDApCisgICAgICAgIHJlc3AgPSBnLmFkZFYoJ3Rlc3RfdmVydGV4JykucHJvcGVydHkoJ2R0JywgZHQpLnRvTGlzdCgpCisgICAgICAgIHZpZCA9IHJlc3BbMF0uaWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZHRfcHJvcCA9IGcuVih2aWQpLnByb3BlcnRpZXMoJ2R0JykudG9MaXN0KClbMF0KKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGR0X3Byb3AudmFsdWUsIGRhdGV0aW1lLmRhdGV0aW1lKQorICAgICAgICAgICAgYXNzZXJ0IGR0X3Byb3AudmFsdWUgPT0gZHQKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJFcnJvciBtYWtpbmcgcmVxdWVzdCIKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGcuVih2aWQpLmRyb3AoKS5pdGVyYXRlKCkKKworICAgIGRlZiB0ZXN0X3V1aWQoc2VsZiwgcmVtb3RlX2Nvbm5lY3Rpb25fZ3JhcGhzb25WMik6CisgICAgICAgIGcgPSBHcmFwaCgpLnRyYXZlcnNhbCgpLndpdGhSZW1vdGUocmVtb3RlX2Nvbm5lY3Rpb25fZ3JhcGhzb25WMikKKyAgICAgICAgdWlkID0gdXVpZC5VVUlEKCI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiKQorICAgICAgICByZXNwID0gZy5hZGRWKCd0ZXN0X3ZlcnRleCcpLnByb3BlcnR5KCd1dWlkJywgdWlkKS50b0xpc3QoKQorICAgICAgICB2aWQgPSByZXNwWzBdLmlkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVpZF9wcm9wID0gZy5WKHZpZCkucHJvcGVydGllcygndXVpZCcpLnRvTGlzdCgpWzBdCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh1aWRfcHJvcC52YWx1ZSwgdXVpZC5VVUlEKQorICAgICAgICAgICAgYXNzZXJ0IHVpZF9wcm9wLnZhbHVlID09IHVpZAorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIkVycm9yIG1ha2luZyByZXF1ZXN0IgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZy5WKHZpZCkuZHJvcCgpLml0ZXJhdGUoKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3N0cnVjdHVyZS9pby90ZXN0X2dyYXBoc29uVjNkMC5weSBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9ncmFwaHNvblYzZDAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhYTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3B5dGhvbi90ZXN0cy9zdHJ1Y3R1cmUvaW8vdGVzdF9ncmFwaHNvblYzZDAucHkKQEAgLTAsMCArMSw1MzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJworCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBjYWxlbmRhcgoraW1wb3J0IGpzb24KK2ltcG9ydCB1dWlkCitpbXBvcnQgbWF0aAorZnJvbSBkZWNpbWFsIGltcG9ydCAqCisKK2Zyb20gbW9jayBpbXBvcnQgTW9jaworCitmcm9tIGdyZW1saW5fcHl0aG9uLnN0YXRpY3MgaW1wb3J0ICoKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBWZXJ0ZXgsIEVkZ2UsIFByb3BlcnR5LCBWZXJ0ZXhQcm9wZXJ0eSwgR3JhcGgsIFBhdGgKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMCBpbXBvcnQgR3JhcGhTT05Xcml0ZXIsIEdyYXBoU09OUmVhZGVyLCBHcmFwaFNPTlV0aWwKK2ltcG9ydCBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WM2QwCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MudHJhdmVyc2FsIGltcG9ydCBQCitmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3Muc3RyYXRlZ2llcyBpbXBvcnQgU3ViZ3JhcGhTdHJhdGVneQorZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLmdyYXBoX3RyYXZlcnNhbCBpbXBvcnQgX18KKworCitjbGFzcyBUZXN0R3JhcGhTT05SZWFkZXIob2JqZWN0KToKKyAgICBncmFwaHNvbl9yZWFkZXIgPSBHcmFwaFNPTlJlYWRlcigpCisKKyAgICBkZWYgdGVzdF9jb2xsZWN0aW9ucyhzZWxmKToKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCisgICAgICAgICAgICBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZzpMaXN0IiwgIkB2YWx1ZSI6IFt7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyJdfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGxpc3QpCisgICAgICAgIGFzc2VydCB4WzBdID09IDEKKyAgICAgICAgYXNzZXJ0IHhbMV0gPT0gMgorICAgICAgICBhc3NlcnQgeFsyXSA9PSAiMyIKKyAgICAgICAgIyMKKworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKKyAgICAgICAgICAgIGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOlNldCIsICJAdmFsdWUiOiBbeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIl19KSkKKyAgICAgICAgIyByZXR1cm4gYSBzZXQgYXMgbm9ybWFsCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIHNldCkKKyAgICAgICAgYXNzZXJ0IHggPT0gc2V0KFsxLCAyLCAiMyJdKQorCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAorICAgICAgICAgICAganNvbi5kdW1wcyh7IkB0eXBlIjogImc6U2V0IiwgIkB2YWx1ZSI6IFt7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiQHR5cGUiOiAiZzpGbG9hdCIsICJAdmFsdWUiOiAyLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIl19KSkKKyAgICAgICAgIyBjb2VyY2UgdG8gbGlzdCBoZXJlIGJlY2F1c2UgSmF2YSBtaWdodCByZXR1cm4gbnVtZXJpY3Mgb2YgZGlmZmVyZW50IHR5cGVzIHdoaWNoIHB5dGhvbiB3b24ndCByZWNvZ25pemUKKyAgICAgICAgIyBzZWUgY29tbWVudHMgb2YgVElOS0VSUE9QLTE4NDQgZm9yIG1vcmUgZGV0YWlscworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBsaXN0KQorICAgICAgICBhc3NlcnQgeCA9PSBsaXN0KFsxLCAyLCAyLjAsICIzIl0pCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAorICAgICAgICAgICAganNvbi5kdW1wcyh7IkB0eXBlIjogImc6TWFwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJAdmFsdWUiOiBbJ2EnLCB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0sICdiJywgIm1hcmtvIl19KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZGljdCkKKyAgICAgICAgYXNzZXJ0IHhbJ2EnXSA9PSAxCisgICAgICAgIGFzc2VydCB4WydiJ10gPT0gIm1hcmtvIgorICAgICAgICBhc3NlcnQgbGVuKHgpID09IDIKKworICAgICAgICAjIEJ1bGtTZXQgZ2V0cyBjb2VyY2VkIHRvIGEgTGlzdCAtIGJvdGggaGF2ZSB0aGUgc2FtZSBiZWhhdmlvcgorICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKKyAgICAgICAgICAgIGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOkJ1bGtTZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkB2YWx1ZSI6IFsibWFya28iLCB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogMX0sICJqb3NoIiwgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IDN9XX0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBsaXN0KQorICAgICAgICBhc3NlcnQgbGVuKHgpID09IDQKKyAgICAgICAgYXNzZXJ0IHguY291bnQoIm1hcmtvIikgPT0gMQorICAgICAgICBhc3NlcnQgeC5jb3VudCgiam9zaCIpID09IDMKKworICAgIGRlZiB0ZXN0X251bWJlcl9pbnB1dChzZWxmKToKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZ3g6Qnl0ZSIsCisgICAgICAgICAgICAiQHZhbHVlIjogMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgU2luZ2xlQnl0ZSkKKyAgICAgICAgYXNzZXJ0IDEgPT0geAorICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJnOkludDMyIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAzMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgaW50KQorICAgICAgICBhc3NlcnQgMzEgPT0geAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAzMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgbG9uZykKKyAgICAgICAgYXNzZXJ0IGxvbmcoMzEpID09IHgKKyAgICAgICAgIyMKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZzpGbG9hdCIsCisgICAgICAgICAgICAiQHZhbHVlIjogMzEuMworICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCisgICAgICAgIGFzc2VydCAzMS4zID09IHgKKyAgICAgICAgIyMKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgIkB2YWx1ZSI6IDMxLjIKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGZsb2F0KQorICAgICAgICBhc3NlcnQgMzEuMiA9PSB4CisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiTmFOIgorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCisgICAgICAgIGFzc2VydCBtYXRoLmlzbmFuKHgpCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiSW5maW5pdHkiCisgICAgICAgIH0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBmbG9hdCkKKyAgICAgICAgYXNzZXJ0IG1hdGguaXNpbmYoeCkgYW5kIHggPiAwCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiLUluZmluaXR5IgorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZmxvYXQpCisgICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4IDwgMAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAzMS4yCisgICAgICAgIH0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBEZWNpbWFsKQorICAgICAgICBhc3NlcnQgRGVjaW1hbCgzMS4yKSA9PSB4CisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgIkB2YWx1ZSI6IDEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMQorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgRGVjaW1hbCkKKyAgICAgICAgYXNzZXJ0IERlY2ltYWwoJzEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMScpID09IHgKKyAgICAgICAgIyMKKyAgICAgICAgeCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsCisgICAgICAgICAgICAiQHZhbHVlIjogIk5hTiIKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCisgICAgICAgIGFzc2VydCBtYXRoLmlzbmFuKHgpCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLAorICAgICAgICAgICAgIkB2YWx1ZSI6ICJJbmZpbml0eSIKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIERlY2ltYWwpCisgICAgICAgIGFzc2VydCBtYXRoLmlzaW5mKHgpIGFuZCB4ID4gMAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAiLUluZmluaXR5IgorICAgICAgICB9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgRGVjaW1hbCkKKyAgICAgICAgYXNzZXJ0IG1hdGguaXNpbmYoeCkgYW5kIHggPCAwCisgICAgICAgICMjCisgICAgICAgIHggPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeworICAgICAgICAgICAgIkB0eXBlIjogImd4OkJpZ0ludGVnZXIiLAorICAgICAgICAgICAgIkB2YWx1ZSI6IDMxCisgICAgICAgIH0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh4LCBsb25nKQorICAgICAgICBhc3NlcnQgMzEgPT0geAorICAgICAgICAjIworICAgICAgICB4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICJAdHlwZSI6ICJneDpCaWdJbnRlZ2VyIiwKKyAgICAgICAgICAgICJAdmFsdWUiOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKKyAgICAgICAgfSkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIGxvbmcpCisgICAgICAgIGFzc2VydCAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEgPT0geAorCisgICAgZGVmIHRlc3RfZ3JhcGgoc2VsZik6CisgICAgICAgIHZlcnRleCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoIiIiCisgICAgICAgIHsiQHR5cGUiOiJnOlZlcnRleCIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoxfSwibGFiZWwiOiJwZXJzb24iLCJvdXRFIjp7ImNyZWF0ZWQiOlt7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6OX0sImluViI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjN9LCJwcm9wZXJ0aWVzIjp7IndlaWdodCI6eyJAdHlwZSI6Imc6RG91YmxlIiwiQHZhbHVlIjowLjR9fX1dLCJrbm93cyI6W3siaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjo3fSwiaW5WIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6Mn0sInByb3BlcnRpZXMiOnsid2VpZ2h0Ijp7IkB0eXBlIjoiZzpEb3VibGUiLCJAdmFsdWUiOjAuNX19fSx7ImlkIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6OH0sImluViI6eyJAdHlwZSI6Imc6SW50MzIiLCJAdmFsdWUiOjR9LCJwcm9wZXJ0aWVzIjp7IndlaWdodCI6eyJAdHlwZSI6Imc6RG91YmxlIiwiQHZhbHVlIjoxLjB9fX1dfSwicHJvcGVydGllcyI6eyJuYW1lIjpbeyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjB9LCJ2YWx1ZSI6Im1hcmtvIn1dLCJhZ2UiOlt7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MX0sInZhbHVlIjp7IkB0eXBlIjoiZzpJbnQzMiIsIkB2YWx1ZSI6Mjl9fV19fX0iIiIpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZlcnRleCwgVmVydGV4KQorICAgICAgICBhc3NlcnQgInBlcnNvbiIgPT0gdmVydGV4LmxhYmVsCisgICAgICAgIGFzc2VydCAxID09IHZlcnRleC5pZAorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXguaWQsIGludCkKKyAgICAgICAgYXNzZXJ0IHZlcnRleCA9PSBWZXJ0ZXgoMSkKKyAgICAgICAgIyMKKyAgICAgICAgdmVydGV4ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKKyAgICAgICAgeyJAdHlwZSI6Imc6VmVydGV4IiwgIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6RmxvYXQiLCJAdmFsdWUiOjQ1LjIzfX19IiIiKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXgsIFZlcnRleCkKKyAgICAgICAgYXNzZXJ0IDQ1LjIzID09IHZlcnRleC5pZAorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXguaWQsIEZsb2F0VHlwZSkKKyAgICAgICAgYXNzZXJ0ICJ2ZXJ0ZXgiID09IHZlcnRleC5sYWJlbAorICAgICAgICBhc3NlcnQgdmVydGV4ID09IFZlcnRleCg0NS4yMykKKyAgICAgICAgIyMKKyAgICAgICAgdmVydGV4X3Byb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgiIiIKKyAgICAgICAgeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCAiQHZhbHVlIjp7ImlkIjoiYW5JZCIsImxhYmVsIjoiYUtleSIsInZhbHVlIjp0cnVlLCJ2ZXJ0ZXgiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjo5fX19IiIiKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXhfcHJvcGVydHksIFZlcnRleFByb3BlcnR5KQorICAgICAgICBhc3NlcnQgImFuSWQiID09IHZlcnRleF9wcm9wZXJ0eS5pZAorICAgICAgICBhc3NlcnQgImFLZXkiID09IHZlcnRleF9wcm9wZXJ0eS5sYWJlbAorICAgICAgICBhc3NlcnQgdmVydGV4X3Byb3BlcnR5LnZhbHVlCisgICAgICAgIGFzc2VydCB2ZXJ0ZXhfcHJvcGVydHkudmVydGV4ID09IFZlcnRleCg5KQorICAgICAgICAjIworICAgICAgICB2ZXJ0ZXhfcHJvcGVydHkgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgorICAgICAgICB7IkB0eXBlIjoiZzpWZXJ0ZXhQcm9wZXJ0eSIsICJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoxfSwibGFiZWwiOiJuYW1lIiwidmFsdWUiOiJtYXJrbyJ9fSIiIikKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmVydGV4X3Byb3BlcnR5LCBWZXJ0ZXhQcm9wZXJ0eSkKKyAgICAgICAgYXNzZXJ0IDEgPT0gdmVydGV4X3Byb3BlcnR5LmlkCisgICAgICAgIGFzc2VydCAibmFtZSIgPT0gdmVydGV4X3Byb3BlcnR5LmxhYmVsCisgICAgICAgIGFzc2VydCAibWFya28iID09IHZlcnRleF9wcm9wZXJ0eS52YWx1ZQorICAgICAgICBhc3NlcnQgdmVydGV4X3Byb3BlcnR5LnZlcnRleCBpcyBOb25lCisgICAgICAgICMjCisgICAgICAgIGVkZ2UgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgorICAgICAgICB7IkB0eXBlIjoiZzpFZGdlIiwgIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjE3fSwibGFiZWwiOiJrbm93cyIsImluViI6IngiLCJvdXRWIjoieSIsImluVkxhYmVsIjoieExhYiIsInByb3BlcnRpZXMiOnsiYUtleSI6ImFWYWx1ZSIsImJLZXkiOnRydWV9fX0iIiIpCisgICAgICAgICMgcHJpbnQgZWRnZQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlZGdlLCBFZGdlKQorICAgICAgICBhc3NlcnQgMTcgPT0gZWRnZS5pZAorICAgICAgICBhc3NlcnQgImtub3dzIiA9PSBlZGdlLmxhYmVsCisgICAgICAgIGFzc2VydCBlZGdlLmluViA9PSBWZXJ0ZXgoIngiLCAieExhYmVsIikKKyAgICAgICAgYXNzZXJ0IGVkZ2Uub3V0ViA9PSBWZXJ0ZXgoInkiLCAidmVydGV4IikKKyAgICAgICAgIyMKKyAgICAgICAgcHJvcGVydHkgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KCIiIgorICAgICAgICB7IkB0eXBlIjoiZzpQcm9wZXJ0eSIsICJAdmFsdWUiOnsia2V5IjoiYUtleSIsInZhbHVlIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MTd9LCJlbGVtZW50Ijp7IkB0eXBlIjoiZzpFZGdlIiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6MTIyfSwibGFiZWwiOiJrbm93cyIsImluViI6IngiLCJvdXRWIjoieSIsImluVkxhYmVsIjoieExhYiJ9fX19IiIiKQorICAgICAgICAjIHByaW50IHByb3BlcnR5CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHByb3BlcnR5LCBQcm9wZXJ0eSkKKyAgICAgICAgYXNzZXJ0ICJhS2V5IiA9PSBwcm9wZXJ0eS5rZXkKKyAgICAgICAgYXNzZXJ0IDE3ID09IHByb3BlcnR5LnZhbHVlCisgICAgICAgIGFzc2VydCBFZGdlKDEyMiwgVmVydGV4KCJ4IiksICJrbm93cyIsIFZlcnRleCgieSIpKSA9PSBwcm9wZXJ0eS5lbGVtZW50CisKKyAgICBkZWYgdGVzdF9wYXRoKHNlbGYpOgorICAgICAgICBwYXRoID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKKyAgICAgICAgICAgICIiInsiQHR5cGUiOiJnOlBhdGgiLCJAdmFsdWUiOnsibGFiZWxzIjp7IkB0eXBlIjoiZzpMaXN0IiwiQHZhbHVlIjpbeyJAdHlwZSI6Imc6U2V0IiwiQHZhbHVlIjpbImEiXX0seyJAdHlwZSI6Imc6U2V0IiwiQHZhbHVlIjpbImIiLCJjIl19LHsiQHR5cGUiOiJnOlNldCIsIkB2YWx1ZSI6W119XX0sIm9iamVjdHMiOnsiQHR5cGUiOiJnOkxpc3QiLCJAdmFsdWUiOlt7IkB0eXBlIjoiZzpWZXJ0ZXgiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoxfSwibGFiZWwiOiJwZXJzb24iLCJwcm9wZXJ0aWVzIjp7Im5hbWUiOlt7IkB0eXBlIjoiZzpWZXJ0ZXhQcm9wZXJ0eSIsIkB2YWx1ZSI6eyJpZCI6eyJAdHlwZSI6Imc6SW50NjQiLCJAdmFsdWUiOjB9LCJ2YWx1ZSI6Im1hcmtvIiwibGFiZWwiOiJuYW1lIn19XSwiYWdlIjpbeyJAdHlwZSI6Imc6VmVydGV4UHJvcGVydHkiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDY0IiwiQHZhbHVlIjoxfSwidmFsdWUiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjoyOX0sImxhYmVsIjoiYWdlIn19XX19fSx7IkB0eXBlIjoiZzpWZXJ0ZXgiLCJAdmFsdWUiOnsiaWQiOnsiQHR5cGUiOiJnOkludDMyIiwiQHZhbHVlIjozfSwibGFiZWwiOiJzb2Z0d2FyZSIsInByb3BlcnRpZXMiOnsibmFtZSI6W3siQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6NH0sInZhbHVlIjoibG9wIiwibGFiZWwiOiJuYW1lIn19XSwibGFuZyI6W3siQHR5cGUiOiJnOlZlcnRleFByb3BlcnR5IiwiQHZhbHVlIjp7ImlkIjp7IkB0eXBlIjoiZzpJbnQ2NCIsIkB2YWx1ZSI6NX0sInZhbHVlIjoiamF2YSIsImxhYmVsIjoibGFuZyJ9fV19fX0sImxvcCJdfX19IiIiCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocGF0aCwgUGF0aCkKKyAgICAgICAgYXNzZXJ0ICJwYXRoW3ZbMV0sIHZbM10sIGxvcF0iID09IHN0cihwYXRoKQorICAgICAgICBhc3NlcnQgVmVydGV4KDEpID09IHBhdGhbMF0KKyAgICAgICAgYXNzZXJ0IFZlcnRleCgxKSA9PSBwYXRoWyJhIl0KKyAgICAgICAgYXNzZXJ0ICJsb3AiID09IHBhdGhbMl0KKyAgICAgICAgYXNzZXJ0IDMgPT0gbGVuKHBhdGgpCisKKyAgICBkZWYgdGVzdF9jdXN0b21fbWFwcGluZyhzZWxmKToKKworICAgICAgICAjIGV4dGVuZGVkIG1hcHBpbmcKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHR5cGVfc3RyaW5nID0gInRlc3Q6WHR5cGUiCisgICAgICAgIG92ZXJyaWRlX3N0cmluZyA9ICJnOkludDY0IgorICAgICAgICBzZXJkZXMgPSBNb2NrKCkKKworICAgICAgICByZWFkZXIgPSBHcmFwaFNPTlJlYWRlcihkZXNlcmlhbGl6ZXJfbWFwPXt0eXBlX3N0cmluZzogc2VyZGVzfSkKKyAgICAgICAgYXNzZXJ0IHR5cGVfc3RyaW5nIGluIHJlYWRlci5kZXNlcmlhbGl6ZXJzCisKKyAgICAgICAgIyBiYXNlIGRpY3RzIGFyZSBub3QgbW9kaWZpZWQKKyAgICAgICAgYXNzZXJ0IHR5cGVfc3RyaW5nIG5vdCBpbiBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WM2QwLl9kZXNlcmlhbGl6ZXJzCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBvID0gcmVhZGVyLnRvT2JqZWN0KHtHcmFwaFNPTlV0aWwuVFlQRV9LRVk6IHR5cGVfc3RyaW5nLCBHcmFwaFNPTlV0aWwuVkFMVUVfS0VZOiB4fSkKKyAgICAgICAgc2VyZGVzLm9iamVjdGlmeS5hc3NlcnRfY2FsbGVkX29uY2Vfd2l0aCh4LCByZWFkZXIpCisgICAgICAgIGFzc2VydCBvIGlzIHNlcmRlcy5vYmplY3RpZnkoKQorCisgICAgICAgICMgb3ZlcnJpZGRlbiBtYXBwaW5nCisgICAgICAgIHR5cGVfc3RyaW5nID0gImc6SW50NjQiCisgICAgICAgIHNlcmRlcyA9IE1vY2soKQorICAgICAgICByZWFkZXIgPSBHcmFwaFNPTlJlYWRlcihkZXNlcmlhbGl6ZXJfbWFwPXt0eXBlX3N0cmluZzogc2VyZGVzLCBvdmVycmlkZV9zdHJpbmc6IHNlcmRlc30pCisgICAgICAgIGFzc2VydCBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WM2QwLl9kZXNlcmlhbGl6ZXJzW3R5cGVfc3RyaW5nXSBpcyBub3QgcmVhZGVyLmRlc2VyaWFsaXplcnNbCisgICAgICAgICAgICB0eXBlX3N0cmluZ10KKworICAgICAgICB2YWx1ZSA9IDMKKyAgICAgICAgbyA9IHJlYWRlci50b09iamVjdCh7R3JhcGhTT05VdGlsLlRZUEVfS0VZOiB0eXBlX3N0cmluZywgR3JhcGhTT05VdGlsLlZBTFVFX0tFWTogdmFsdWV9KQorICAgICAgICBzZXJkZXMub2JqZWN0aWZ5LmFzc2VydF9jYWxsZWRfb25jZV93aXRoKHZhbHVlLCByZWFkZXIpCisgICAgICAgIGFzc2VydCBvIGlzIHNlcmRlcy5vYmplY3RpZnkoKQorCisgICAgZGVmIHRlc3RfZGF0ZXRpbWUoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxNiwgMTIsIDE0LCAxNiwgMTQsIDM2LCAyOTUwMDApCisgICAgICAgIHB0cyA9IGNhbGVuZGFyLnRpbWVnbShleHBlY3RlZC51dGN0aW1ldHVwbGUoKSkgKyBleHBlY3RlZC5taWNyb3NlY29uZCAvIDFlNgorICAgICAgICB0cyA9IGludChyb3VuZChwdHMgKiAxMDAwKSkKKyAgICAgICAgZHQgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOkRhdGUiLCAiQHZhbHVlIjogdHN9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZHQsIGRhdGV0aW1lLmRhdGV0aW1lKQorICAgICAgICAjIFRJTktFUlBPUC0xODQ4CisgICAgICAgIGFzc2VydCBkdCA9PSBleHBlY3RlZAorCisgICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBkdCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoanNvbi5kdW1wcyh7IkB0eXBlIjogImc6VGltZXN0YW1wIiwgIkB2YWx1ZSI6IDE0ODE3NTAwNzYyOTV9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZHQsIHRpbWVzdGFtcCkKKyAgICAgICAgYXNzZXJ0IGZsb2F0KGR0KSA9PSAxNDgxNzUwMDc2LjI5NQorCisgICAgZGVmIHRlc3RfZHVyYXRpb24oc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeyJAdHlwZSI6ICJneDpEdXJhdGlvbiIsICJAdmFsdWUiOiAiUFQxMjBIIn0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkLCBkYXRldGltZS50aW1lZGVsdGEpCisgICAgICAgIGFzc2VydCBkID09IGRhdGV0aW1lLnRpbWVkZWx0YShob3Vycz0xMjApCisKKyAgICBkZWYgdGVzdF91dWlkKHNlbGYpOgorICAgICAgICBwcm9wID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKKyAgICAgICAgICAgIGpzb24uZHVtcHMoeydAdHlwZSc6ICdnOlVVSUQnLCAnQHZhbHVlJzogIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiJ9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocHJvcCwgdXVpZC5VVUlEKQorICAgICAgICBhc3NlcnQgc3RyKHByb3ApID09ICc0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYnCisKKyAgICBkZWYgdGVzdF9tZXRyaWNzKHNlbGYpOgorICAgICAgICBwcm9wID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCgKKyAgICAgICAgICAgIGpzb24uZHVtcHMoW3snQHR5cGUnOiAnZzpUcmF2ZXJzYWxNZXRyaWNzJywgJ0B2YWx1ZSc6IHsnZHVyJzogMS40Njg1OTQsICdtZXRyaWNzJzogWworICAgICAgICAgICAgICAgIHsnQHR5cGUnOiAnZzpNZXRyaWNzJywgJ0B2YWx1ZSc6IHsnZHVyJzogMS4zODA5NTcsICdjb3VudHMnOiB7fSwgJ25hbWUnOiAnR3JhcGhTdGVwKF9fLlYoKSknLCAnYW5ub3RhdGlvbnMnOiB7J3BlcmNlbnREdXInOiA5NC4wMzI1OTE3MTY5NzU1Nn0sICdpZCc6ICc0LjAuMCgpJ319LAorICAgICAgICAgICAgICAgIHsnQHR5cGUnOiAnZzpNZXRyaWNzJywgJ0B2YWx1ZSc6IHsnZHVyJzogMC4wODc2MzcsICdjb3VudHMnOiB7fSwgJ25hbWUnOiAnUmVmZXJlbmNlRWxlbWVudFN0ZXAnLCAnYW5ub3RhdGlvbnMnOiB7J3BlcmNlbnREdXInOiA1Ljk2NzQwODI4MzAyNDQ0NH0sICdpZCc6ICczLjAuMCgpJ319CisgICAgICAgICAgICBdfX1dKSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocHJvcCwgbGlzdCkKKyAgICAgICAgYXNzZXJ0IHByb3AgPT0gW3snZHVyJzogMS40Njg1OTQsICdtZXRyaWNzJzogWworICAgICAgICAgICAgICAgIHsnZHVyJzogMS4zODA5NTcsICdjb3VudHMnOiB7fSwgJ25hbWUnOiAnR3JhcGhTdGVwKF9fLlYoKSknLCAnYW5ub3RhdGlvbnMnOiB7J3BlcmNlbnREdXInOiA5NC4wMzI1OTE3MTY5NzU1Nn0sICdpZCc6ICc0LjAuMCgpJ30sCisgICAgICAgICAgICAgICAgeydkdXInOiAwLjA4NzYzNywgJ2NvdW50cyc6IHt9LCAnbmFtZSc6ICdSZWZlcmVuY2VFbGVtZW50U3RlcCcsICdhbm5vdGF0aW9ucyc6IHsncGVyY2VudER1cic6IDUuOTY3NDA4MjgzMDI0NDQ0fSwgJ2lkJzogJzMuMC4wKCknfQorICAgICAgICAgICAgICAgIF19XQorCisgICAgZGVmIHRlc3RfYnl0ZWJ1ZmZlcihzZWxmKToKKyAgICAgICAgYmIgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KAorICAgICAgICAgICAganNvbi5kdW1wcyh7IkB0eXBlIjogImd4OkJ5dGVCdWZmZXIiLCAiQHZhbHVlIjogImMyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSJ9KSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYmIsIEJ5dGVCdWZmZXJUeXBlKQorICAgICAgICBhc3NlcnQgQnl0ZUJ1ZmZlclR5cGUoImMyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSIsICJ1dGY4IikgPT0gYmIKKworICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6CisgICAgICAgIGMgPSBzZWxmLmdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KGpzb24uZHVtcHMoeyJAdHlwZSI6ICJneDpDaGFyIiwgIkB2YWx1ZSI6ICJMIn0pKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjLCBTaW5nbGVDaGFyKQorICAgICAgICBhc3NlcnQgY2hyKDc2KSA9PSBjCisKKyAgICBkZWYgdGVzdF9udWxsKHNlbGYpOgorICAgICAgICBjID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChqc29uLmR1bXBzKE5vbmUpKQorICAgICAgICBhc3NlcnQgYyBpcyBOb25lCisKKworY2xhc3MgVGVzdEdyYXBoU09OV3JpdGVyKG9iamVjdCk6CisgICAgZ3JhcGhzb25fd3JpdGVyID0gR3JhcGhTT05Xcml0ZXIoKQorICAgIGdyYXBoc29uX3JlYWRlciA9IEdyYXBoU09OUmVhZGVyKCkKKworICAgIGRlZiB0ZXN0X2NvbGxlY3Rpb25zKHNlbGYpOgorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkxpc3QiLCAiQHZhbHVlIjogW3siQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDN9XX0gPT0ganNvbi5sb2FkcygKKyAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFsxLCAyLCAzXSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6U2V0IiwgIkB2YWx1ZSI6IFt7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogM31dfSA9PSBqc29uLmxvYWRzKAorICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3Qoc2V0KFsxLCAyLCAzLCAzXSkpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOk1hcCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSI6IFsnYScsIHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfV19ID09IGpzb24ubG9hZHMoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCh7J2EnOiAxfSkpCisKKyAgICBkZWYgdGVzdF9udW1iZXJzKHNlbGYpOgorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCeXRlIiwgIkB2YWx1ZSI6IDF9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoaW50Ll9fbmV3X18oU2luZ2xlQnl0ZSwgMSkpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IDJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobG9uZygyKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogODUxNDAxOTcyNTg1MTIyfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxvbmcoODUxNDAxOTcyNTg1MTIyKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogLTJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobG9uZygtMikpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkludDY0IiwgIkB2YWx1ZSI6IC04NTE0MDE5NzI1ODUxMjJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobG9uZygtODUxNDAxOTcyNTg1MTIyKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50MzIiLCAiQHZhbHVlIjogMX0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgxKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAtMX0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgtMSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6SW50NjQiLCAiQHZhbHVlIjogODUxNDAxOTcyNTg1MTIyfSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KDg1MTQwMTk3MjU4NTEyMikpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6RG91YmxlIiwgIkB2YWx1ZSI6IDMuMn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgzLjIpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkRvdWJsZSIsICJAdmFsdWUiOiAiTmFOIn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChmbG9hdCgnbmFuJykpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkRvdWJsZSIsICJAdmFsdWUiOiAiSW5maW5pdHkifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGZsb2F0KCdpbmYnKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6RG91YmxlIiwgIkB2YWx1ZSI6ICItSW5maW5pdHkifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGZsb2F0KCctaW5mJykpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdEZWNpbWFsIiwgIkB2YWx1ZSI6ICIxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KERlY2ltYWwoJzEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMScpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnRGVjaW1hbCIsICJAdmFsdWUiOiAiTmFOIn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChEZWNpbWFsKCduYW4nKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLCAiQHZhbHVlIjogIkluZmluaXR5In0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChEZWNpbWFsKCdpbmYnKSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImd4OkJpZ0RlY2ltYWwiLCAiQHZhbHVlIjogIi1JbmZpbml0eSJ9ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoRGVjaW1hbCgnLWluZicpKSkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZ3g6QmlnSW50ZWdlciIsICJAdmFsdWUiOiAiMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5OTg3NjU0MzIxIn0gPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChsb25nKDEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMSkpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJneDpCaWdJbnRlZ2VyIiwgIkB2YWx1ZSI6ICIxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEifSA9PSBqc29uLmxvYWRzKHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KDEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTk4NzY1NDMyMSkpCisgICAgICAgIGFzc2VydCAiIiJ0cnVlIiIiID09IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFRydWUpCisKKyAgICBkZWYgdGVzdF9QKHNlbGYpOgorICAgICAgICByZXN1bHQgPSB7J0B0eXBlJzogJ2c6UCcsCisgICAgICAgICAgICAgICAgICAnQHZhbHVlJzogeworICAgICAgICAgICAgICAgICAgICAgICdwcmVkaWNhdGUnOiAnYW5kJywKKyAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBbeworICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnZzpQJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B2YWx1ZSc6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVkaWNhdGUnOiAnb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogW3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnZzpQJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHZhbHVlJzogeydwcmVkaWNhdGUnOiAnbHQnLCAndmFsdWUnOiAnYid9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnQHR5cGUnOiAnZzpQJywgJ0B2YWx1ZSc6IHsncHJlZGljYXRlJzogJ2d0JywgJ3ZhbHVlJzogJ2MnfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsnQHR5cGUnOiAnZzpQJywgJ0B2YWx1ZSc6IHsncHJlZGljYXRlJzogJ25lcScsICd2YWx1ZSc6ICdkJ319XX19CisKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBqc29uLmxvYWRzKAorICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC5sdCgiYiIpLm9yXyhQLmd0KCJjIikpLmFuZF8oUC5uZXEoImQiKSkpKQorCisgICAgICAgIHJlc3VsdCA9IHsnQHR5cGUnOiAnZzpQJywgJ0B2YWx1ZSc6IHsncHJlZGljYXRlJzogJ3dpdGhpbicsICd2YWx1ZSc6IHsnQHR5cGUnOiAnZzpMaXN0JywgJ0B2YWx1ZSc6IFsKKyAgICAgICAgICAgIHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAxfSwgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDJ9XX19fQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC53aXRoaW4oWzEsIDJdKSkpCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQLndpdGhpbigxLCAyKSkpCisKKyAgICAgICAgcmVzdWx0ID0geydAdHlwZSc6ICdnOlAnLCAnQHZhbHVlJzogeydwcmVkaWNhdGUnOiAnd2l0aGluJywgJ3ZhbHVlJzogeydAdHlwZSc6ICdnOkxpc3QnLCAnQHZhbHVlJzogWworICAgICAgICAgICAgeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9XX19fQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGpzb24ubG9hZHMoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC53aXRoaW4oWzFdKSkpCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0ganNvbi5sb2FkcyhzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQLndpdGhpbigxKSkpCisKKyAgICBkZWYgdGVzdF9zdHJhdGVnaWVzKHNlbGYpOgorICAgICAgICAjIHdlIGhhdmUgYSBwcm94eSBtb2RlbCBmb3Igbm93IGdpdmVuIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvIGhhdmUgZzpYWFggYWxsIHJlZ2lzdGVyZWQgb24gdGhlIAorICAgICAgICAjIEdyZW1saW4gdHJhdmVyc2FsIG1hY2hpbmUgKHlldCkKKyAgICAgICAgYXNzZXJ0IHsiQHR5cGUiOiAiZzpTdWJncmFwaFN0cmF0ZWd5IiwgIkB2YWx1ZSI6IHt9fSA9PSBqc29uLmxvYWRzKAorICAgICAgICAgICAgc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoU3ViZ3JhcGhTdHJhdGVneSkpCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6U3ViZ3JhcGhTdHJhdGVneSIsICJAdmFsdWUiOiB7CisgICAgICAgICAgICAidmVydGljZXMiOiB7IkB0eXBlIjogImc6Qnl0ZWNvZGUiLCAiQHZhbHVlIjogeyJzdGVwIjogW1siaGFzIiwgIm5hbWUiLCAibWFya28iXV19fX19ID09IGpzb24ubG9hZHMoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChTdWJncmFwaFN0cmF0ZWd5KHZlcnRpY2VzPV9fLmhhcygibmFtZSIsICJtYXJrbyIpKSkpCisKKyAgICBkZWYgdGVzdF9ncmFwaChzZWxmKToKKyAgICAgICAgIyBUT0RPOiB0aGlzIGFzc2VydCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHB5dGhvbiAzIGFuZCBub3cgdGhhdCB3ZSB0ZXN0IHdpdGggYm90aCAyIGFuZCAzIGl0IGZhaWxzCisgICAgICAgIGFzc2VydCB7IkB0eXBlIjogImc6VmVydGV4IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIjogeyJpZCI6IHsiQHR5cGUiOiAiZzpJbnQ2NCIsICJAdmFsdWUiOiAxMn0sICJsYWJlbCI6ICJwZXJzb24ifX0gPT0ganNvbi5sb2FkcygKKyAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFZlcnRleChsb25nKDEyKSwgInBlcnNvbiIpKSkKKworICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOkVkZ2UiLCAiQHZhbHVlIjogeyJpZCI6IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiA3fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0ViI6IHsiQHR5cGUiOiAiZzpJbnQzMiIsICJAdmFsdWUiOiAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0VkxhYmVsIjogInBlcnNvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogImtub3dzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5WIjogeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpblZMYWJlbCI6ICJkb2cifX0gPT0ganNvbi5sb2FkcygKKyAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KEVkZ2UoNywgVmVydGV4KDAsICJwZXJzb24iKSwgImtub3dzIiwgVmVydGV4KDEsICJkb2ciKSkpKQorICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOlZlcnRleFByb3BlcnR5IiwgIkB2YWx1ZSI6IHsiaWQiOiAiYmxhaCIsICJsYWJlbCI6ICJrZXlBIiwgInZhbHVlIjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnRleCI6ICJzdGVwaGVuIn19ID09IGpzb24ubG9hZHMoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChWZXJ0ZXhQcm9wZXJ0eSgiYmxhaCIsICJrZXlBIiwgVHJ1ZSwgVmVydGV4KCJzdGVwaGVuIikpKSkKKworICAgICAgICBhc3NlcnQgeyJAdHlwZSI6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIjogeyJrZXkiOiAibmFtZSIsICJ2YWx1ZSI6ICJtYXJrbyIsICJlbGVtZW50IjogeyJAdHlwZSI6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAdmFsdWUiOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnRleCI6ICJ2ZXJ0ZXhJZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogeyJAdHlwZSI6ICJnOkludDMyIiwgIkB2YWx1ZSI6IDEyMzR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJhS2V5In19fX0gPT0ganNvbi5sb2FkcygKKyAgICAgICAgICAgIHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KAorICAgICAgICAgICAgICAgIFByb3BlcnR5KCJuYW1lIiwgIm1hcmtvIiwgVmVydGV4UHJvcGVydHkoMTIzNCwgImFLZXkiLCAyMTM0NSwgVmVydGV4KCJ2ZXJ0ZXhJZCIpKSkpKQorCisgICAgICAgIHZlcnRleCA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3Qoc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVmVydGV4KDEsICJwZXJzb24iKSkpCisgICAgICAgIGFzc2VydCAxID09IHZlcnRleC5pZAorICAgICAgICBhc3NlcnQgInBlcnNvbiIgPT0gdmVydGV4LmxhYmVsCisKKyAgICAgICAgZWRnZSA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChFZGdlKDMsIFZlcnRleCgxLCAicGVyc29uIiksICJrbm93cyIsIFZlcnRleCgyLCAiZG9nIikpKSkKKyAgICAgICAgYXNzZXJ0ICJrbm93cyIgPT0gZWRnZS5sYWJlbAorICAgICAgICBhc3NlcnQgMyA9PSBlZGdlLmlkCisgICAgICAgIGFzc2VydCAxID09IGVkZ2Uub3V0Vi5pZAorICAgICAgICBhc3NlcnQgMiA9PSBlZGdlLmluVi5pZAorCisgICAgICAgIHZlcnRleF9wcm9wZXJ0eSA9IHNlbGYuZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoCisgICAgICAgICAgICBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChWZXJ0ZXhQcm9wZXJ0eSgxLCAiYWdlIiwgMzIsIFZlcnRleCgxKSkpKQorICAgICAgICBhc3NlcnQgMSA9PSB2ZXJ0ZXhfcHJvcGVydHkuaWQKKyAgICAgICAgYXNzZXJ0ICJhZ2UiID09IHZlcnRleF9wcm9wZXJ0eS5rZXkKKyAgICAgICAgYXNzZXJ0IDMyID09IHZlcnRleF9wcm9wZXJ0eS52YWx1ZQorCisgICAgICAgIHByb3BlcnR5ID0gc2VsZi5ncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdChzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQcm9wZXJ0eSgiYWdlIiwgMzIuMiwgRWRnZSgxLFZlcnRleCgyKSwia25vd3MiLFZlcnRleCgzKSkpKSkKKyAgICAgICAgYXNzZXJ0ICJhZ2UiID09IHByb3BlcnR5LmtleQorICAgICAgICBhc3NlcnQgMzIuMiA9PSBwcm9wZXJ0eS52YWx1ZQorCisgICAgZGVmIHRlc3RfY3VzdG9tX21hcHBpbmcoc2VsZik6CisgICAgICAgICMgZXh0ZW5kZWQgbWFwcGluZworICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VyZGVzID0gTW9jaygpCisgICAgICAgIHdyaXRlciA9IEdyYXBoU09OV3JpdGVyKHNlcmlhbGl6ZXJfbWFwPXtYOiBzZXJkZXN9KQorICAgICAgICBhc3NlcnQgWCBpbiB3cml0ZXIuc2VyaWFsaXplcnMKKworICAgICAgICAjIGJhc2UgZGljdHMgYXJlIG5vdCBtb2RpZmllZAorICAgICAgICBhc3NlcnQgWCBub3QgaW4gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMC5fc2VyaWFsaXplcnMKKworICAgICAgICBvYmogPSBYKCkKKyAgICAgICAgZCA9IHdyaXRlci50b0RpY3Qob2JqKQorICAgICAgICBzZXJkZXMuZGljdGlmeS5hc3NlcnRfY2FsbGVkX29uY2Vfd2l0aChvYmosIHdyaXRlcikKKyAgICAgICAgYXNzZXJ0IGQgaXMgc2VyZGVzLmRpY3RpZnkoKQorCisgICAgICAgICMgb3ZlcnJpZGRlbiBtYXBwaW5nCisgICAgICAgIHNlcmRlcyA9IE1vY2soKQorICAgICAgICB3cml0ZXIgPSBHcmFwaFNPTldyaXRlcihzZXJpYWxpemVyX21hcD17aW50OiBzZXJkZXN9KQorICAgICAgICBhc3NlcnQgZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMC5fc2VyaWFsaXplcnNbaW50XSBpcyBub3Qgd3JpdGVyLnNlcmlhbGl6ZXJzW2ludF0KKworICAgICAgICB2YWx1ZSA9IDMKKyAgICAgICAgZCA9IHdyaXRlci50b0RpY3QodmFsdWUpCisgICAgICAgIHNlcmRlcy5kaWN0aWZ5LmFzc2VydF9jYWxsZWRfb25jZV93aXRoKHZhbHVlLCB3cml0ZXIpCisgICAgICAgIGFzc2VydCBkIGlzIHNlcmRlcy5kaWN0aWZ5KCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX2xvbmcoc2VsZik6CisgICAgICAgIG1hcHBpbmcgPSBzZWxmLmdyYXBoc29uX3dyaXRlci50b0RpY3QoMSkKKyAgICAgICAgYXNzZXJ0IG1hcHBpbmdbJ0B0eXBlJ10gPT0gJ2c6SW50MzInCisgICAgICAgIGFzc2VydCBtYXBwaW5nWydAdmFsdWUnXSA9PSAxCisKKyAgICAgICAgbWFwcGluZyA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLnRvRGljdChsb25nKDEpKQorICAgICAgICBhc3NlcnQgbWFwcGluZ1snQHR5cGUnXSA9PSAnZzpJbnQ2NCcKKyAgICAgICAgYXNzZXJ0IG1hcHBpbmdbJ0B2YWx1ZSddID09IDEKKworICAgIGRlZiB0ZXN0X2RhdGV0aW1lKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeyJAdHlwZSI6ICJnOkRhdGUiLCAiQHZhbHVlIjogMTQ4MTc1MDA3NjI5NX0sIHNlcGFyYXRvcnM9KCcsJywgJzonKSkKKyAgICAgICAgZHQgPSBkYXRldGltZS5kYXRldGltZS51dGNmcm9tdGltZXN0YW1wKDE0ODE3NTAwNzYyOTUgLyAxMDAwLjApCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGR0KQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF90aW1lc3RhbXAoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0ganNvbi5kdW1wcyh7IkB0eXBlIjogImc6VGltZXN0YW1wIiwgIkB2YWx1ZSI6IDE0ODE3NTAwNzYyOTV9LCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCisgICAgICAgIHRzID0gdGltZXN0YW1wKDE0ODE3NTAwNzYyOTUgLyAxMDAwLjApCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KHRzKQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF9kdXJhdGlvbihzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSBqc29uLmR1bXBzKHsiQHR5cGUiOiAiZ3g6RHVyYXRpb24iLCAiQHZhbHVlIjogIlA1RCJ9LCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCisgICAgICAgIGQgPSBkYXRldGltZS50aW1lZGVsdGEoaG91cnM9MTIwKQorICAgICAgICBvdXRwdXQgPSBzZWxmLmdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChkKQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gb3V0cHV0CisKKyAgICBkZWYgdGVzdF91dWlkKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IGpzb24uZHVtcHMoeydAdHlwZSc6ICdnOlVVSUQnLCAnQHZhbHVlJzogIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiJ9LCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCisgICAgICAgIHByb3AgPSB1dWlkLlVVSUQoIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiIpCisgICAgICAgIG91dHB1dCA9IHNlbGYuZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KHByb3ApCisgICAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2J5dGVidWZmZXIoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0ganNvbi5kdW1wcyh7J0B0eXBlJzogJ2d4OkJ5dGVCdWZmZXInLCAnQHZhbHVlJzogJ2MyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSd9LCBzZXBhcmF0b3JzPSgnLCcsICc6JykpCisgICAgICAgIGJiID0gQnl0ZUJ1ZmZlclR5cGUoImMyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSIsICJ1dGY4IikKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoYmIpCisgICAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBvdXRwdXQKKworICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0ganNvbi5kdW1wcyh7J0B0eXBlJzogJ2d4OkNoYXInLCAnQHZhbHVlJzogJ0wnfSwgc2VwYXJhdG9ycz0oJywnLCAnOicpKQorICAgICAgICBjID0gc3RyLl9fbmV3X18oU2luZ2xlQ2hhciwgY2hyKDc2KSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoYykKKyAgICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IG91dHB1dApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3N0cnVjdHVyZS90ZXN0X2dyYXBoLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3N0cnVjdHVyZS90ZXN0X2dyYXBoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzdlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9weXRob24vdGVzdHMvc3RydWN0dXJlL3Rlc3RfZ3JhcGgucHkKQEAgLTAsMCArMSwxMTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworX19hdXRob3JfXyA9ICdNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pJworCitmcm9tIGdyZW1saW5fcHl0aG9uLnN0YXRpY3MgaW1wb3J0IGxvbmcKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBFZGdlCitmcm9tIGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5ncmFwaCBpbXBvcnQgUHJvcGVydHkKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBWZXJ0ZXgKK2Zyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBWZXJ0ZXhQcm9wZXJ0eQorZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFBhdGgKKworCitjbGFzcyBUZXN0R3JhcGgob2JqZWN0KToKKyAgICBkZWYgdGVzdF9ncmFwaF9vYmplY3RzKHNlbGYpOgorICAgICAgICB2ZXJ0ZXggPSBWZXJ0ZXgoMSkKKyAgICAgICAgYXNzZXJ0ICJ2WzFdIiA9PSBzdHIodmVydGV4KQorICAgICAgICBhc3NlcnQgInZlcnRleCIgPT0gdmVydGV4LmxhYmVsCisgICAgICAgIGFzc2VydCAicGVyc29uIiA9PSBWZXJ0ZXgoMSwgInBlcnNvbiIpLmxhYmVsCisgICAgICAgIGFzc2VydCB2ZXJ0ZXggPT0gVmVydGV4KDEpCisgICAgICAgICMKKyAgICAgICAgZWRnZSA9IEVkZ2UoMiwgVmVydGV4KDEpLCAic2FpZCIsIFZlcnRleCgiaGVsbG8iLCAicGhyYXNlIikpCisgICAgICAgIGFzc2VydCAiZVsyXVsxLXNhaWQtPmhlbGxvXSIgPT0gc3RyKGVkZ2UpCisgICAgICAgIGFzc2VydCBWZXJ0ZXgoMSkgPT0gZWRnZS5vdXRWCisgICAgICAgIGFzc2VydCBWZXJ0ZXgoImhlbGxvIikgPT0gZWRnZS5pblYKKyAgICAgICAgYXNzZXJ0ICJzYWlkIiA9PSBlZGdlLmxhYmVsCisgICAgICAgIGFzc2VydCAicGhyYXNlIiA9PSBlZGdlLmluVi5sYWJlbAorICAgICAgICBhc3NlcnQgZWRnZS5pblYgIT0gZWRnZS5vdXRWCisgICAgICAgICMKKyAgICAgICAgdmVydGV4X3Byb3BlcnR5ID0gVmVydGV4UHJvcGVydHkobG9uZygyNCksICJuYW1lIiwgIm1hcmtvIiwgVmVydGV4KDEpKQorICAgICAgICBhc3NlcnQgInZwW25hbWUtPm1hcmtvXSIgPT0gc3RyKHZlcnRleF9wcm9wZXJ0eSkKKyAgICAgICAgYXNzZXJ0ICJuYW1lIiA9PSB2ZXJ0ZXhfcHJvcGVydHkubGFiZWwKKyAgICAgICAgYXNzZXJ0ICJuYW1lIiA9PSB2ZXJ0ZXhfcHJvcGVydHkua2V5CisgICAgICAgIGFzc2VydCAibWFya28iID09IHZlcnRleF9wcm9wZXJ0eS52YWx1ZQorICAgICAgICBhc3NlcnQgbG9uZygyNCkgPT0gdmVydGV4X3Byb3BlcnR5LmlkCisgICAgICAgIGFzc2VydCBWZXJ0ZXgoMSkgPT0gdmVydGV4X3Byb3BlcnR5LnZlcnRleAorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2ZXJ0ZXhfcHJvcGVydHkuaWQsIGxvbmcpCisgICAgICAgIGFzc2VydCB2ZXJ0ZXhfcHJvcGVydHkgPT0gVmVydGV4UHJvcGVydHkobG9uZygyNCksICJuYW1lIiwgIm1hcmtvIiwgVmVydGV4KDEpKQorICAgICAgICAjCisgICAgICAgIHByb3BlcnR5ID0gUHJvcGVydHkoImFnZSIsIDI5LCBWZXJ0ZXgoMSkpCisgICAgICAgIGFzc2VydCAicFthZ2UtPjI5XSIgPT0gc3RyKHByb3BlcnR5KQorICAgICAgICBhc3NlcnQgImFnZSIgPT0gcHJvcGVydHkua2V5CisgICAgICAgIGFzc2VydCAyOSA9PSBwcm9wZXJ0eS52YWx1ZQorICAgICAgICBhc3NlcnQgVmVydGV4KDEpID09IHByb3BlcnR5LmVsZW1lbnQKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocHJvcGVydHkudmFsdWUsIGludCkKKyAgICAgICAgYXNzZXJ0IHByb3BlcnR5ID09IFByb3BlcnR5KCJhZ2UiLCAyOSwgVmVydGV4KDEpKQorICAgICAgICAjCisgICAgICAgIGZvciBpIGluIFt2ZXJ0ZXgsIGVkZ2UsIHZlcnRleF9wcm9wZXJ0eSwgcHJvcGVydHldOgorICAgICAgICAgICAgZm9yIGogaW4gW3ZlcnRleCwgZWRnZSwgdmVydGV4X3Byb3BlcnR5LCBwcm9wZXJ0eV06CisgICAgICAgICAgICAgICAgaWYgdHlwZShpKSAhPSB0eXBlKGopOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaSAhPSBqCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGkgPT0gagorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaS5fX2hhc2hfXygpID09IGhhc2goaSkKKworICAgIGRlZiB0ZXN0X3BhdGgoc2VsZik6CisgICAgICAgIHBhdGggPSBQYXRoKFtzZXQoWyJhIiwgImIiXSksIHNldChbImMiLCAiYiJdKSwgc2V0KFtdKV0sIFsxLCBWZXJ0ZXgoMSksICJoZWxsbyJdKQorICAgICAgICBhc3NlcnQgInBhdGhbMSwgdlsxXSwgaGVsbG9dIiA9PSBzdHIocGF0aCkKKyAgICAgICAgYXNzZXJ0IDEgPT0gcGF0aFsiYSJdCisgICAgICAgIGFzc2VydCBWZXJ0ZXgoMSkgPT0gcGF0aFsiYyJdCisgICAgICAgIGFzc2VydCBbMSwgVmVydGV4KDEpXSA9PSBwYXRoWyJiIl0KKyAgICAgICAgYXNzZXJ0IHBhdGhbMF0gPT0gMQorICAgICAgICBhc3NlcnQgcGF0aFsxXSA9PSBWZXJ0ZXgoMSkKKyAgICAgICAgYXNzZXJ0IHBhdGhbMl0gPT0gImhlbGxvIgorICAgICAgICBhc3NlcnQgMyA9PSBsZW4ocGF0aCkKKyAgICAgICAgYXNzZXJ0ICJoZWxsbyIgaW4gcGF0aAorICAgICAgICBhc3NlcnQgImdvb2RieWUiIG5vdCBpbiBwYXRoCisgICAgICAgIGFzc2VydCBWZXJ0ZXgoMSkgaW4gcGF0aAorICAgICAgICBhc3NlcnQgVmVydGV4KDEyMykgbm90IGluIHBhdGgKKyAgICAgICAgIworICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZW1wID0gcGF0aFszXQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJBY2Nlc3NpbmcgYmV5b25kIHRoZSBsaXN0IGluZGV4IHNob3VsZCB0aHJvdyBhbiBpbmRleCBlcnJvciIpCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlbXAgPSBwYXRoWyJ6eiJdCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkFjY2Vzc2luZyBub3RoaW5nIHNob3VsZCB0aHJvdyBhIGtleSBlcnJvciIpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIworICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZW1wID0gcGF0aFsxOjJdCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkFjY2Vzc2luZyB1c2luZyBzbGljZXMgc2hvdWxkIHRocm93IGEgdHlwZSBlcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMKKyAgICAgICAgYXNzZXJ0IHBhdGggPT0gcGF0aAorICAgICAgICBhc3NlcnQgaGFzaChwYXRoKSA9PSBoYXNoKHBhdGgpCisgICAgICAgIHBhdGgyID0gUGF0aChbc2V0KFsiYSIsICJiIl0pLCBzZXQoWyJjIiwgImIiXSksIHNldChbXSldLCBbMSwgVmVydGV4KDEpLCAiaGVsbG8iXSkKKyAgICAgICAgYXNzZXJ0IHBhdGggPT0gcGF0aDIKKyAgICAgICAgYXNzZXJ0IGhhc2gocGF0aCkgPT0gaGFzaChwYXRoMikKKyAgICAgICAgYXNzZXJ0IHBhdGggIT0gUGF0aChbc2V0KFsiYSJdKSwgc2V0KFsiYyIsICJiIl0pLCBzZXQoW10pXSwgWzEsIFZlcnRleCgxKSwgImhlbGxvIl0pCisgICAgICAgIGFzc2VydCBwYXRoICE9IFBhdGgoW3NldChbImEiLCAiYiJdKSwgc2V0KFsiYyIsICJiIl0pLCBzZXQoW10pXSwgWzMsIFZlcnRleCgxKSwgImhlbGxvIl0pCmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvbWFpbi9qeXRob24vdGVzdHMvdGVzdF9zdGF0aWNzLnB5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3Rlc3Rfc3RhdGljcy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ3JlbWxpbi1weXRob24vc3JjL21haW4vanl0aG9uL3Rlc3RzL3Rlc3Rfc3RhdGljcy5weQpyZW5hbWUgdG8gZ3JlbWxpbi1weXRob24vc3JjL21haW4vcHl0aG9uL3Rlc3RzL3Rlc3Rfc3RhdGljcy5weQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGRhMTAyLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lRmFjdG9yeQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMKLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jICB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzLkdyZW1saW5KeXRob25TY3JpcHRFbmdpbmVGYWN0b3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkdyZW1saW5TY3JpcHRFbmdpbmVGYWN0b3J5IGIvZ3JlbWxpbi1weXRob24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkdyZW1saW5TY3JpcHRFbmdpbmVGYWN0b3J5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY0ODI1Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5HcmVtbGluU2NyaXB0RW5naW5lRmFjdG9yeQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHl0aG9uLmpzcjIyMy5HcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lRmFjdG9yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL0dyZW1saW5KeXRob25TY3JpcHRFbmdpbmVUZXN0LmphdmEgYi9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9HcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzRlNWJjLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL0dyZW1saW5KeXRob25TY3JpcHRFbmdpbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5qc3IyMjM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5EZWZhdWx0R3JlbWxpblNjcmlwdEVuZ2luZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuR3JlbWxpblNjcmlwdEVuZ2luZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5TYWNrRnVuY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleFByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmU7Ci1pbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OwotaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jc0luc3RhbmNlT2YuaW5zdGFuY2VPZjsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1ASWdub3JlCi1wdWJsaWMgY2xhc3MgR3JlbWxpbkp5dGhvblNjcmlwdEVuZ2luZVRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRHZXRFbmdpbmVCeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU2NyaXB0RW5naW5lIGVuZ2luZSA9IG5ldyBEZWZhdWx0R3JlbWxpblNjcmlwdEVuZ2luZU1hbmFnZXIoKS5nZXRFbmdpbmVCeU5hbWUoImdyZW1saW4tanl0aG9uIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5naW5lKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbmdpbmUgaW5zdGFuY2VvZiBHcmVtbGluSnl0aG9uU2NyaXB0RW5naW5lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGVuZ2luZS5ldmFsKCIxKzIiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRIYXZlQ29yZUltcG9ydHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU2NyaXB0RW5naW5lIGVuZ2luZSA9IG5ldyBEZWZhdWx0R3JlbWxpblNjcmlwdEVuZ2luZU1hbmFnZXIoKS5nZXRFbmdpbmVCeU5hbWUoImdyZW1saW4tanl0aG9uIik7Ci0gICAgICAgIGFzc2VydFRoYXQoZW5naW5lLmV2YWwoIkdyYXBoIiksIGluc3RhbmNlT2YoQ2xhc3MuY2xhc3MpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChlbmdpbmUuZXZhbCgiX18iKSwgaW5zdGFuY2VPZihDbGFzcy5jbGFzcykpOwotICAgICAgICBhc3NlcnRUaGF0KGVuZ2luZS5ldmFsKCJUIiksIGluc3RhbmNlT2YoQ2xhc3MuY2xhc3MpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChlbmdpbmUuZXZhbCgibGFiZWwiKSwgaW5zdGFuY2VPZihULmNsYXNzKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoZW5naW5lLmV2YWwoIlQubGFiZWwiKSwgaW5zdGFuY2VPZihULmNsYXNzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTYWNrRnVuY3Rpb25zLkJhcnJpZXIuY2xhc3MsIGVuZ2luZS5ldmFsKCJCYXJyaWVyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Fja0Z1bmN0aW9ucy5CYXJyaWVyLm5vcm1TYWNrLCBlbmdpbmUuZXZhbCgiQmFycmllci5ub3JtU2FjayIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENvbHVtbi5jbGFzcywgZW5naW5lLmV2YWwoIkNvbHVtbiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENvbHVtbi52YWx1ZXMsIGVuZ2luZS5ldmFsKCJDb2x1bW4udmFsdWVPZihcJ3ZhbHVlc1wnKSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LmNsYXNzLCBlbmdpbmUuZXZhbCgiQ2FyZGluYWxpdHkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5zaW5nbGUsIGVuZ2luZS5ldmFsKCJDYXJkaW5hbGl0eS52YWx1ZU9mKFwnc2luZ2xlXCcpIikpOwotICAgICAgICBhc3NlcnRUcnVlKGVuZ2luZS5ldmFsKCJvdXQoKSIpIGluc3RhbmNlb2YgR3JhcGhUcmF2ZXJzYWwpOwotICAgICAgICBhc3NlcnRUcnVlKGVuZ2luZS5ldmFsKCJfXy5vdXQoKSIpIGluc3RhbmNlb2YgR3JhcGhUcmF2ZXJzYWwpOwotICAgICAgICBhc3NlcnRUcnVlKGVuZ2luZS5ldmFsKCJfXy5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5zaW5nbGUsICduYW1lJywnbWFya28nKSIpIGluc3RhbmNlb2YgR3JhcGhUcmF2ZXJzYWwpOwotICAgICAgICBhc3NlcnRUcnVlKGVuZ2luZS5ldmFsKCJfXy5wcm9wZXJ0eShDYXJkaW5hbGl0eS5zaW5nbGUsICduYW1lJywnbWFya28nKSIpIGluc3RhbmNlb2YgR3JhcGhUcmF2ZXJzYWwpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRTdXBwb3J0SmF2YUJhc2VkR3JhcGhUcmF2ZXJzYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU2NyaXB0RW5naW5lIGVuZ2luZSA9IG5ldyBEZWZhdWx0R3JlbWxpblNjcmlwdEVuZ2luZU1hbmFnZXIoKS5nZXRFbmdpbmVCeU5hbWUoImdyZW1saW4tanl0aG9uIik7Ci0gICAgICAgIGVuZ2luZS5nZXRCaW5kaW5ncyhTY3JpcHRDb250ZXh0LkVOR0lORV9TQ09QRSkucHV0KCJncmFwaCIsIFRpbmtlckZhY3RvcnkuY3JlYXRlTW9kZXJuKCkpOwotICAgICAgICBlbmdpbmUuZXZhbCgiZyA9IGdyYXBoLnRyYXZlcnNhbCgpIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoInJpcHBsZSIsICJsb3AiKSksIGVuZ2luZS5ldmFsKCJnLlYoKS5yZXBlYXQob3V0KCkpLnRpbWVzKDIpLnZhbHVlcygnbmFtZScpLnRvU2V0KCkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoInJpcHBsZSIsICJsb3AiKSksIGVuZ2luZS5ldmFsKCJnLlYoKS5yZXBlYXQoX18ub3V0KCkpLnRpbWVzKDIpLnZhbHVlcygnbmFtZScpLnRvU2V0KCkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoInJpcHBsZSIsICJsb3AiKSksIGVuZ2luZS5ldmFsKCJnLlYoKS5yZXBlYXQob3V0KCkpLnRpbWVzKDIpLm5hbWUudG9TZXQoKSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgicmlwcGxlIiwgImxvcCIpKSwgZW5naW5lLmV2YWwoImcuVigpLnJlcGVhdChfXy5vdXQoKSkudGltZXMoMikubmFtZS50b1NldCgpIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJyaXBwbGUiLCAibG9wIikpLCBlbmdpbmUuZXZhbCgiZy5WKCkucmVwZWF0KF9fLm91dCgpKS50aW1lcygyKVswOjJdLm5hbWUudG9TZXQoKSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgicmlwcGxlIiwgImxvcCIpKSwgZW5naW5lLmV2YWwoImcuVigpLnJlcGVhdChfXy5vdXQoKSkudGltZXMoMikubmFtZVswOjNdLnRvU2V0KCkiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRTdXBwb3J0U3VnYXJNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFNjcmlwdEVuZ2luZSBlbmdpbmUgPSBuZXcgRGVmYXVsdEdyZW1saW5TY3JpcHRFbmdpbmVNYW5hZ2VyKCkuZ2V0RW5naW5lQnlOYW1lKCJncmVtbGluLWp5dGhvbiIpOwotICAgICAgICBlbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dCgiZ3JhcGgiLCBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpKTsKLSAgICAgICAgZW5naW5lLmV2YWwoImcgPSBncmFwaC50cmF2ZXJzYWwoKSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJyaXBwbGUiLCAibG9wIikpLCBlbmdpbmUuZXZhbCgiZy5WKCkucmVwZWF0KF9fLm91dCgpKS50aW1lcygyKVswOjJdLm5hbWUudG9TZXQoKSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgicmlwcGxlIiwgImxvcCIpKSwgZW5naW5lLmV2YWwoImcuVigpLnJlcGVhdChfXy5vdXQoKSkudGltZXMoMikubmFtZVswOjNdLnRvU2V0KCkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIGVuZ2luZS5ldmFsKCJnLlYoKS5yZXBlYXQoX18ub3V0KCkpLnRpbWVzKDIpLm5hbWVbMDoxXS5jb3VudCgpLm5leHQoKSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSwgZW5naW5lLmV2YWwoImcuVigpLnJlcGVhdChfXy5vdXQoKSkudGltZXMoMikubmFtZVswXS5jb3VudCgpLm5leHQoKSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigwKSwgZW5naW5lLmV2YWwoImcuVigpLnJlcGVhdChfXy5vdXQoKSkudGltZXMoMikubmFtZVszXS5jb3VudCgpLm5leHQoKSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9KeXRob25TY3JpcHRFbmdpbmVTZXR1cC5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvSnl0aG9uU2NyaXB0RW5naW5lU2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiZDhjNC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9KeXRob25TY3JpcHRFbmdpbmVTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5qc3IyMjM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5TY3JpcHRFbmdpbmVDYWNoZTsKLWltcG9ydCBvcmcucHl0aG9uLmpzcjIyMy5QeVNjcmlwdEVuZ2luZTsKLQotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBKeXRob25TY3JpcHRFbmdpbmVTZXR1cCB7Ci0KLSAgICBwcml2YXRlIEp5dGhvblNjcmlwdEVuZ2luZVNldHVwKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHsKLSAgICAgICAgc2V0dXAoKFB5U2NyaXB0RW5naW5lKSBTY3JpcHRFbmdpbmVDYWNoZS5nZXQoImp5dGhvbiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFB5U2NyaXB0RW5naW5lIHNldHVwKGZpbmFsIFB5U2NyaXB0RW5naW5lIGp5dGhvbkVuZ2luZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImltcG9ydCBncmVtbGluX3B5dGhvbi5zdGF0aWNzIik7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZnJvbSBncmVtbGluX3B5dGhvbi5wcm9jZXNzLnRyYXZlcnNhbCBpbXBvcnQgKiIpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy5ncmFwaF90cmF2ZXJzYWwgaW1wb3J0ICoiKTsKLSAgICAgICAgICAgIGp5dGhvbkVuZ2luZS5ldmFsKCJmcm9tIGdyZW1saW5fcHl0aG9uLnByb2Nlc3MuZ3JhcGhfdHJhdmVyc2FsIGltcG9ydCBfXyIpOwotICAgICAgICAgICAgLy8ganl0aG9uRW5naW5lLmV2YWwoImZyb20gZ3JlbWxpbl9weXRob24uZHJpdmVyLmRyaXZlcl9yZW1vdGVfY29ubmVjdGlvbiBpbXBvcnQgRHJpdmVyUmVtb3RlQ29ubmVjdGlvbiIpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImZyb20gZ3JlbWxpbl9weXRob24ucHJvY2Vzcy50cmF2ZXJzYWwgaW1wb3J0IEJ5dGVjb2RlIik7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IEdyYXBoIik7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFZlcnRleCIpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImZyb20gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmdyYXBoIGltcG9ydCBFZGdlIik7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFZlcnRleFByb3BlcnR5Iik7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZnJvbSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuZ3JhcGggaW1wb3J0IFByb3BlcnR5Iik7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiaW1wb3J0IGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYyZDAiKTsKLSAgICAgICAgICAgIGp5dGhvbkVuZ2luZS5ldmFsKCJpbXBvcnQgZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjNkMCIpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uVjJkMF9yZWFkZXIgPSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WMmQwLkdyYXBoU09OUmVhZGVyKCkiKTsKLSAgICAgICAgICAgIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvblYyZDBfd3JpdGVyID0gZ3JlbWxpbl9weXRob24uc3RydWN0dXJlLmlvLmdyYXBoc29uVjJkMC5HcmFwaFNPTldyaXRlcigpIik7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25WM2QwX3JlYWRlciA9IGdyZW1saW5fcHl0aG9uLnN0cnVjdHVyZS5pby5ncmFwaHNvblYzZDAuR3JhcGhTT05SZWFkZXIoKSIpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uVjNkMF93cml0ZXIgPSBncmVtbGluX3B5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb25WM2QwLkdyYXBoU09OV3JpdGVyKCkiKTsKLSAgICAgICAgICAgIHJldHVybiBqeXRob25FbmdpbmU7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNjcmlwdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL0p5dGhvblRyYW5zbGF0b3JUZXN0LmphdmEgYi9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9KeXRob25UcmFuc2xhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTliMzFhLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL0p5dGhvblRyYW5zbGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5qc3IyMjM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXzsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU3ViZ3JhcGhTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uVHJhbnNsYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LnZlcmlmaWNhdGlvbi5SZWFkT25seVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5mdW5jdGlvbi5MYW1iZGE7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX18uaGFzTGFiZWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQotICovCi1wdWJsaWMgY2xhc3MgSnl0aG9uVHJhbnNsYXRvclRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRTdXBwb3J0U3RyaW5nU3VwcGxpZXJMYW1iZGFzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpLnRyYXZlcnNhbCgpOwotICAgICAgICBnID0gZy53aXRoU3RyYXRlZ2llcyhuZXcgVHJhbnNsYXRpb25TdHJhdGVneShnLCBKeXRob25UcmFuc2xhdG9yLm9mKCJnIiksIGZhbHNlKSk7Ci0gICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsLkFkbWluPFZlcnRleCwgSW50ZWdlcj4gdCA9IGcud2l0aFNpZGVFZmZlY3QoImxlbmd0aFN1bSIsIDApLndpdGhTYWNrKDEpCi0gICAgICAgICAgICAgICAgLlYoKQotICAgICAgICAgICAgICAgIC5maWx0ZXIoTGFtYmRhLnByZWRpY2F0ZSgieCA6IHguZ2V0KCkubGFiZWwoKSA9PSAncGVyc29uJyIpKQotICAgICAgICAgICAgICAgIC5mbGF0TWFwKExhbWJkYS5mdW5jdGlvbigibGFtYmRhIHggOiB4LmdldCgpLnZlcnRpY2VzKERpcmVjdGlvbi5PVVQpIikpCi0gICAgICAgICAgICAgICAgLm1hcChMYW1iZGEuPFRyYXZlcnNlcjxPYmplY3Q+LCBJbnRlZ2VyPmZ1bmN0aW9uKCJsYW1iZGEgeCA6IGxlbih4LmdldCgpLnZhbHVlKCduYW1lJykpIikpCi0gICAgICAgICAgICAgICAgLnNpZGVFZmZlY3QoTGFtYmRhLmNvbnN1bWVyKCIgeCA6IHguc2lkZUVmZmVjdHMoXCJsZW5ndGhTdW1cIiwgeC5zaWRlRWZmZWN0cygnbGVuZ3RoU3VtJykgKyB4LmdldCgpKSAgICAiKSkKLSAgICAgICAgICAgICAgICAub3JkZXIoKS5ieShMYW1iZGEuY29tcGFyYXRvcigiICBsYW1iZGEgYSxiIDogMCBpZiBhID09IGIgZWxzZSAxIGlmIGEgPiBiIGVsc2UgLTEiKSkKLSAgICAgICAgICAgICAgICAuc2FjayhMYW1iZGEuYmlGdW5jdGlvbigibGFtYmRhIGEsYiA6IGEgKyBiIikpCi0gICAgICAgICAgICAgICAgLmFzQWRtaW4oKTsKLSAgICAgICAgZmluYWwgTGlzdDxJbnRlZ2VyPiBzYWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGxlbmd0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgd2hpbGUgKHQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBUcmF2ZXJzZXIuQWRtaW48SW50ZWdlcj4gdHJhdmVyc2VyID0gdC5uZXh0VHJhdmVyc2VyKCk7Ci0gICAgICAgICAgICBzYWNrcy5hZGQodHJhdmVyc2VyLnNhY2soKSk7Ci0gICAgICAgICAgICBsZW5ndGhzLmFkZCh0cmF2ZXJzZXIuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEZhbHNlKHQuaGFzTmV4dCgpKTsKLSAgICAgICAgLy8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGxlbmd0aHMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGxlbmd0aHMuZ2V0KDApLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbGVuZ3Rocy5nZXQoMSkuaW50VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBsZW5ndGhzLmdldCgyKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGxlbmd0aHMuZ2V0KDMpLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbGVuZ3Rocy5nZXQoNCkuaW50VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2LCBsZW5ndGhzLmdldCg1KS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgLy8vCi0gICAgICAgIGFzc2VydEVxdWFscyg2LCBzYWNrcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2Fja3MuZ2V0KDApLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2Fja3MuZ2V0KDEpLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2Fja3MuZ2V0KDIpLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgc2Fja3MuZ2V0KDMpLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgc2Fja3MuZ2V0KDQpLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgc2Fja3MuZ2V0KDUpLmludFZhbHVlKCkpOwotICAgICAgICAvLwotICAgICAgICBhc3NlcnRFcXVhbHMoMjQsIHQuZ2V0U2lkZUVmZmVjdHMoKS48TnVtYmVyPmdldCgibGVuZ3RoU3VtIikuaW50VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRIYXZlVmFsaWRUb1N0cmluZygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cmFuc2xhdG9yW2g6Z3JlbWxpbi1qeXRob25dIiwgSnl0aG9uVHJhbnNsYXRvci5vZigiaCIpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkVHJhbnNsYXRlVG9KeXRob25BbmROb3RQeXRob24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdGhlIGp5dGhvbiB0cmFuc2xhdGlvbiBiaW5kICJnIiB0byBqYXZhIGNsYXNzZXMgYW5kIHRodXMgZG9lcyBub3QgcmVxdWlyZSB0aGUgc3RyaWN0IHB5dGhvbiBzeW50YXggd2hpY2gKLSAgICAgICAgLy8gY29udmVydHMgc3RlcHMgbGlrZSBhcygpIHRvIGFzXygpLiBpZiB0aG9zZSBzdGVwcyBhcmUgY29udmVydGVkIHRoZW4gdGhlIHRyYXZlcnNhbCBkb2VzIG5vdCBldmFsdWF0ZQotICAgICAgICAvLyBwcm9wZXJseSBpbiB0aGUgcHl0aG9uIGVuZ2luZS4gbm90IG11Y2ggb2YgYW4gYXNzZXJ0aW9uIGhlcmUgdG8gd29ycnkgYWJvdXQgLSBqdXN0IG5lZWQgdG8gZW5zdXJlIHRoYXQKLSAgICAgICAgLy8gdGhlIHRyYXZlcnNhbCB3aXRoIHN1Y2ggc3RlcHMgZXZhbHVhdGVzIHRvIHN1Y2Nlc3MKLSAgICAgICAgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IFRpbmtlckZhY3RvcnkuY3JlYXRlTW9kZXJuKCkudHJhdmVyc2FsKCk7Ci0gICAgICAgIGcgPSBnLndpdGhTdHJhdGVnaWVzKG5ldyBUcmFuc2xhdGlvblN0cmF0ZWd5KGcsIEp5dGhvblRyYW5zbGF0b3Iub2YoImciKSwgZmFsc2UpKTsKLSAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IG8gPSBnLlYoKS5oYXMoIm5hbWUiKS4KLSAgICAgICAgICAgICAgICBtYXRjaChfXy5hcygieCIpLmxhYmVsKCkuYXMoImxibCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgX18uYXMoIngiKS5pZCgpLmFzKCJpZCIpKS4KLSAgICAgICAgICAgICAgICBzZWxlY3QoImxibCIsICJpZCIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKExhbWJkYS5mdW5jdGlvbigibGFtYmRhIHg6IHR5cGUoeC5nZXQoKSkiKSkudG9MaXN0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIG8uc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIEBJZ25vcmUoIlRJTktFUlBPUC0xODk4IC0gdWx0aW1hdGVseSBzZWVtcyB0byBiZSBhIHByb2JsZW0gd2l0aCBqeXRob24gYW5kIHZhcmFyZ3MgLSBkb2Vzbid0IGFjdCBjb25zaXN0ZW50bHkiKQotICAgIHB1YmxpYyB2b2lkIHNob3VsZFRyYW5zbGF0ZVRvSnl0aG9uV2hlblVzaW5nTGFtYmRhc0FuZFN0cmF0ZWdpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdGhlIGp5dGhvbiB0cmFuc2xhdGlvbiBraWNrcyBpbiB3aGVuIHlvdSBhZGQgYSBsYW1iZGEgc28gZW5zdXJlIHRoYXQgaXQgdHJhbnNsYXRlcyB3aGVuIHN0cmF0ZWdpZXMgYXJlCi0gICAgICAgIC8vIHByZXNlbnQKLSAgICAgICAgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IFRpbmtlckZhY3RvcnkuY3JlYXRlTW9kZXJuKCkudHJhdmVyc2FsKCk7Ci0gICAgICAgIGcgPSBnLndpdGhTdHJhdGVnaWVzKG5ldyBUcmFuc2xhdGlvblN0cmF0ZWd5KGcsIEp5dGhvblRyYW5zbGF0b3Iub2YoImciKSwgZmFsc2UpKTsKLSAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IG8gPSBnLndpdGhTdHJhdGVnaWVzKFJlYWRPbmx5U3RyYXRlZ3kuaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmdyYXBoU3RyYXRlZ3kuYnVpbGQoKS5jaGVja0FkamFjZW50VmVydGljZXMoZmFsc2UpLnZlcnRpY2VzKGhhc0xhYmVsKCJwZXJzb24iKSkuY3JlYXRlKCkpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVigpLmhhcygibmFtZSIpLm1hcChMYW1iZGEuZnVuY3Rpb24oImxhbWJkYSB4OiB0eXBlKHguZ2V0KCkpIikpLnRvTGlzdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyg0LCBvLnNpemUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uQ29tcHV0ZXJQcm92aWRlci5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uQ29tcHV0ZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NjNGM2Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL1B5dGhvbkNvbXB1dGVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGgucHJvY2Vzcy5jb21wdXRlci5UaW5rZXJHcmFwaENvbXB1dGVyOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1AR3JhcGhQcm92aWRlci5EZXNjcmlwdG9yKGNvbXB1dGVyID0gVGlua2VyR3JhcGhDb21wdXRlci5jbGFzcykKLXB1YmxpYyBjbGFzcyBQeXRob25Db21wdXRlclByb3ZpZGVyIGV4dGVuZHMgUHl0aG9uUHJvdmlkZXIgewotCi0gICAgcHVibGljIEdyYXBoVHJhdmVyc2FsU291cmNlIHRyYXZlcnNhbChmaW5hbCBHcmFwaCBncmFwaCkgewotICAgICAgICByZXR1cm4gc3VwZXIudHJhdmVyc2FsKGdyYXBoKS53aXRoQ29tcHV0ZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9QeXRob25HcmFwaFNPTkphdmFUcmFuc2xhdG9yLmphdmEgYi9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9QeXRob25HcmFwaFNPTkphdmFUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzc4NjcuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uR3JhcGhTT05KYXZhVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuSmF2YVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RW5naW5lQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5CeXRlY29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLkJ5dGVjb2RlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbi5HcmFwaFNPTldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbi5HcmFwaFNPTlhNb2R1bGVWMmQwOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OWE1vZHVsZVYzZDA7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3Auc2hhZGVkLmphY2tzb24uY29yZS5Kc29uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5zaGFkZWQuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7Ci0KLWltcG9ydCBqYXZheC5zY3JpcHQuQmluZGluZ3M7Ci1pbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLS8qKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKi8KLWZpbmFsIGNsYXNzIFB5dGhvbkdyYXBoU09OSmF2YVRyYW5zbGF0b3I8UyBleHRlbmRzIFRyYXZlcnNhbFNvdXJjZSwgVCBleHRlbmRzIFRyYXZlcnNhbC5BZG1pbjw/LCA/Pj4gaW1wbGVtZW50cyBUcmFuc2xhdG9yLlN0ZXBUcmFuc2xhdG9yPFMsIFQ+IHsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBJU19URVNUSU5HID0gQm9vbGVhbi52YWx1ZU9mKFN5c3RlbS5nZXRQcm9wZXJ0eSgiaXMudGVzdGluZyIsICJmYWxzZSIpKTsKLSAgICBwcml2YXRlIGZpbmFsIFB5dGhvblRyYW5zbGF0b3IgcHl0aG9uVHJhbnNsYXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIEphdmFUcmFuc2xhdG9yPFMsIFQ+IGphdmFUcmFuc2xhdG9yOwotICAgIHByaXZhdGUgZmluYWwgR3JhcGhTT05SZWFkZXIgcmVhZGVyOwotICAgIHByaXZhdGUgZmluYWwgR3JhcGhTT05Xcml0ZXIgd3JpdGVyOwotICAgIHByaXZhdGUgZmluYWwgR3JhcGhTT05WZXJzaW9uIHZlcnNpb247Ci0KLSAgICBwdWJsaWMgUHl0aG9uR3JhcGhTT05KYXZhVHJhbnNsYXRvcihmaW5hbCBQeXRob25UcmFuc2xhdG9yIHB5dGhvblRyYW5zbGF0b3IsIGZpbmFsIEphdmFUcmFuc2xhdG9yPFMsIFQ+IGphdmFUcmFuc2xhdG9yLCBmaW5hbCBHcmFwaFNPTlZlcnNpb24gdmVyc2lvbikgewotICAgICAgICB0aGlzLnB5dGhvblRyYW5zbGF0b3IgPSBweXRob25UcmFuc2xhdG9yOwotICAgICAgICB0aGlzLmphdmFUcmFuc2xhdG9yID0gamF2YVRyYW5zbGF0b3I7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIHRoaXMucmVhZGVyID0gR3JhcGhTT05SZWFkZXIuYnVpbGQoKS5tYXBwZXIoCi0gICAgICAgICAgICAgICAgR3JhcGhTT05NYXBwZXIuYnVpbGQoKS5hZGRDdXN0b21Nb2R1bGUodmVyc2lvbi5lcXVhbHMoR3JhcGhTT05WZXJzaW9uLlYyXzApID8KLSAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoU09OWE1vZHVsZVYyZDAuYnVpbGQoKS5jcmVhdGUoZmFsc2UpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoU09OWE1vZHVsZVYzZDAuYnVpbGQoKS5jcmVhdGUoZmFsc2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb24odmVyc2lvbikuY3JlYXRlKCkpLmNyZWF0ZSgpOwotICAgICAgICB0aGlzLndyaXRlciA9IEdyYXBoU09OV3JpdGVyLmJ1aWxkKCkubWFwcGVyKAotICAgICAgICAgICAgICAgIEdyYXBoU09OTWFwcGVyLmJ1aWxkKCkuYWRkQ3VzdG9tTW9kdWxlKHZlcnNpb24uZXF1YWxzKEdyYXBoU09OVmVyc2lvbi5WMl8wKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFNPTlhNb2R1bGVWMmQwLmJ1aWxkKCkuY3JlYXRlKGZhbHNlKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFNPTlhNb2R1bGVWM2QwLmJ1aWxkKCkuY3JlYXRlKGZhbHNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uKHZlcnNpb24pLmNyZWF0ZSgpKS5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUyBnZXRUcmF2ZXJzYWxTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmphdmFUcmFuc2xhdG9yLmdldFRyYXZlcnNhbFNvdXJjZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmphdmFUcmFuc2xhdG9yLmdldFRhcmdldExhbmd1YWdlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFQgdHJhbnNsYXRlKGZpbmFsIEJ5dGVjb2RlIGJ5dGVjb2RlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTY3JpcHRFbmdpbmUganl0aG9uRW5naW5lID0gU2NyaXB0RW5naW5lQ2FjaGUuZ2V0KCJqeXRob24iKTsKLSAgICAgICAgICAgIGZpbmFsIEJpbmRpbmdzIGJpbmRpbmdzID0ganl0aG9uRW5naW5lLmNyZWF0ZUJpbmRpbmdzKCk7Ci0gICAgICAgICAgICBiaW5kaW5ncy5wdXRBbGwoanl0aG9uRW5naW5lLmdldEJpbmRpbmdzKFNjcmlwdENvbnRleHQuRU5HSU5FX1NDT1BFKSk7Ci0gICAgICAgICAgICBiaW5kaW5ncy5wdXQodGhpcy5weXRob25UcmFuc2xhdG9yLmdldFRyYXZlcnNhbFNvdXJjZSgpLCBqeXRob25FbmdpbmUuZXZhbCgiR3JhcGgoKS50cmF2ZXJzYWwoKSIpKTsKLSAgICAgICAgICAgIGJpbmRpbmdzLnB1dEFsbChieXRlY29kZS5nZXRCaW5kaW5ncygpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cmFuc2xhdGVkR3JhcGhTT05CeXRlY29kZSA9IGp5dGhvbkVuZ2luZS5ldmFsKCh0aGlzLnZlcnNpb24uZXF1YWxzKEdyYXBoU09OVmVyc2lvbi5WMl8wKSA/Ci0gICAgICAgICAgICAgICAgICAgICJncmFwaHNvblYyZDBfd3JpdGVyIiA6Ci0gICAgICAgICAgICAgICAgICAgICJncmFwaHNvblYzZDBfd3JpdGVyIikgKwotICAgICAgICAgICAgICAgICAgICAiLndyaXRlT2JqZWN0KCIgKyB0aGlzLnB5dGhvblRyYW5zbGF0b3IudHJhbnNsYXRlKGJ5dGVjb2RlKSArICIpIiwgYmluZGluZ3MpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoSVNfVEVTVElORykgewotICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBHcmFwaFNPTiBzZW50IHRvIFB5dGhvbiBpcyB0aGUgc2FtZSBhcyB0aGUgR3JhcGhTT04gcmV0dXJuZWQgYnkgUHl0aG9uCi0gICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBCeXRlY29kZUhlbHBlci5yZW1vdmVCaW5kaW5ncyhieXRlY29kZSk7IC8vIHRoaXMgaXMgYmVjYXVzZSBiaW5kaW5ncyBhcmUgdmFyaWFibGVzIHRoYXQgZ2V0IGNvbnZlcnRlZCB0byB2YWx1ZXMgYXQgdHJhbnNsYXRpb24KLSAgICAgICAgICAgICAgICBCeXRlY29kZUhlbHBlci5kZXRhY2hFbGVtZW50cyhieXRlY29kZSk7IC8vIHRoaXMgaXMgdG8gZ2V0IHRoZSBtaW5pbWFsIG5lY2Vzc2FyeSByZXByZXNlbnRhdGlvbgotICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlT2JqZWN0KG91dHB1dCwgYnl0ZWNvZGUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvcmlnaW5hbEdyYXBoU09OQnl0ZWNvZGUgPSBuZXcgU3RyaW5nKG91dHB1dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcihuZXcgSnNvbkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKG9yaWdpbmFsR3JhcGhTT05CeXRlY29kZSArICJcbiIgKyB0cmFuc2xhdGVkR3JhcGhTT05CeXRlY29kZSArICJcblxuIik7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBvcmlnaW5hbCA9IG1hcHBlci5yZWFkVmFsdWUob3JpZ2luYWxHcmFwaFNPTkJ5dGVjb2RlLCBNYXAuY2xhc3MpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNsYXRlZCA9IG1hcHBlci5yZWFkVmFsdWUodHJhbnNsYXRlZEdyYXBoU09OQnl0ZWNvZGUsIE1hcC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsR3JhcGhTT05CeXRlY29kZS5sZW5ndGgoKSwgdHJhbnNsYXRlZEdyYXBoU09OQnl0ZWNvZGUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgdHJhbnNsYXRlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5qYXZhVHJhbnNsYXRvci50cmFuc2xhdGUodGhpcy5yZWFkZXIucmVhZE9iamVjdChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odHJhbnNsYXRlZEdyYXBoU09OQnl0ZWNvZGUuZ2V0Qnl0ZXMoKSksIEJ5dGVjb2RlLmNsYXNzKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9QeXRob25HcmVtbGluU2NyaXB0RW5naW5lVGVzdC5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uR3JlbWxpblNjcmlwdEVuZ2luZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxMzcxNy4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9QeXRob25HcmVtbGluU2NyaXB0RW5naW5lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuR3JlbWxpblNjcmlwdEVuZ2luZVN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLlNjcmlwdEVuZ2luZVRvVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuSWdub3JlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQotLyoqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCi0gKi8KLUBJZ25vcmUKLUBSdW5XaXRoKEdyZW1saW5TY3JpcHRFbmdpbmVTdWl0ZS5jbGFzcykKLUBTY3JpcHRFbmdpbmVUb1Rlc3Qoc2NyaXB0RW5naW5lTmFtZSA9ICJncmVtbGluLWp5dGhvbiIpCi1wdWJsaWMgY2xhc3MgUHl0aG9uR3JlbWxpblNjcmlwdEVuZ2luZVRlc3QgewotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uUHJvY2Vzc0NvbXB1dGVyVGVzdC5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uUHJvY2Vzc0NvbXB1dGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUzYmJkLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL1B5dGhvblByb2Nlc3NDb21wdXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLlByb2Nlc3NDb21wdXRlclN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckdyYXBoOwotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1ASWdub3JlCi1AUnVuV2l0aChQcm9jZXNzQ29tcHV0ZXJTdWl0ZS5jbGFzcykKLUBHcmFwaFByb3ZpZGVyQ2xhc3MocHJvdmlkZXIgPSBQeXRob25Db21wdXRlclByb3ZpZGVyLmNsYXNzLCBncmFwaCA9IFRpbmtlckdyYXBoLmNsYXNzKQotcHVibGljIGNsYXNzIFB5dGhvblByb2Nlc3NDb21wdXRlclRlc3QgewotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uUHJvY2Vzc1N0YW5kYXJkVGVzdC5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9qc3IyMjMvUHl0aG9uUHJvY2Vzc1N0YW5kYXJkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJmYjc4Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL1B5dGhvblByb2Nlc3NTdGFuZGFyZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLlByb2Nlc3NTdGFuZGFyZFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckdyYXBoOwotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1ASWdub3JlCi1AUnVuV2l0aChQcm9jZXNzU3RhbmRhcmRTdWl0ZS5jbGFzcykKLUBHcmFwaFByb3ZpZGVyQ2xhc3MocHJvdmlkZXIgPSBQeXRob25Qcm92aWRlci5jbGFzcywgZ3JhcGggPSBUaW5rZXJHcmFwaC5jbGFzcykKLXB1YmxpYyBjbGFzcyBQeXRob25Qcm9jZXNzU3RhbmRhcmRUZXN0IHsKLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL1B5dGhvblByb3ZpZGVyLmphdmEgYi9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHl0aG9uL2pzcjIyMy9QeXRob25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVhYTY1Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vanNyMjIzL1B5dGhvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5qc3IyMjM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uQWJzdHJhY3RHcmFwaFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuSmF2YVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RW5naW5lQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlRyYW5zbGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb24uR3JhcGhTT05WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckVkZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VyRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJHcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJHcmFwaFZhcmlhYmxlczsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJWZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VyVmVydGV4UHJvcGVydHk7Ci0KLWltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1AR3JhcGguT3B0T3V0KAotICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuUHJvZ3JhbVRlc3QiLAotICAgICAgICBtZXRob2QgPSAiKiIsCi0gICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCi1AR3JhcGguT3B0T3V0KAotICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsSW50ZXJydXB0aW9uVGVzdCIsCi0gICAgICAgIG1ldGhvZCA9ICIqIiwKLSAgICAgICAgcmVhc29uID0gIlJlYXNvbiByZXF1aXJlcyBpbnZlc3RpZ2F0aW9uIikKLUBHcmFwaC5PcHRPdXQoCi0gICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxJbnRlcnJ1cHRpb25Db21wdXRlclRlc3QiLAotICAgICAgICBtZXRob2QgPSAiKiIsCi0gICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCi1AR3JhcGguT3B0T3V0KAotICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5FdmVudFN0cmF0ZWd5UHJvY2Vzc1Rlc3QiLAotICAgICAgICBtZXRob2QgPSAiKiIsCi0gICAgICAgIHJlYXNvbiA9ICJTdHJhdGVneSBub3QgcHJvcGVybHkgc3VwcG9ydGVkIGJ5IEJ5dGVjb2RlIGJhc2VkIHRyYXZlcnNhbHMiKQotQEdyYXBoLk9wdE91dCgKLSAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uRWxlbWVudElkU3RyYXRlZ3lQcm9jZXNzVGVzdCIsCi0gICAgICAgIG1ldGhvZCA9ICIqIiwKLSAgICAgICAgcmVhc29uID0gIlN0cmF0ZWd5IG5vdCBwcm9wZXJseSBzdXBwb3J0ZWQgYnkgQnl0ZWNvZGUgYmFzZWQgdHJhdmVyc2FscyIpCi1wdWJsaWMgY2xhc3MgUHl0aG9uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoUHJvdmlkZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElNUE9SVF9TVEFUSUNTID0gbmV3IFJhbmRvbSgpLm5leHRCb29sZWFuKCk7Ci0KLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIEp5dGhvblNjcmlwdEVuZ2luZVNldHVwLnNldHVwKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPiBJTVBMRU1FTlRBVElPTiA9IG5ldyBIYXNoU2V0PENsYXNzPigpIHt7Ci0gICAgICAgIGFkZChUaW5rZXJFZGdlLmNsYXNzKTsKLSAgICAgICAgYWRkKFRpbmtlckVsZW1lbnQuY2xhc3MpOwotICAgICAgICBhZGQoVGlua2VyR3JhcGguY2xhc3MpOwotICAgICAgICBhZGQoVGlua2VyR3JhcGhWYXJpYWJsZXMuY2xhc3MpOwotICAgICAgICBhZGQoVGlua2VyUHJvcGVydHkuY2xhc3MpOwotICAgICAgICBhZGQoVGlua2VyVmVydGV4LmNsYXNzKTsKLSAgICAgICAgYWRkKFRpbmtlclZlcnRleFByb3BlcnR5LmNsYXNzKTsKLSAgICB9fTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEJhc2VDb25maWd1cmF0aW9uKGZpbmFsIFN0cmluZyBncmFwaE5hbWUsIGZpbmFsIENsYXNzPD8+IHRlc3QsIGZpbmFsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMb2FkR3JhcGhXaXRoLkdyYXBoRGF0YSBsb2FkR3JhcGhXaXRoKSB7Ci0gICAgICAgIGZpbmFsIFRpbmtlckdyYXBoLkRlZmF1bHRJZE1hbmFnZXIgaWRNYW5hZ2VyID0gc2VsZWN0SWRNYWtlckZyb21HcmFwaERhdGEobG9hZEdyYXBoV2l0aCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZE1ha2VyID0gKGlkTWFuYWdlci5lcXVhbHMoVGlua2VyR3JhcGguRGVmYXVsdElkTWFuYWdlci5BTlkpID8gc2VsZWN0SWRNYWtlckZyb21HcmFwaERhdGEobG9hZEdyYXBoV2l0aCkgOiBpZE1hbmFnZXIpLm5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHt7Ci0gICAgICAgICAgICBwdXQoR3JhcGguR1JBUEgsIFRpbmtlckdyYXBoLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBwdXQoVGlua2VyR3JhcGguR1JFTUxJTl9USU5LRVJHUkFQSF9WRVJURVhfSURfTUFOQUdFUiwgaWRNYWtlcik7Ci0gICAgICAgICAgICBwdXQoVGlua2VyR3JhcGguR1JFTUxJTl9USU5LRVJHUkFQSF9FREdFX0lEX01BTkFHRVIsIGlkTWFrZXIpOwotICAgICAgICAgICAgcHV0KFRpbmtlckdyYXBoLkdSRU1MSU5fVElOS0VSR1JBUEhfVkVSVEVYX1BST1BFUlRZX0lEX01BTkFHRVIsIGlkTWFrZXIpOwotICAgICAgICAgICAgaWYgKGxvYWRHcmFwaFdpdGggPT0gTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEuQ1JFVykKLSAgICAgICAgICAgICAgICBwdXQoVGlua2VyR3JhcGguR1JFTUxJTl9USU5LRVJHUkFQSF9ERUZBVUxUX1ZFUlRFWF9QUk9QRVJUWV9DQVJESU5BTElUWSwgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkubGlzdC5uYW1lKCkpOwotICAgICAgICB9fTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhcihmaW5hbCBHcmFwaCBncmFwaCwgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdyYXBoICE9IG51bGwpIGdyYXBoLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxDbGFzcz4gZ2V0SW1wbGVtZW50YXRpb25zKCkgewotICAgICAgICByZXR1cm4gSU1QTEVNRU5UQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGxvYWQgd2l0aCBzcGVjaWZpYyBncmFwaCBkYXRhIGNhbiBiZSBjb25maWd1cmVkIHdpdGggYSBzcGVjaWZpYyBpZCBtYW5hZ2VyIGFzIHRoZSBkYXRhIHR5cGUgdG8KLSAgICAgKiBiZSB1c2VkIGluIHRoZSB0ZXN0IGZvciB0aGF0IGdyYXBoIGlzIGtub3duLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUaW5rZXJHcmFwaC5EZWZhdWx0SWRNYW5hZ2VyIHNlbGVjdElkTWFrZXJGcm9tR3JhcGhEYXRhKGZpbmFsIExvYWRHcmFwaFdpdGguR3JhcGhEYXRhIGxvYWRHcmFwaFdpdGgpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gbG9hZEdyYXBoV2l0aCkgcmV0dXJuIFRpbmtlckdyYXBoLkRlZmF1bHRJZE1hbmFnZXIuQU5ZOwotICAgICAgICBpZiAobG9hZEdyYXBoV2l0aC5lcXVhbHMoTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEuQ0xBU1NJQykpCi0gICAgICAgICAgICByZXR1cm4gVGlua2VyR3JhcGguRGVmYXVsdElkTWFuYWdlci5JTlRFR0VSOwotICAgICAgICBlbHNlIGlmIChsb2FkR3JhcGhXaXRoLmVxdWFscyhMb2FkR3JhcGhXaXRoLkdyYXBoRGF0YS5NT0RFUk4pKQotICAgICAgICAgICAgcmV0dXJuIFRpbmtlckdyYXBoLkRlZmF1bHRJZE1hbmFnZXIuSU5URUdFUjsKLSAgICAgICAgZWxzZSBpZiAobG9hZEdyYXBoV2l0aC5lcXVhbHMoTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEuQ1JFVykpCi0gICAgICAgICAgICByZXR1cm4gVGlua2VyR3JhcGguRGVmYXVsdElkTWFuYWdlci5JTlRFR0VSOwotICAgICAgICBlbHNlIGlmIChsb2FkR3JhcGhXaXRoLmVxdWFscyhMb2FkR3JhcGhXaXRoLkdyYXBoRGF0YS5HUkFURUZVTCkpCi0gICAgICAgICAgICByZXR1cm4gVGlua2VyR3JhcGguRGVmYXVsdElkTWFuYWdlci5JTlRFR0VSOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5lZWQgdG8gZGVmaW5lIGEgbmV3ICVzIGZvciAlcyIsIFRpbmtlckdyYXBoLklkTWFuYWdlci5jbGFzcy5nZXROYW1lKCksIGxvYWRHcmFwaFdpdGgubmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgdHJhdmVyc2FsKGZpbmFsIEdyYXBoIGdyYXBoKSB7Ci0gICAgICAgIGlmICgoQm9vbGVhbikgZ3JhcGguY29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJza2lwVGVzdCIpKQotICAgICAgICAgICAgcmV0dXJuIGdyYXBoLnRyYXZlcnNhbCgpOwotICAgICAgICAgICAgLy90aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXhjZXB0aW9uKCJUaGlzIHRlc3QgY3VycmVudCBkb2VzIG5vdCB3b3JrIHdpdGggR3JlbWxpbi1QeXRob24iLCBFbXB0eVRyYXZlcnNhbC5pbnN0YW5jZSgpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNjcmlwdEVuZ2luZUNhY2hlLmdldCgianl0aG9uIikuZXZhbChJTVBPUlRfU1RBVElDUyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAic3RhdGljcy5sb2FkX3N0YXRpY3MoZ2xvYmFscygpKSIgOgotICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRpY3MudW5sb2FkX3N0YXRpY3MoZ2xvYmFscygpKSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2NyaXB0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKLSAgICAgICAgICAgIHJldHVybiBnLndpdGhTdHJhdGVnaWVzKG5ldyBUcmFuc2xhdGlvblN0cmF0ZWd5KGcsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQeXRob25HcmFwaFNPTkphdmFUcmFuc2xhdG9yPD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHl0aG9uVHJhbnNsYXRvci5vZigiZyIsIElNUE9SVF9TVEFUSUNTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhVHJhbnNsYXRvci5vZihnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0SGVscGVyLlJBTkRPTS5uZXh0Qm9vbGVhbigpID8gR3JhcGhTT05WZXJzaW9uLlYyXzAgOiBHcmFwaFNPTlZlcnNpb24uVjNfMCksIHRydWUpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OUmVhZGVyVGVzdC5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05SZWFkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTM3YjYuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05SZWFkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5EZWZhdWx0UmVtb3RlVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHl0aG9uLmpzcjIyMy5KeXRob25TY3JpcHRFbmdpbmVTZXR1cDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXhQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbi5HcmFwaFNPTk1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbi5HcmFwaFNPTlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5zaGFkZWQuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcucHl0aG9uLmpzcjIyMy5QeVNjcmlwdEVuZ2luZTsKLQotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmU7Ci1pbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotLyoqCi0gKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKLSAqLwotQElnbm9yZQotcHVibGljIGNsYXNzIEdyYXBoU09OUmVhZGVyVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8R3JhcGhTT05WZXJzaW9uPiBWRVJTSU9OUyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChHcmFwaFNPTlZlcnNpb24uVjJfMCwgR3JhcGhTT05WZXJzaW9uLlYzXzApKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gVGlua2VyRmFjdG9yeS5jcmVhdGVNb2Rlcm4oKS50cmF2ZXJzYWwoKTsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkRGVzZXJpYWxpemVHcmFwaE9iamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChmaW5hbCBHcmFwaFNPTlZlcnNpb24gdmVyc2lvbiA6IFZFUlNJT05TKSB7Ci0gICAgICAgICAgICBmaW5hbCBTY3JpcHRFbmdpbmUganl0aG9uRW5naW5lID0gSnl0aG9uU2NyaXB0RW5naW5lU2V0dXAuc2V0dXAoKFB5U2NyaXB0RW5naW5lKSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpLmdldEVuZ2luZUJ5TmFtZSgianl0aG9uIikpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3JlYWRlciA9ICIgKyAodmVyc2lvbi5lcXVhbHMoR3JhcGhTT05WZXJzaW9uLlYyXzApID8gImdyYXBoc29uVjJkMF9yZWFkZXIiIDogImdyYXBoc29uVjNkMF9yZWFkZXIiKSk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgbWFwcGVyID0gR3JhcGhTT05NYXBwZXIuYnVpbGQoKS52ZXJzaW9uKHZlcnNpb24pLmNyZWF0ZSgpLmNyZWF0ZU1hcHBlcigpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXggPSBnLlYoMSkubmV4dCgpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmdldEJpbmRpbmdzKFNjcmlwdENvbnRleHQuRU5HSU5FX1NDT1BFKS5wdXQoIngiLCBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKHZlcnRleCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcnRleC50b1N0cmluZygpLCBqeXRob25FbmdpbmUuZXZhbCgic3RyKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpKSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpLFZlcnRleCkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KS5sYWJlbCIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoeCkuaWQiKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgZmluYWwgRWRnZSBlZGdlID0gZy5WKDEpLm91dEUoImNyZWF0ZWQiKS5uZXh0KCk7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dCgieCIsIG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZWRnZSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGVkZ2UudG9TdHJpbmcoKSwganl0aG9uRW5naW5lLmV2YWwoInN0cihncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKChCb29sZWFuKSBqeXRob25FbmdpbmUuZXZhbCgiaXNpbnN0YW5jZShncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSxFZGdlKSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiY3JlYXRlZCIsIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KS5sYWJlbCIpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBmaW5hbCBWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSA9IChWZXJ0ZXhQcm9wZXJ0eSkgZy5WKDEpLnByb3BlcnRpZXMoIm5hbWUiKS5uZXh0KCk7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dCgieCIsIG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcodmVydGV4UHJvcGVydHkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh2ZXJ0ZXhQcm9wZXJ0eS50b1N0cmluZygpLCBqeXRob25FbmdpbmUuZXZhbCgic3RyKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpKSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpLFZlcnRleFByb3BlcnR5KSIpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eSBwcm9wZXJ0eSA9IGcuVigxKS5vdXRFKCJjcmVhdGVkIikucHJvcGVydGllcygid2VpZ2h0IikubmV4dCgpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmdldEJpbmRpbmdzKFNjcmlwdENvbnRleHQuRU5HSU5FX1NDT1BFKS5wdXQoIngiLCBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKHByb3BlcnR5KSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvcGVydHkudG9TdHJpbmcoKSwganl0aG9uRW5naW5lLmV2YWwoInN0cihncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKChCb29sZWFuKSBqeXRob25FbmdpbmUuZXZhbCgiaXNpbnN0YW5jZShncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSxQcm9wZXJ0eSkiKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgZmluYWwgVHJhdmVyc2VyPFZlcnRleD4gdHJhdmVyc2VyID0gbmV3IERlZmF1bHRSZW1vdGVUcmF2ZXJzZXI8Pih2ZXJ0ZXgsIDNMKTsKLSAgICAgICAgICAgIGp5dGhvbkVuZ2luZS5nZXRCaW5kaW5ncyhTY3JpcHRDb250ZXh0LkVOR0lORV9TQ09QRSkucHV0KCJ4IiwgbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyh0cmF2ZXJzZXIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cmF2ZXJzZXIudG9TdHJpbmcoKSwganl0aG9uRW5naW5lLmV2YWwoInN0cihncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDNMKSwganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpLmJ1bGsiKSk7IC8vIGp5dGhvbiB1c2VzIGJpZyBpbnRlZ2VyIGluIEphdmEKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpLm9iamVjdCxWZXJ0ZXgpIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoQm9vbGVhbikganl0aG9uRW5naW5lLmV2YWwoImlzaW5zdGFuY2UoZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoeCksVHJhdmVyc2VyKSIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkRGVzZXJpYWxpemVOdW1iZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoZmluYWwgR3JhcGhTT05WZXJzaW9uIHZlcnNpb24gOiBWRVJTSU9OUykgewotICAgICAgICAgICAgZmluYWwgU2NyaXB0RW5naW5lIGp5dGhvbkVuZ2luZSA9IEp5dGhvblNjcmlwdEVuZ2luZVNldHVwLnNldHVwKChQeVNjcmlwdEVuZ2luZSkgbmV3IFNjcmlwdEVuZ2luZU1hbmFnZXIoKS5nZXRFbmdpbmVCeU5hbWUoImp5dGhvbiIpKTsKLSAgICAgICAgICAgIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl9yZWFkZXIgPSAiICsgKHZlcnNpb24uZXF1YWxzKEdyYXBoU09OVmVyc2lvbi5WMl8wKSA/ICJncmFwaHNvblYyZDBfcmVhZGVyIiA6ICJncmFwaHNvblYzZDBfcmVhZGVyIikpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEdyYXBoU09OTWFwcGVyLmJ1aWxkKCkudmVyc2lvbih2ZXJzaW9uKS5jcmVhdGUoKS5jcmVhdGVNYXBwZXIoKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBqeXRob25FbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dCgieCIsIG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoMSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwganl0aG9uRW5naW5lLmV2YWwoInN0cihncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKChCb29sZWFuKSBqeXRob25FbmdpbmUuZXZhbCgiaXNpbnN0YW5jZShncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSxpbnQpIikpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGp5dGhvbkVuZ2luZS5nZXRCaW5kaW5ncyhTY3JpcHRDb250ZXh0LkVOR0lORV9TQ09QRSkucHV0KCJ4IiwgbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZygxTCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwganl0aG9uRW5naW5lLmV2YWwoInN0cihncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKChCb29sZWFuKSBqeXRob25FbmdpbmUuZXZhbCgiaXNpbnN0YW5jZShncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSxsb25nKSIpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBqeXRob25FbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dCgieCIsIG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoMS4yZikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjIiLCBqeXRob25FbmdpbmUuZXZhbCgic3RyKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpKSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpLGZsb2F0KSIpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBqeXRob25FbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dCgieCIsIG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoMS4zZCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjMiLCBqeXRob25FbmdpbmUuZXZhbCgic3RyKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpKSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpLGZsb2F0KSIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkRGVzZXJpYWxpemVDb2xsZWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGZpbmFsIEdyYXBoU09OVmVyc2lvbiB2ZXJzaW9uIDogVkVSU0lPTlMpIHsKLSAgICAgICAgICAgIGZpbmFsIFNjcmlwdEVuZ2luZSBqeXRob25FbmdpbmUgPSBKeXRob25TY3JpcHRFbmdpbmVTZXR1cC5zZXR1cCgoUHlTY3JpcHRFbmdpbmUpIG5ldyBTY3JpcHRFbmdpbmVNYW5hZ2VyKCkuZ2V0RW5naW5lQnlOYW1lKCJqeXRob24iKSk7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fcmVhZGVyID0gIiArICh2ZXJzaW9uLmVxdWFscyhHcmFwaFNPTlZlcnNpb24uVjJfMCkgPyAiZ3JhcGhzb25WMmQwX3JlYWRlciIgOiAiZ3JhcGhzb25WM2QwX3JlYWRlciIpKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdE1hcHBlciBtYXBwZXIgPSBHcmFwaFNPTk1hcHBlci5idWlsZCgpLnZlcnNpb24odmVyc2lvbikuY3JlYXRlKCkuY3JlYXRlTWFwcGVyKCk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTnVtYmVyPiBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICBtYXAucHV0KCJhIiwgMik7Ci0gICAgICAgICAgICBtYXAucHV0KCJiIiwgMi4zZCk7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpLnB1dCgieCIsIG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcobWFwKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInt1J2EnOiAyLCB1J2InOiAyLjN9Iiwganl0aG9uRW5naW5lLmV2YWwoInN0cihncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KSkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpWydhJ10iKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMi4zZCwganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpWydiJ10iKSk7IC8vIGp5dGhvbiBpcyBzbWFydCBhYm91dCBkb3VibGUKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpWydhJ10saW50KSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpWydiJ10sZmxvYXQpIikpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBsaXN0ID0gQXJyYXlzLmFzTGlzdChnLlYoMSkubmV4dCgpLCAiaGVsbG8iLCBtYXAsIHRydWUpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmdldEJpbmRpbmdzKFNjcmlwdENvbnRleHQuRU5HSU5FX1NDT1BFKS5wdXQoIngiLCBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGxpc3QpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiW3ZbMV0sIHUnaGVsbG8nLCB7dSdhJzogMiwgdSdiJzogMi4zfSwgVHJ1ZV0iLCBqeXRob25FbmdpbmUuZXZhbCgic3RyKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpKSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhnLlYoMSkubmV4dCgpLnRvU3RyaW5nKCksIGp5dGhvbkVuZ2luZS5ldmFsKCJzdHIoZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoeClbMF0pIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KVsxXSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygie3UnYSc6IDIsIHUnYic6IDIuM30iLCBqeXRob25FbmdpbmUuZXZhbCgic3RyKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpWzJdKSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KVszXSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKGdyYXBoc29uX3JlYWRlci5yZWFkT2JqZWN0KHgpWzBdLFZlcnRleCkiKSk7Ci0gICAgICAgICAgICAvLyBhc3NlcnRUcnVlKChCb29sZWFuKSBqeXRob25FbmdpbmUuZXZhbCgiaXNpbnN0YW5jZShncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KVsxXSxzdHIpIikpOyAvLyBpdHMgcHl0aG9uIHVuaWNvZGUganl0aG9uIG9iamVjdAotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoQm9vbGVhbikganl0aG9uRW5naW5lLmV2YWwoImlzaW5zdGFuY2UoZ3JhcGhzb25fcmVhZGVyLnJlYWRPYmplY3QoeClbMl0sZGljdCkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKChCb29sZWFuKSBqeXRob25FbmdpbmUuZXZhbCgiaXNpbnN0YW5jZShncmFwaHNvbl9yZWFkZXIucmVhZE9iamVjdCh4KVszXSxib29sKSIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9weXRob24vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OV3JpdGVyVGVzdC5qYXZhIGIvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05Xcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNWQ5YzcuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3B5dGhvbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05Xcml0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnB5dGhvbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5EZWZhdWx0UmVtb3RlVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQnl0ZWNvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5QOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUG9wOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuU2NvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC51dGlsLkFuZFA7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5weXRob24uanNyMjIzLkp5dGhvblNjcmlwdEVuZ2luZVNldHVwOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuZnVuY3Rpb24uTGFtYmRhOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLnNoYWRlZC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKLWltcG9ydCBvcmcuanVuaXQuSWdub3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5weXRob24uanNyMjIzLlB5U2NyaXB0RW5naW5lOwotCi1pbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZTsKLWltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lTWFuYWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1ASWdub3JlCi1wdWJsaWMgY2xhc3MgR3JhcGhTT05Xcml0ZXJUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxHcmFwaFNPTlZlcnNpb24+IFZFUlNJT05TID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KEdyYXBoU09OVmVyc2lvbi5WMl8wLCBHcmFwaFNPTlZlcnNpb24uVjNfMCkpOwotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRTZXJpYWxpemVOdW1iZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoZmluYWwgR3JhcGhTT05WZXJzaW9uIHZlcnNpb24gOiBWRVJTSU9OUykgewotICAgICAgICAgICAgZmluYWwgU2NyaXB0RW5naW5lIGp5dGhvbkVuZ2luZSA9IEp5dGhvblNjcmlwdEVuZ2luZVNldHVwLnNldHVwKChQeVNjcmlwdEVuZ2luZSkgbmV3IFNjcmlwdEVuZ2luZU1hbmFnZXIoKS5nZXRFbmdpbmVCeU5hbWUoImp5dGhvbiIpKTsKLSAgICAgICAgICAgIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIgPSAiICsgKHZlcnNpb24uZXF1YWxzKEdyYXBoU09OVmVyc2lvbi5WMl8wKSA/ICJncmFwaHNvblYyZDBfd3JpdGVyIiA6ICJncmFwaHNvblYzZDBfd3JpdGVyIikpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEdyYXBoU09OTWFwcGVyLmJ1aWxkKCkudmVyc2lvbih2ZXJzaW9uKS5jcmVhdGUoKS5jcmVhdGVNYXBwZXIoKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KDEpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZygxKSwganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgxKSIpLnRvU3RyaW5nKCkucmVwbGFjZSgiICIsICIiKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMkwpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZygyTCksIGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMkwpIikudG9TdHJpbmcoKS5yZXBsYWNlKCIgIiwgIiIpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy40LCBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoMy40KSIpLnRvU3RyaW5nKCksIE9iamVjdC5jbGFzcykpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoMy40KSwganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdCgzLjQpIikudG9TdHJpbmcoKS5yZXBsYWNlKCIgIiwgIiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkU2VyaWFsaXplQ29sbGVjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChmaW5hbCBHcmFwaFNPTlZlcnNpb24gdmVyc2lvbiA6IFZFUlNJT05TKSB7Ci0gICAgICAgICAgICBmaW5hbCBTY3JpcHRFbmdpbmUganl0aG9uRW5naW5lID0gSnl0aG9uU2NyaXB0RW5naW5lU2V0dXAuc2V0dXAoKFB5U2NyaXB0RW5naW5lKSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpLmdldEVuZ2luZUJ5TmFtZSgianl0aG9uIikpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlciA9ICIgKyAodmVyc2lvbi5lcXVhbHMoR3JhcGhTT05WZXJzaW9uLlYyXzApID8gImdyYXBoc29uVjJkMF93cml0ZXIiIDogImdyYXBoc29uVjNkMF93cml0ZXIiKSk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgbWFwcGVyID0gR3JhcGhTT05NYXBwZXIuYnVpbGQoKS52ZXJzaW9uKHZlcnNpb24pLmNyZWF0ZSgpLmNyZWF0ZU1hcHBlcigpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE51bWJlcj4gbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwotICAgICAgICAgICAgbWFwLnB1dCgiYSIsIDIpOwotICAgICAgICAgICAgbWFwLnB1dCgiYiIsIDIuMyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWFwLCBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoeydhJzoyLCdiJzoyLjN9KSIpLnRvU3RyaW5nKCksIE9iamVjdC5jbGFzcykpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgRGVmYXVsdFJlbW90ZVRyYXZlcnNlcjw+KCJoZWxsbyIsIDNMKSwgImhlbGxvIiwgbWFwLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIGp5dGhvbkVuZ2luZS5ldmFsKCJpc2luc3RhbmNlKFtUcmF2ZXJzZXIoJ2hlbGxvJywzTCksJ2hlbGxvJyx7J2EnOjIsJ2InOjIuM30sVHJ1ZV0sbGlzdCkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobGlzdCwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFtUcmF2ZXJzZXIoJ2hlbGxvJywzTCksJ2hlbGxvJyx7J2EnOjIsJ2InOjIuM30sVHJ1ZV0pIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFNlcmlhbGl6ZVRyYXZlcnNlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGZpbmFsIEdyYXBoU09OVmVyc2lvbiB2ZXJzaW9uIDogVkVSU0lPTlMpIHsKLSAgICAgICAgICAgIGZpbmFsIFNjcmlwdEVuZ2luZSBqeXRob25FbmdpbmUgPSBKeXRob25TY3JpcHRFbmdpbmVTZXR1cC5zZXR1cCgoUHlTY3JpcHRFbmdpbmUpIG5ldyBTY3JpcHRFbmdpbmVNYW5hZ2VyKCkuZ2V0RW5naW5lQnlOYW1lKCJqeXRob24iKSk7Ci0gICAgICAgICAgICBqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyID0gIiArICh2ZXJzaW9uLmVxdWFscyhHcmFwaFNPTlZlcnNpb24uVjJfMCkgPyAiZ3JhcGhzb25WMmQwX3dyaXRlciIgOiAiZ3JhcGhzb25WM2QwX3dyaXRlciIpKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdE1hcHBlciBtYXBwZXIgPSBHcmFwaFNPTk1hcHBlci5idWlsZCgpLnZlcnNpb24odmVyc2lvbikuY3JlYXRlKCkuY3JlYXRlTWFwcGVyKCk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFJlbW90ZVRyYXZlcnNlcjw+KCJoZWxsbyIsIDNMKSwKLSAgICAgICAgICAgICAgICAgICAgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFRyYXZlcnNlcignaGVsbG8nLDNMKSkiKS50b1N0cmluZygpLCBPYmplY3QuY2xhc3MpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzTCwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFRyYXZlcnNlcignaGVsbG8nLDNMKSkiKS50b1N0cmluZygpLCBUcmF2ZXJzZXIuY2xhc3MpLmJ1bGsoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFRyYXZlcnNlcignaGVsbG8nLDNMKSkiKS50b1N0cmluZygpLCBUcmF2ZXJzZXIuY2xhc3MpLmdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkU2VyaWFsaXplQnl0ZWNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChmaW5hbCBHcmFwaFNPTlZlcnNpb24gdmVyc2lvbiA6IFZFUlNJT05TKSB7Ci0gICAgICAgICAgICBmaW5hbCBTY3JpcHRFbmdpbmUganl0aG9uRW5naW5lID0gSnl0aG9uU2NyaXB0RW5naW5lU2V0dXAuc2V0dXAoKFB5U2NyaXB0RW5naW5lKSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpLmdldEVuZ2luZUJ5TmFtZSgianl0aG9uIikpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlciA9ICIgKyAodmVyc2lvbi5lcXVhbHMoR3JhcGhTT05WZXJzaW9uLlYyXzApID8gImdyYXBoc29uVjJkMF93cml0ZXIiIDogImdyYXBoc29uVjNkMF93cml0ZXIiKSk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgbWFwcGVyID0gR3JhcGhTT05NYXBwZXIuYnVpbGQoKS52ZXJzaW9uKHZlcnNpb24pLmNyZWF0ZSgpLmNyZWF0ZU1hcHBlcigpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQLmVxKDdMKSwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAuZXEoN0wpKSIpLnRvU3RyaW5nKCksIE9iamVjdC5jbGFzcykpOwotICAgICAgICAgICAgLy8gVE9ETzogYXNzZXJ0RXF1YWxzKG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoUC5iZXR3ZWVuKDEsIDIpLmFuZChQLmVxKDdMKSkpLCBqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFAuZXEoN0wpLl9hbmQoUC5iZXR3ZWVuKDEsMikpKSIpLnRvU3RyaW5nKCkucmVwbGFjZSgiICIsIiIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhBbmRQLmNsYXNzLCBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoUC5lcSg3TCkuYW5kXyhQLmJldHdlZW4oMSwyKSkpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJ5dGVjb2RlLkJpbmRpbmc8PigiYSIsIDVMKSwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KEJpbmRpbmcoJ2EnLDVMKSkiKS50b1N0cmluZygpLCBPYmplY3QuY2xhc3MpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbHVtbiB0IDogQ29sdW1uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQsIG1hcHBlci5yZWFkVmFsdWUoanl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChDb2x1bW4uIiArIHQubmFtZSgpICsgIikiKS50b1N0cmluZygpLCBPYmplY3QuY2xhc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoZmluYWwgVCB0IDogVC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoVC4iICsgdC5uYW1lKCkgKyAiKSIpLnRvU3RyaW5nKCksIE9iamVjdC5jbGFzcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFBvcC5maXJzdCwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFBvcC5maXJzdCkiKS50b1N0cmluZygpLCBPYmplY3QuY2xhc3MpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQb3AubGFzdCwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFBvcC5sYXN0KSIpLnRvU3RyaW5nKCksIE9iamVjdC5jbGFzcykpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFBvcC5hbGwsIG1hcHBlci5yZWFkVmFsdWUoanl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQb3AuYWxsXykiKS50b1N0cmluZygpLCBPYmplY3QuY2xhc3MpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQb3AubWl4ZWQsIG1hcHBlci5yZWFkVmFsdWUoanl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChQb3AubWl4ZWQpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU2NvcGUuZ2xvYmFsLCBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QoU2NvcGUuZ2xvYmFsXykiKS50b1N0cmluZygpLCBPYmplY3QuY2xhc3MpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTY29wZS5sb2NhbCwgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KFNjb3BlLmxvY2FsKSIpLnRvU3RyaW5nKCksIE9iamVjdC5jbGFzcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRTZXJpYWxpemVMYW1iZGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChmaW5hbCBHcmFwaFNPTlZlcnNpb24gdmVyc2lvbiA6IFZFUlNJT05TKSB7Ci0gICAgICAgICAgICBmaW5hbCBTY3JpcHRFbmdpbmUganl0aG9uRW5naW5lID0gSnl0aG9uU2NyaXB0RW5naW5lU2V0dXAuc2V0dXAoKFB5U2NyaXB0RW5naW5lKSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpLmdldEVuZ2luZUJ5TmFtZSgianl0aG9uIikpOwotICAgICAgICAgICAganl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlciA9ICIgKyAodmVyc2lvbi5lcXVhbHMoR3JhcGhTT05WZXJzaW9uLlYyXzApID8gImdyYXBoc29uVjJkMF93cml0ZXIiIDogImdyYXBoc29uVjNkMF93cml0ZXIiKSk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgbWFwcGVyID0gR3JhcGhTT05NYXBwZXIuYnVpbGQoKS52ZXJzaW9uKHZlcnNpb24pLmNyZWF0ZSgpLmNyZWF0ZU1hcHBlcigpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgTGFtYmRhLmZ1bmN0aW9uKCJsYW1iZGEgeiA6IDErMiIsICJncmVtbGluLXB5dGhvbiIpLAotICAgICAgICAgICAgICAgICAgICBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobGFtYmRhIDogJ3ogOiAxKzInKSIpLnRvU3RyaW5nKCksIE9iamVjdC5jbGFzcykpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBMYW1iZGEuZnVuY3Rpb24oImxhbWJkYSB6IDogeisgNyIsICJncmVtbGluLXB5dGhvbiIpLAotICAgICAgICAgICAgICAgICAgICBtYXBwZXIucmVhZFZhbHVlKGp5dGhvbkVuZ2luZS5ldmFsKCJncmFwaHNvbl93cml0ZXIud3JpdGVPYmplY3QobGFtYmRhIDogJ2xhbWJkYSB6IDogeisgNycpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIExhbWJkYS5zdXBwbGllcigibGFtYmRhIDogMjMiLCAiZ3JlbWxpbi1weXRob24iKSwKLSAgICAgICAgICAgICAgICAgICAgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxhbWJkYSA6ICdsYW1iZGEgOiAyMycpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIExhbWJkYS5jb25zdW1lcigibGFtYmRhIHogOiB6ICsgMjMiLCAiZ3JlbWxpbi1weXRob24iKSwKLSAgICAgICAgICAgICAgICAgICAgbWFwcGVyLnJlYWRWYWx1ZShqeXRob25FbmdpbmUuZXZhbCgiZ3JhcGhzb25fd3JpdGVyLndyaXRlT2JqZWN0KGxhbWJkYSA6ICdsYW1iZGEgeiA6IHogKyAyMycpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIExhbWJkYS5iaUZ1bmN0aW9uKCJsYW1iZGEgeix5IDogeiAtIHkgKyAyIiwgImdyZW1saW4tcHl0aG9uIiksCi0gICAgICAgICAgICAgICAgICAgIG1hcHBlci5yZWFkVmFsdWUoanl0aG9uRW5naW5lLmV2YWwoImdyYXBoc29uX3dyaXRlci53cml0ZU9iamVjdChsYW1iZGEgOiAnbGFtYmRhIHoseSA6IHogLSB5ICsgMicpIikudG9TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGotc2lsZW50LnByb3BlcnRpZXMgYi9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGotc2lsZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjViYjAuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1weXRob24vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLXNpbGVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgdGhpcyBmaWxlIHNob3VsZCBhbHdheXMgaGF2ZSBsb2dnaW5nIHNldCB0byBPRkYuICBpdCBzZWVtcywgaG93ZXZlciwgdGhhdCBhbiBhcHBlbmRlciBvZiBzb21lIHNvcnQgaXMKLSMgcmVxdWlyZWQgb3IgZWxzZSBzb21lIGxvZ3MgdGhyb3cgZXJyb3IgYW5kIHVzZSBvdGhlciBsb2c0ai5wcm9wZXJ0aWVzIGZpbGVzIG9uIHRoZSBwYXRoLgotbG9nNGoucm9vdExvZ2dlcj1PRkYsIHN0ZG91dAotbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJXBdICVDIC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai10ZXN0LnByb3BlcnRpZXMgYi9ncmVtbGluLXB5dGhvbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGotdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzOGIxLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tcHl0aG9uL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai10ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1sb2c0ai5yb290TG9nZ2VyPVdBUk4sIHN0ZG91dAotbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJXBdICVDIC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL0RvY2tlcmZpbGUgYi9ncmVtbGluLXNlcnZlci9Eb2NrZXJmaWxlCmluZGV4IDNiMWU4NDkuLmZlODEyNmEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL0RvY2tlcmZpbGUKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvRG9ja2VyZmlsZQpAQCAtMTUsNyArMTUsNyBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1GUk9NIG9wZW5qZGs6OC1qcmUtYWxwaW5lCitGUk9NIGFkb3B0b3Blbmpkay9vcGVuamRrMTE6YWxwaW5lLXNsaW0KIAogTEFCRUwgbWFpbnRhaW5lcj0iZGV2QHRpbmtlcnBvcC5hcGFjaGUub3JnIgogCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLWNsYXNzaWMueWFtbCBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItY2xhc3NpYy55YW1sCmluZGV4IDI0OGE2YmYuLjE1YjIzOTcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItY2xhc3NpYy55YW1sCisrKyBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItY2xhc3NpYy55YW1sCkBAIC0yNyw4ICsyNyw2IEBACiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5JbXBvcnRHcmVtbGluUGx1Z2luOiB7Y2xhc3NJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGhdLCBtZXRob2RJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGgjKl19LAogICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW46IHtmaWxlczogW3NjcmlwdHMvZ2VuZXJhdGUtY2xhc3NpYy5ncm9vdnldfX19fQogc2VyaWFsaXplcnM6Ci0gIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19ICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2dyeW8KLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBzZXJpYWxpemVSZXN1bHRUb1N0cmluZzogdHJ1ZSB9fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5by1zdHJpbmdkCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IGlvUmVnaXN0cmllczogW29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlcklvUmVnaXN0cnlWM2QwXSB9fSAgICAgICAgIyBhcHBsaWNhdGlvbi9qc29uCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMAogICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLCBjb25maWc6IHsgc2VyaWFsaXplUmVzdWx0VG9TdHJpbmc6IHRydWUgfX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyYXBoYmluYXJ5LXYxLjAtc3RyaW5nZApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1tb2Rlcm4tcHkueWFtbCBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItbW9kZXJuLXB5LnlhbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTNkNWYuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1tb2Rlcm4tcHkueWFtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBOb3RlIHRoYXQgVGlua2VyUG9wIGRvZXMgbm90IGluY2x1ZGUgZ3JlbWxpbi1weXRob24gZGVwZW5kZW5jaWVzIGluCi0jIGl0cyBkaXN0cmlidXRpb25zLiBUaGlzIGZpbGUgY2Fubm90IGJlIHVzZWQgYXMgYSBjb25maWd1cmF0aW9uIGZpbGUKLSMgdG8gR3JlbWxpbiBTZXJ2ZXIgdW5sZXNzIHRob3NlIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkIG9uIHRoZQotIyBHcmVtbGluIFNlcnZlciBwYXRoIHdpdGg6Ci0jCi0jIGJpbi9ncmVtbGluLXNlcnZlci5zaCAtaSBvcmcuYXBhY2hlLnRpbmtlcnBvcCBncmVtbGluLXB5dGhvbiB4LnkuegotIwotIyBUaGUgcHJpbWFyeSBjaGFuZ2UgaW4gdGhpcyBmaWxlIHRvIGVuYWJsZSB0aGUgR3JlbWxpbkp5dGhvblNjcmlwdEVuZ2luZQotIyBpcyB0aGUgYWRkaXRpb24gb2YgImdyZW1saW4tanl0aG9uIiB0byB0aGUgInNjcmlwdEVuZ2luZXMiIGZpZWxkLgotCi1ob3N0OiBsb2NhbGhvc3QKLXBvcnQ6IDgxODIKLXRocmVhZFBvb2xXb3JrZXI6IDEKLWdyZW1saW5Qb29sOiA4Ci1ldmFsdWF0aW9uVGltZW91dDogMzAwMDAKLWdyYXBoczogewotICBncmFwaDogY29uZi90aW5rZXJncmFwaC1lbXB0eS5wcm9wZXJ0aWVzfQotc2NyaXB0RW5naW5lczogewotICBncmVtbGluLWdyb292eTogewotICAgIHBsdWdpbnM6IHsgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuanNyMjIzLkdyZW1saW5TZXJ2ZXJHcmVtbGluUGx1Z2luOiB7fSwKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguanNyMjIzLlRpbmtlckdyYXBoR3JlbWxpblBsdWdpbjoge30sCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5JbXBvcnRHcmVtbGluUGx1Z2luOiB7Y2xhc3NJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGhdLCBtZXRob2RJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGgjKl19LAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW46IHtmaWxlczogW3NjcmlwdHMvZ2VuZXJhdGUtbW9kZXJuLmdyb292eV19fX0sCi0gIGdyZW1saW4tanl0aG9uOiB7fSwKLSAgZ3JlbWxpbi1weXRob246IHt9Ci19Ci1zZXJpYWxpemVyczoKLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0gfX0gICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5bwotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nOiB0cnVlIH19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvLXN0cmluZ2QKLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19ICAgICAgICAjIGFwcGxpY2F0aW9uL2pzb24KLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wCi0gIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEsIGNvbmZpZzogeyBzZXJpYWxpemVSZXN1bHRUb1N0cmluZzogdHJ1ZSB9fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMC1zdHJpbmdkCi1tZXRyaWNzOiB7Ci0gIHNsZjRqUmVwb3J0ZXI6IHtlbmFibGVkOiB0cnVlLCBpbnRlcnZhbDogMTgwMDAwfX0KLXN0cmljdFRyYW5zYWN0aW9uTWFuYWdlbWVudDogZmFsc2UKLWlkbGVDb25uZWN0aW9uVGltZW91dDogMAota2VlcEFsaXZlSW50ZXJ2YWw6IDAKLXRocmVhZFBvb2xCb3NzOiAxCi1tYXhJbml0aWFsTGluZUxlbmd0aDogNDA5NgotbWF4SGVhZGVyU2l6ZTogODE5MgotbWF4Q2h1bmtTaXplOiA4MTkyCi1tYXhDb250ZW50TGVuZ3RoOiA2NTUzNgotbWF4QWNjdW11bGF0aW9uQnVmZmVyQ29tcG9uZW50czogMTAyNAotcmVzdWx0SXRlcmF0aW9uQmF0Y2hTaXplOiA2NApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1tb2Rlcm4tcmVhZG9ubHkueWFtbCBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItbW9kZXJuLXJlYWRvbmx5LnlhbWwKaW5kZXggNzM4OGY3My4uNzA1MTYzZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1tb2Rlcm4tcmVhZG9ubHkueWFtbAorKysgYi9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLW1vZGVybi1yZWFkb25seS55YW1sCkBAIC0yNyw4ICsyNyw2IEBACiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5JbXBvcnRHcmVtbGluUGx1Z2luOiB7Y2xhc3NJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGhdLCBtZXRob2RJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGgjKl19LAogICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW46IHtmaWxlczogW3NjcmlwdHMvZ2VuZXJhdGUtbW9kZXJuLXJlYWRvbmx5Lmdyb292eV19fX19CiBzZXJpYWxpemVyczoKLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0gfX0gICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5bwotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nOiB0cnVlIH19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvLXN0cmluZ2QKICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19ICAgICAgICAjIGFwcGxpY2F0aW9uL2pzb24KICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEsIGNvbmZpZzogeyBzZXJpYWxpemVSZXN1bHRUb1N0cmluZzogdHJ1ZSB9fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMC1zdHJpbmdkCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLW1vZGVybi55YW1sIGIvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1tb2Rlcm4ueWFtbAppbmRleCA1ZjgzNTA4Li5lOWFjZTU2IDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLW1vZGVybi55YW1sCisrKyBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItbW9kZXJuLnlhbWwKQEAgLTI4LDggKzI4LDYgQEAKICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkltcG9ydEdyZW1saW5QbHVnaW46IHtjbGFzc0ltcG9ydHM6IFtqYXZhLmxhbmcuTWF0aF0sIG1ldGhvZEltcG9ydHM6IFtqYXZhLmxhbmcuTWF0aCMqXX0sCiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5TY3JpcHRGaWxlR3JlbWxpblBsdWdpbjoge2ZpbGVzOiBbc2NyaXB0cy9nZW5lcmF0ZS1tb2Rlcm4uZ3Jvb3Z5XX19fX0KIHNlcmlhbGl6ZXJzOgotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IGlvUmVnaXN0cmllczogW29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlcklvUmVnaXN0cnlWM2QwXSB9fSAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvCi0gIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgc2VyaWFsaXplUmVzdWx0VG9TdHJpbmc6IHRydWUgfX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2dyeW8tc3RyaW5nZAogICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0gfX0gICAgICAgICMgYXBwbGljYXRpb24vanNvbgogICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyYXBoYmluYXJ5LXYxLjAKICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMSwgY29uZmlnOiB7IHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nOiB0cnVlIH19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wLXN0cmluZ2QKZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItbmVvNGoueWFtbCBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItbmVvNGoueWFtbAppbmRleCAwOGU0MmE4Li42ZjgzOGFmIDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLW5lbzRqLnlhbWwKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1uZW80ai55YW1sCkBAIC0zOCw4ICszOCw2IEBACiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5JbXBvcnRHcmVtbGluUGx1Z2luOiB7Y2xhc3NJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGhdLCBtZXRob2RJbXBvcnRzOiBbamF2YS5sYW5nLk1hdGgjKl19LAogICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW46IHtmaWxlczogW3NjcmlwdHMvZW1wdHktc2FtcGxlLmdyb292eV19fX19CiBzZXJpYWxpemVyczoKLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0gfX0gICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5bwotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nOiB0cnVlIH19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvLXN0cmluZ2QKICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19ICAgICAgICAjIGFwcGxpY2F0aW9uL2pzb24KICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEsIGNvbmZpZzogeyBzZXJpYWxpemVSZXN1bHRUb1N0cmluZzogdHJ1ZSB9fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMC1zdHJpbmdkCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLXNlY3VyZS55YW1sIGIvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1zZWN1cmUueWFtbAppbmRleCBkZWMyYmIzLi45M2M0MzIzIDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLXNlY3VyZS55YW1sCisrKyBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItc2VjdXJlLnlhbWwKQEAgLTM3LDggKzM3LDYgQEAKICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLkltcG9ydEdyZW1saW5QbHVnaW46IHtjbGFzc0ltcG9ydHM6IFtqYXZhLmxhbmcuTWF0aF0sIG1ldGhvZEltcG9ydHM6IFtqYXZhLmxhbmcuTWF0aCMqXX0sCiAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5TY3JpcHRGaWxlR3JlbWxpblBsdWdpbjoge2ZpbGVzOiBbc2NyaXB0cy9lbXB0eS1zYW1wbGUtc2VjdXJlLmdyb292eV19fX19CiBzZXJpYWxpemVyczoKLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0gfX0gICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5bwotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nOiB0cnVlIH19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvLXN0cmluZ2QKICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19ICAgICAgICAjIGFwcGxpY2F0aW9uL2pzb24KICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEsIGNvbmZpZzogeyBzZXJpYWxpemVSZXN1bHRUb1N0cmluZzogdHJ1ZSB9fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMC1zdHJpbmdkCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLXNwYXJrLnlhbWwgYi9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLXNwYXJrLnlhbWwKaW5kZXggNGQ5NzRiZi4uODYzNGVhYiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci1zcGFyay55YW1sCisrKyBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXItc3BhcmsueWFtbApAQCAtNTEsOCArNTEsNiBAQAogICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuSW1wb3J0R3JlbWxpblBsdWdpbjoge2NsYXNzSW1wb3J0czogW2phdmEubGFuZy5NYXRoXSwgbWV0aG9kSW1wb3J0czogW2phdmEubGFuZy5NYXRoIypdfSwKICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLlNjcmlwdEZpbGVHcmVtbGluUGx1Z2luOiB7ZmlsZXM6IFtzY3JpcHRzL3NwYXJrLmdyb292eV19fX19CiBzZXJpYWxpemVyczoKLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBpb1JlZ2lzdHJpZXM6IFtvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZS5UaW5rZXJJb1JlZ2lzdHJ5VjNkMF0gfX0gICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5bwotICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IHNlcmlhbGl6ZVJlc3VsdFRvU3RyaW5nOiB0cnVlIH19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyZW1saW4tdjMuMCtncnlvLXN0cmluZ2QKICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoU09OTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19ICAgICAgICAjIGFwcGxpY2F0aW9uL2pzb24KICAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmFwaGJpbmFyeS12MS4wCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEsIGNvbmZpZzogeyBzZXJpYWxpemVSZXN1bHRUb1N0cmluZzogdHJ1ZSB9fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMC1zdHJpbmdkCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLnlhbWwgYi9ncmVtbGluLXNlcnZlci9jb25mL2dyZW1saW4tc2VydmVyLnlhbWwKaW5kZXggODZmNGU5Mi4uNGYyMTBjOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvY29uZi9ncmVtbGluLXNlcnZlci55YW1sCisrKyBiL2dyZW1saW4tc2VydmVyL2NvbmYvZ3JlbWxpbi1zZXJ2ZXIueWFtbApAQCAtMjgsOCArMjgsNiBAQAogICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuSW1wb3J0R3JlbWxpblBsdWdpbjoge2NsYXNzSW1wb3J0czogW2phdmEubGFuZy5NYXRoXSwgbWV0aG9kSW1wb3J0czogW2phdmEubGFuZy5NYXRoIypdfSwKICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLlNjcmlwdEZpbGVHcmVtbGluUGx1Z2luOiB7ZmlsZXM6IFtzY3JpcHRzL2VtcHR5LXNhbXBsZS5ncm9vdnldfX19fQogc2VyaWFsaXplcnM6Ci0gIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLCBjb25maWc6IHsgaW9SZWdpc3RyaWVzOiBbb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VySW9SZWdpc3RyeVYzZDBdIH19ICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JlbWxpbi12My4wK2dyeW8KLSAgLSB7IGNsYXNzTmFtZTogb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAsIGNvbmZpZzogeyBzZXJpYWxpemVSZXN1bHRUb1N0cmluZzogdHJ1ZSB9fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uL3ZuZC5ncmVtbGluLXYzLjArZ3J5by1zdHJpbmdkCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjNkMCwgY29uZmlnOiB7IGlvUmVnaXN0cmllczogW29yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlcklvUmVnaXN0cnlWM2QwXSB9fSAgICAgICAgIyBhcHBsaWNhdGlvbi9qc29uCiAgIC0geyBjbGFzc05hbWU6IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbi92bmQuZ3JhcGhiaW5hcnktdjEuMAogICAtIHsgY2xhc3NOYW1lOiBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLCBjb25maWc6IHsgc2VyaWFsaXplUmVzdWx0VG9TdHJpbmc6IHRydWUgfX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXBwbGljYXRpb24vdm5kLmdyYXBoYmluYXJ5LXYxLjAtc3RyaW5nZApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvcG9tLnhtbCBiL2dyZW1saW4tc2VydmVyL3BvbS54bWwKaW5kZXggZjMzNjdmMC4uMTk0YzA5ZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvcG9tLnhtbAorKysgYi9ncmVtbGluLXNlcnZlci9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnRpbmtlcnBvcDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tc2VydmVyPC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogR3JlbWxpbiBTZXJ2ZXI8L25hbWU+CkBAIC0xMDAsMTIgKzEwMCw2IEBACiAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmtlcmJ5PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+a2VyYi1zaW1wbGVrZGM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgIDwvZGVwZW5kZW5jaWVzPgogICAgIDxidWlsZD4KICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldDwvZGlyZWN0b3J5PgpAQCAtMTU2LDcgKzE1MCw2IEBACiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDwvcGx1Z2luPgotCiAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CkBAIC0yMDYsMjggKzE5OSw1MiBAQAogICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubmVvNGo8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lbzRqLXRpbmtlcnBvcC1hcGktaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MC4zLTIuMy4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjktMy40LjA8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5uZW80ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZW80ai1rZXJuZWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzM8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUuY29uY3VycmVudGxpbmtlZGhhc2htYXA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29uY3VycmVudGxpbmtlZGhhc2htYXAtbHJ1PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLXRleHQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5iZW4tbWFuZXMuY2FmZmVpbmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FmZmVpbmU8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNjYWxhLWxhbmc8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2NhbGEtbGlicmFyeTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2NhbGEtbGFuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1yZWZsZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aW5mby5nYW5nbGlhLmdtZXRyaWM0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nbWV0cmljNGo8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLW5vcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmx1Y2VuZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sdWNlbmUtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5pby5kcm9wd2l6YXJkLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWV0cmljcy1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5ldHR5LWFsbDwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3cyLmFzbTwvZ3JvdXBJZD4KQEAgLTIzNSw2ICsyNTIsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2NhbGEtbGFuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2NhbGEtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xMS44PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2NhbGEtbGFuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2NhbGEtcmVmbGVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xMS44PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmx1Y2VuZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bHVjZW5lLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjUuNS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5pby5kcm9wd2l6YXJkLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+NC4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5uZW80ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVvNGota2VybmVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjQuMTE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5ldHR5LWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgIDwhLS0gKioqIFdBUk5JTkcgKioqIC0tPgogICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICA8YnVpbGQ+CkBAIC0zNDQsNyArMzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT50aW5rZXJwb3AvZ3JlbWxpbi1zZXJ2ZXI8L3JlcG9zaXRvcnk+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgogICAgICAgICAgICAgPC9idWlsZD4KICAgICAgICAgPC9wcm9maWxlPgogICAgIDwvcHJvZmlsZXM+CmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0Fic3RyYWN0Q2hhbm5lbGl6ZXIuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvQWJzdHJhY3RDaGFubmVsaXplci5qYXZhCmluZGV4IDc3Y2Q0NjUuLmU2OTg3YzEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvQWJzdHJhY3RDaGFubmVsaXplci5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvQWJzdHJhY3RDaGFubmVsaXplci5qYXZhCkBAIC0yNiwxMCArMjYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLk1lc3NhZ2VTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkFic3RyYWN0R3J5b01lc3NhZ2VTZXJpYWxpemVyVjFkMDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjJkMDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3J5b01lc3NhZ2VTZXJpYWxpemVyVjNkMDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmdyb292eS5lbmdpbmUuR3JlbWxpbkV4ZWN1dG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmF1dGguQXV0aGVudGljYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5oYW5kbGVyLkFic3RyYWN0QXV0aGVudGljYXRpb25IYW5kbGVyOwpAQCAtNDgsNyArNDYsNiBAQAogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC04MSwxMCArNzgsNiBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hhbm5lbGl6ZXIgZXh0ZW5kcyBDaGFubmVsSW5pdGlhbGl6ZXI8U29ja2V0Q2hhbm5lbD4gaW1wbGVtZW50cyBDaGFubmVsaXplciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFic3RyYWN0Q2hhbm5lbGl6ZXIuY2xhc3MpOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTGlzdDxTZXR0aW5ncy5TZXJpYWxpemVyU2V0dGluZ3M+IERFRkFVTFRfU0VSSUFMSVpFUlMgPSBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgbmV3IFNldHRpbmdzLlNlcmlhbGl6ZXJTZXR0aW5ncyhHcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwLmNsYXNzLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSksCi0gICAgICAgICAgICBuZXcgU2V0dGluZ3MuU2VyaWFsaXplclNldHRpbmdzKEdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDAuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0Pigpe3sKLSAgICAgICAgICAgICAgICBwdXQoQWJzdHJhY3RHcnlvTWVzc2FnZVNlcmlhbGl6ZXJWMWQwLlRPS0VOX1NFUklBTElaRV9SRVNVTFRfVE9fU1RSSU5HLCB0cnVlKTsKLSAgICAgICAgICAgIH19KSwKICAgICAgICAgICAgIG5ldyBTZXR0aW5ncy5TZXJpYWxpemVyU2V0dGluZ3MoR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYyZDAuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwKICAgICAgICAgICAgIG5ldyBTZXR0aW5ncy5TZXJpYWxpemVyU2V0dGluZ3MoR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxLmNsYXNzLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSksCiAgICAgICAgICAgICBuZXcgU2V0dGluZ3MuU2VyaWFsaXplclNldHRpbmdzKEdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMS5jbGFzcy5nZXROYW1lKCksIG5ldyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+KCl7ewpAQCAtMTE5LDcgKzExMiw3IEBACiAgICAgcHJvdGVjdGVkIEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvcjsKIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiB7QGNvZGUgU29ja2V0Q2hhbm5lbH0ganVzdCBhZnRlciB0aGUgU1NMIGhhbmRsZXIgaXMgcHV0IGluIHRoZSBwaXBlbGluZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB3aXRoaW4ge0BsaW5rICNpbml0Q2hhbm5lbChTb2NrZXRDaGFubmVsKX0ganVzdCBhZnRlciB0aGUgU1NMIGhhbmRsZXIgaXMgcHV0IGluIHRoZSBwaXBlbGluZS4KICAgICAgKiBNb2RpZnkgdGhlIHBpcGVsaW5lIGFzIG5lZWRlZCBoZXJlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbmZpZ3VyZShmaW5hbCBDaGFubmVsUGlwZWxpbmUgcGlwZWxpbmUpOwpAQCAtMjcyLDU4ICsyNjUsNDMgQEAKIAogICAgICAgICBmaW5hbCBTc2xDb250ZXh0QnVpbGRlciBidWlsZGVyOwogCi0gICAgICAgIC8vIERFUFJFQ0FURUQ6IElmIHRoZSBjb25maWcgaGFzIHRoZSByZXF1aXJlZCwgZGVwcmVjYXRlZCBzZXR0aW5ncywgdGhlbiB1c2UgaXQKLSAgICAgICAgaWYgKG51bGwgIT0gc3NsU2V0dGluZ3Mua2V5Q2VydENoYWluRmlsZSAmJiBudWxsICE9IHNzbFNldHRpbmdzLmtleUZpbGUpIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVc2luZyBkZXByZWNhdGVkIFNTTCBrZXlGaWxlIHN1cHBvcnQiKTsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUga2V5Q2VydENoYWluRmlsZSA9IG5ldyBGaWxlKHNzbFNldHRpbmdzLmtleUNlcnRDaGFpbkZpbGUpOwotICAgICAgICAgICAgZmluYWwgRmlsZSBrZXlGaWxlID0gbmV3IEZpbGUoc3NsU2V0dGluZ3Mua2V5RmlsZSk7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIHRydXN0Q2VydENoYWluRmlsZSA9IG51bGwgPT0gc3NsU2V0dGluZ3MudHJ1c3RDZXJ0Q2hhaW5GaWxlID8gbnVsbCA6IG5ldyBGaWxlKHNzbFNldHRpbmdzLnRydXN0Q2VydENoYWluRmlsZSk7CisgICAgICAgIC8vIEJ1aWxkIEpTU0UgU1NMQ29udGV4dAorICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoS2V5TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpKTsKIAotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IGtleVBhc3N3b3JkIG1heSBiZSBudWxsIGhlcmUgaWYgdGhlIGtleUZpbGUgaXMgbm90Ci0gICAgICAgICAgICAvLyBwYXNzd29yZC1wcm90ZWN0ZWQuIHBhc3NpbmcgbnVsbCB0bwotICAgICAgICAgICAgLy8gdHJ1c3RNYW5hZ2VyIGlzIGFsc28gb2sgKGRlZmF1bHQgd2lsbCBiZSB1c2VkKQotICAgICAgICAgICAgYnVpbGRlciA9IFNzbENvbnRleHRCdWlsZGVyLmZvclNlcnZlcihrZXlDZXJ0Q2hhaW5GaWxlLCBrZXlGaWxlLCBzc2xTZXR0aW5ncy5rZXlQYXNzd29yZCkudHJ1c3RNYW5hZ2VyKHRydXN0Q2VydENoYWluRmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIEpTU0UgU1NMQ29udGV4dAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gTG9hZCBwcml2YXRlIGtleSBhbmQgc2lnbmVkIGNlcnQKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzc2xTZXR0aW5ncy5rZXlTdG9yZSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5U3RvcmVUeXBlID0gbnVsbCA9PSBzc2xTZXR0aW5ncy5rZXlTdG9yZVR5cGUgPyBLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpIDogc3NsU2V0dGluZ3Mua2V5U3RvcmVUeXBlOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBLZXlTdG9yZSBrZXlzdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKGtleVN0b3JlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBwYXNzd29yZCA9IG51bGwgPT0gc3NsU2V0dGluZ3Mua2V5U3RvcmVQYXNzd29yZCA/IG51bGwgOiBzc2xTZXR0aW5ncy5rZXlTdG9yZVBhc3N3b3JkLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSAoZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNzbFNldHRpbmdzLmtleVN0b3JlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmUubG9hZChpbiwgcGFzc3dvcmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGttZi5pbml0KGtleXN0b3JlLCBwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigia2V5U3RvcmUgbXVzdCBiZSBjb25maWd1cmVkIHdoZW4gU1NMIGlzIGVuYWJsZWQuIik7CisgICAgICAgICAgICAvLyBMb2FkIHByaXZhdGUga2V5IGFuZCBzaWduZWQgY2VydAorICAgICAgICAgICAgaWYgKG51bGwgIT0gc3NsU2V0dGluZ3Mua2V5U3RvcmUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5U3RvcmVUeXBlID0gbnVsbCA9PSBzc2xTZXR0aW5ncy5rZXlTdG9yZVR5cGUgPyBLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpIDogc3NsU2V0dGluZ3Mua2V5U3RvcmVUeXBlOworICAgICAgICAgICAgICAgIGZpbmFsIEtleVN0b3JlIGtleXN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2Uoa2V5U3RvcmVUeXBlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyW10gcGFzc3dvcmQgPSBudWxsID09IHNzbFNldHRpbmdzLmtleVN0b3JlUGFzc3dvcmQgPyBudWxsIDogc3NsU2V0dGluZ3Mua2V5U3RvcmVQYXNzd29yZC50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIHRyeSAoZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNzbFNldHRpbmdzLmtleVN0b3JlKSkgeworICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZS5sb2FkKGluLCBwYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnVpbGRlciA9IFNzbENvbnRleHRCdWlsZGVyLmZvclNlcnZlcihrbWYpOwotCi0gICAgICAgICAgICAgICAgLy8gTG9hZCBjdXN0b20gdHJ1c3RzdG9yZSBmb3IgY2xpZW50IGF1dGggY2VydHMKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzc2xTZXR0aW5ncy50cnVzdFN0b3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cnVzdFN0b3JlVHlwZSA9IG51bGwgIT0gc3NsU2V0dGluZ3MudHJ1c3RTdG9yZVR5cGUgPyBzc2xTZXR0aW5ncy50cnVzdFN0b3JlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3NsU2V0dGluZ3Mua2V5U3RvcmVUeXBlICE9IG51bGwgPyBzc2xTZXR0aW5ncy5rZXlTdG9yZVR5cGUgOiBLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEtleVN0b3JlIHRydXN0c3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSh0cnVzdFN0b3JlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBwYXNzd29yZCA9IG51bGwgPT0gc3NsU2V0dGluZ3MudHJ1c3RTdG9yZVBhc3N3b3JkID8gbnVsbCA6IHNzbFNldHRpbmdzLnRydXN0U3RvcmVQYXNzd29yZC50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICB0cnkgKGZpbmFsIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzc2xTZXR0aW5ncy50cnVzdFN0b3JlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RzdG9yZS5sb2FkKGluLCBwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1mLmluaXQodHJ1c3RzdG9yZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIudHJ1c3RNYW5hZ2VyKHRtZik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uIHwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHwgS2V5U3RvcmVFeGNlcHRpb24gfCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGVyZSB3YXMgYW4gZXJyb3IgZW5hYmxpbmcgU1NMLiIsIGUpOworICAgICAgICAgICAgICAgIGttZi5pbml0KGtleXN0b3JlLCBwYXNzd29yZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImtleVN0b3JlIG11c3QgYmUgY29uZmlndXJlZCB3aGVuIFNTTCBpcyBlbmFibGVkLiIpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBidWlsZGVyID0gU3NsQ29udGV4dEJ1aWxkZXIuZm9yU2VydmVyKGttZik7CisKKyAgICAgICAgICAgIC8vIExvYWQgY3VzdG9tIHRydXN0c3RvcmUgZm9yIGNsaWVudCBhdXRoIGNlcnRzCisgICAgICAgICAgICBpZiAobnVsbCAhPSBzc2xTZXR0aW5ncy50cnVzdFN0b3JlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRydXN0U3RvcmVUeXBlID0gbnVsbCAhPSBzc2xTZXR0aW5ncy50cnVzdFN0b3JlVHlwZSA/IHNzbFNldHRpbmdzLnRydXN0U3RvcmVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzc2xTZXR0aW5ncy5rZXlTdG9yZVR5cGUgIT0gbnVsbCA/IHNzbFNldHRpbmdzLmtleVN0b3JlVHlwZSA6IEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBLZXlTdG9yZSB0cnVzdHN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UodHJ1c3RTdG9yZVR5cGUpOworICAgICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBwYXNzd29yZCA9IG51bGwgPT0gc3NsU2V0dGluZ3MudHJ1c3RTdG9yZVBhc3N3b3JkID8gbnVsbCA6IHNzbFNldHRpbmdzLnRydXN0U3RvcmVQYXNzd29yZC50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIHRyeSAoZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNzbFNldHRpbmdzLnRydXN0U3RvcmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmUubG9hZChpbiwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOworICAgICAgICAgICAgICAgIHRtZi5pbml0KHRydXN0c3RvcmUpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIudHJ1c3RNYW5hZ2VyKHRtZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiB8IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB8IEtleVN0b3JlRXhjZXB0aW9uIHwgQ2VydGlmaWNhdGVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZXJlIHdhcyBhbiBlcnJvciBlbmFibGluZyBTU0wuIiwgZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobnVsbCAhPSBzc2xTZXR0aW5ncy5zc2xDaXBoZXJTdWl0ZXMgJiYgIXNzbFNldHRpbmdzLnNzbENpcGhlclN1aXRlcy5pc0VtcHR5KCkpIHsKZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvUmVzcG9uc2VIYW5kbGVyQ29udGV4dC5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9SZXNwb25zZUhhbmRsZXJDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjdmZDguLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9SZXNwb25zZUhhbmRsZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlc3BvbnNlU3RhdHVzQ29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5oYW5kbGVyLkZyYW1lOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKLQotLyoqCi0gKiBBIGNvbnRleHQgZm9yIGFzeW5jaHJvbm91c2x5IHdyaXRpbmcgcmVzcG9uc2UgbWVzc2FnZXMgcmVsYXRlZCB0byBhIHBhcnRpY3VsYXIgcmVxdWVzdC4KLSAqIDxwPlRoZSAid3JpdGUiIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBlbnN1cmUgdGhhdCBhdCBtb3N0IG9uZSB7QGxpbmsgUmVzcG9uc2VTdGF0dXNDb2RlI2lzRmluYWxSZXNwb25zZSgpIGZpbmFsfQotICogcmVzcG9uc2UgbWVzc2FnZSBpcyB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwuIEF0dGVtcHRzIHRvIHdyaXRlIG1vcmUgdGhhbiBvbmUgZmluYWwgcmVzcG9uc2UgbWVzc2FnZSB3aWxsCi0gKiBiZSBpZ25vcmVkIHdpdGggYSB3YXJuaW5nIGxvZyBtZXNzYWdlLjwvcD4KLSAqIDxwPk5vdGU6IGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2Ygd3JpdGluZyB0byB0aGUgY2hhbm5lbCBkaXJlY3RseSB3aGVuIG11bHRpcGxlIHRocmVhZHMKLSAqIGFyZSBleHBlY3RlZCB0byBwcm9kdWNlIGZpbmFsIHJlc3BvbnNlIG1lc3NhZ2VzIGNvbmN1cnJlbnRseS4gQ2FsbGVycyBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzYW1lCi0gKiB7QGxpbmsgUmVzcG9uc2VIYW5kbGVyQ29udGV4dH0gaXMgdXNlZCBieSBhbGwgdGhyZWFkcyB3cml0aW5nIHJlc3BvbnNlIG1lc3NhZ2VzIGZvciB0aGUgc2FtZSByZXF1ZXN0LjwvcD4KLSAqCi0gKiBAYXV0aG9yIERtaXRyaSBCb3VybGF0Y2hrb3YKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIHJlcGxhY2VkIGJ5IHtAbGluayBDb250ZXh0fS4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBSZXNwb25zZUhhbmRsZXJDb250ZXh0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzcG9uc2VIYW5kbGVyQ29udGV4dC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgY29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gZmluYWxSZXNwb25zZVdyaXR0ZW4gPSBuZXcgQXRvbWljQm9vbGVhbigpOwotCi0gICAgcHVibGljIFJlc3BvbnNlSGFuZGxlckNvbnRleHQoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgcmVzcG9uc2UgbWVzc2FnZSB0byB0aGUgdW5kZXJseWluZyBjaGFubmVsIHdoaWxlIGVuc3VyaW5nIHRoYXQgYXQgbW9zdCBvbmUKLSAgICAgKiB7QGxpbmsgUmVzcG9uc2VTdGF0dXNDb2RlI2lzRmluYWxSZXNwb25zZSgpIGZpbmFsfSByZXNwb25zZSBpcyB3cml0dGVuLgotICAgICAqIDxwPk5vdGU6IHRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2Ygd3JpdGluZyB0byB0aGUgY2hhbm5lbCBkaXJlY3RseSB3aGVuIG11bHRpcGxlIHRocmVhZHMKLSAgICAgKiBhcmUgZXhwZWN0ZWQgdG8gcHJvZHVjZSByZXNwb25zZSBtZXNzYWdlcyBjb25jdXJyZW50bHkuPC9wPgotICAgICAqIDxwPkF0dGVtcHRzIHRvIHdyaXRlIG1vcmUgdGhhbiBvbmUgZmluYWwgcmVzcG9uc2UgbWVzc2FnZSB3aWxsIGJlIGlnbm9yZWQuPC9wPgotICAgICAqIEBzZWUgI3dyaXRlQW5kRmx1c2goUmVzcG9uc2VTdGF0dXNDb2RlLCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVBbmRGbHVzaChmaW5hbCBSZXNwb25zZU1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICB3cml0ZUFuZEZsdXNoKG1lc3NhZ2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSByZXNwb25zZSBtZXNzYWdlIHRvIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwgd2hpbGUgZW5zdXJpbmcgdGhhdCBhdCBtb3N0IG9uZQotICAgICAqIHtAbGluayBSZXNwb25zZVN0YXR1c0NvZGUjaXNGaW5hbFJlc3BvbnNlKCkgZmluYWx9IHJlc3BvbnNlIGlzIHdyaXR0ZW4uCi0gICAgICogPHA+VGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBwcm92aWRlZCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLjwvcD4KLSAgICAgKiA8cD5Ob3RlOiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gdGhlIGNoYW5uZWwgZGlyZWN0bHkgd2hlbiBtdWx0aXBsZSB0aHJlYWRzCi0gICAgICogYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgcmVzcG9uc2UgbWVzc2FnZXMgY29uY3VycmVudGx5LjwvcD4KLSAgICAgKiA8cD5BdHRlbXB0cyB0byB3cml0ZSBtb3JlIHRoYW4gb25lIGZpbmFsIHJlc3BvbnNlIG1lc3NhZ2Ugd2lsbCBiZSBpZ25vcmVkLjwvcD4KLSAgICAgKiBAc2VlICN3cml0ZUFuZEZsdXNoKFJlc3BvbnNlTWVzc2FnZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUFuZEZsdXNoKGZpbmFsIFJlc3BvbnNlU3RhdHVzQ29kZSBjb2RlLCBmaW5hbCBPYmplY3QgcmVzcG9uc2VNZXNzYWdlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbWVzc2FnZUlzRmluYWwgPSBjb2RlLmlzRmluYWxSZXNwb25zZSgpOwotICAgICAgICBpZihmaW5hbFJlc3BvbnNlV3JpdHRlbi5jb21wYXJlQW5kU2V0KGZhbHNlLCBtZXNzYWdlSXNGaW5hbCkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0Q2hhbm5lbEhhbmRsZXJDb250ZXh0KCkud3JpdGVBbmRGbHVzaChyZXNwb25zZU1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHJlc3BvbnNlTWVzc2FnZSBpbnN0YW5jZW9mIEZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgKChGcmFtZSkgcmVzcG9uc2VNZXNzYWdlKS50cnlSZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2dNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiQW5vdGhlciBmaW5hbCByZXNwb25zZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHdyaXR0ZW4gZm9yIHJlcXVlc3QgJXMsIGlnbm9yaW5nIHJlc3BvbnNlIGNvZGU6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXF1ZXN0TWVzc2FnZSgpLmdldFJlcXVlc3RJZCgpLCBjb2RlKTsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKGxvZ01lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9TZXR0aW5ncy5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9TZXR0aW5ncy5qYXZhCmluZGV4IDA1OTE2M2UuLmFlMzVkMGYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvU2V0dGluZ3MuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL1NldHRpbmdzLmphdmEKQEAgLTEwMSwxNiArMTAxLDYgQEAKICAgICBwdWJsaWMgaW50IHRocmVhZFBvb2xCb3NzID0gMTsKIAogICAgIC8qKgotICAgICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGEgcmVxdWVzdCAoc2NyaXB0IG9yIGJ5dGVjb2RlKSB0byBjb21wbGV0ZSBleGVjdXRpb24uICBEZWZhdWx0cyB0byAtMSBhbmQKLSAgICAgKiB0aHVzIGRlZmVycyB0byB7QGxpbmsgI2V2YWx1YXRpb25UaW1lb3V0fSBmb3IgdGhpcyBjb25maWd1cmF0aW9uLiBXaGVuIHNldCB0byBzb21ldGhpbmcgZ3JlYXRlciB0aGFuIC0xIHRoZW4KLSAgICAgKiB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgdXNlZC4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjksIHJlcGxhY2VkIGJ5IHtAbGluayAjZXZhbHVhdGlvblRpbWVvdXR9LgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIGxvbmcgc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQgPSAtMUw7Ci0KLSAgICAvKioKICAgICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBhIHJlcXVlc3QgKHNjcmlwdCBvciBieXRlY29kZSkgdG8gY29tcGxldGUgZXhlY3V0aW9uLiBEZWZhdWx0cyB0byAzMDAwMC4KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBldmFsdWF0aW9uVGltZW91dCA9IDMwMDAwTDsKQEAgLTI1NSw3ICsyNDUsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBsb25nIGdldEV2YWx1YXRpb25UaW1lb3V0KCkgewotICAgICAgICByZXR1cm4gLTEgPT0gc2NyaXB0RXZhbHVhdGlvblRpbWVvdXQgPyBldmFsdWF0aW9uVGltZW91dCA6IHNjcmlwdEV2YWx1YXRpb25UaW1lb3V0OworICAgICAgICByZXR1cm4gZXZhbHVhdGlvblRpbWVvdXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NDgsNDEgKzQzOCw2IEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFguNTA5IGNlcnRpZmljYXRlIGNoYWluIGZpbGUgaW4gUEVNIGZvcm1hdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAja2V5U3RvcmV9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgU3RyaW5nIGtleUNlcnRDaGFpbkZpbGUgPSBudWxsOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgUEtDUyM4IHByaXZhdGUga2V5IGZpbGUgaW4gUEVNIGZvcm1hdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAja2V5U3RvcmV9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgU3RyaW5nIGtleUZpbGUgPSBudWxsOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcGFzc3dvcmQgb2YgdGhlIHtAbGluayAja2V5RmlsZX0sIG9yIHtAY29kZSBudWxsfSBpZiBpdCdzIG5vdAotICAgICAgICAgKiBwYXNzd29yZC1wcm90ZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4yLjEwLCByZXBsYWNlZCBieSB7QGxpbmsgI2tleVN0b3JlUGFzc3dvcmR9Ci0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgU3RyaW5nIGtleVBhc3N3b3JkID0gbnVsbDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZm9yIHZlcmlmeWluZyB0aGUgcmVtb3RlIGVuZHBvaW50J3MgY2VydGlmaWNhdGUuIFRoZQotICAgICAgICAgKiBmaWxlIHNob3VsZCBjb250YWluIGFuIFguNTA5IGNlcnRpZmljYXRlIGNoYWluIGluIFBFTSBmb3JtYXQuIHtAY29kZSBudWxsfQotICAgICAgICAgKiB1c2VzIHRoZSBzeXN0ZW0gZGVmYXVsdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjIuMTAsIHJlcGxhY2VkIGJ5IHtAbGluayAjdHJ1c3RTdG9yZX0KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdHJ1c3RDZXJ0Q2hhaW5GaWxlID0gbnVsbDsKLQotICAgICAgICAvKioKICAgICAgICAgICogVGhlIGZpbGUgbG9jYXRpb24gb2YgdGhlIHByaXZhdGUga2V5IGluIEpLUyBvciBQS0NTIzEyIGZvcm1hdC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTdHJpbmcga2V5U3RvcmU7CmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2F1dGgvS3JiNUF1dGhlbnRpY2F0b3IuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvYXV0aC9LcmI1QXV0aGVudGljYXRvci5qYXZhCmluZGV4IDZhMzM5YzQuLjdhYmY5YWMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvYXV0aC9LcmI1QXV0aGVudGljYXRvci5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvYXV0aC9LcmI1QXV0aGVudGljYXRvci5qYXZhCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICBwcmluY2lwYWxOYW1lID0gKFN0cmluZykgY29uZmlnLmdldChQUklOQ0lQQUxfS0VZKTsKICAgICAgICAgICAgIHN1YmplY3QgPSBKYWFzS3JiVXRpbC5sb2dpblVzaW5nS2V5dGFiKHByaW5jaXBhbE5hbWUsIGtleXRhYkZpbGUpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkZhaWxlZCB0byBsb2dpbiB0byBrZGMiKTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGYWlsZWQgdG8gbG9naW4gdG8ga2RjOiIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRG9uZSBsb2dnaW5nIGluIHRvIGtkYyIpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgLy8gICBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvc2VjdXJpdHkvc2FzbC9zYXNsLXJlZmd1aWRlLmh0bWwjU0VSVkVSCiAgICAgICAgICAgICAgICAgLy8gUmVseSBvbiBHU1NBUEkgZGVmYXVsdHMgZm9yIFNhc2wuTUFYX0JVRkZFUiBhbmQgU2FzbC5RT1AuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgZ3JlbWxpbi1kcml2ZXIgaGFzCiAgICAgICAgICAgICAgICAgLy8gU2FzbC5TRVJWRVJfQVVUSCBmaXhlZCB0byB0cnVlIChtdXR1YWwgYXV0aGVudGljYXRpb24pIGFuZCBvbmUgY2FuIGNvbmZpZ3VyZSBTU0wgZm9yIGVuaGFuY2VkIGNvbmZpZGVudGlhbGl0eSwKLSAgICAgICAgICAgICAgICAvLyBTYXNsIHBvbGljeSBwcm9wZXJ0aWVzIGZvciBuZWdvdGlhdGluZyB0aGUgYXV0aGVudGljYXRpbiBtZWNoYW5pc20gYXJlIG5vdCByZWxldmFudCBoZXJlLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gU2FzbCBwb2xpY3kgcHJvcGVydGllcyBmb3IgbmVnb3RpYXRpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBhcmUgbm90IHJlbGV2YW50IGhlcmUsIGJlY2F1c2UKICAgICAgICAgICAgICAgICAvLyBHU1NBUEkgaXMgdGhlIG9ubHkgYXZhaWxhYmxlIG1lY2hhbmlzbSBmb3IgdGhpcyBhdXRoZW50aWNhdG9yCiAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgICAgICBpZiAocHJpbmNpcGFsTmFtZSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2NoYW5uZWwvTmlvQ2hhbm5lbGl6ZXIuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvY2hhbm5lbC9OaW9DaGFubmVsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQzNTgwLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvY2hhbm5lbC9OaW9DaGFubmVsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmNoYW5uZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zaW1wbGUuV2ViU29ja2V0Q2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLkFic3RyYWN0Q2hhbm5lbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuQ2hhbm5lbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuYXV0aC5BbGxvd0FsbEF1dGhlbnRpY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlci5HcmVtbGluUmVzcG9uc2VGcmFtZUVuY29kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlci5OaW9HcmVtbGluQmluYXJ5UmVxdWVzdERlY29kZXI7Ci1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsUGlwZWxpbmU7Ci1pbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5sb2dnaW5nLkxvZ0xldmVsOwotaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIubG9nZ2luZy5Mb2dnaW5nSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5oYW5kbGVyLk5pb0dyZW1saW5SZXNwb25zZUZyYW1lRW5jb2RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5oYW5kbGVyLlNhc2xBdXRoZW50aWNhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIudXRpbC5TZXJ2ZXJHcmVtbGluRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBBIHtAbGluayBDaGFubmVsaXplcn0gdGhhdCBleHBvc2VzIGFuIE5JTy1iYXNlZCBHcmVtbGluIGVuZHBvaW50IHdpdGggYSBjdXN0b20gcHJvdG9jb2wuCi0gKgotICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQotICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuMTAsIG5vdCByZXBsYWNlZCwgdXNlIHtAbGluayBXZWJTb2NrZXRDbGllbnR9LgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIE5pb0NoYW5uZWxpemVyIGV4dGVuZHMgQWJzdHJhY3RDaGFubmVsaXplciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5pb0NoYW5uZWxpemVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU2FzbEF1dGhlbnRpY2F0aW9uSGFuZGxlciBhdXRoZW50aWNhdGlvbkhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBHcmVtbGluUmVzcG9uc2VGcmFtZUVuY29kZXIgZ3JlbWxpblJlc3BvbnNlRnJhbWVFbmNvZGVyOwotICAgIHByaXZhdGUgTmlvR3JlbWxpblJlc3BvbnNlRnJhbWVFbmNvZGVyIG5pb0dyZW1saW5SZXNwb25zZUZyYW1lRW5jb2RlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgU2VydmVyR3JlbWxpbkV4ZWN1dG9yIHNlcnZlckdyZW1saW5FeGVjdXRvcikgewotICAgICAgICBzdXBlci5pbml0KHNlcnZlckdyZW1saW5FeGVjdXRvcik7Ci0KLSAgICAgICAgLy8gY29uZmlndXJlIGF1dGhlbnRpY2F0aW9uIC0gbnVsbCBtZWFucyBkb24ndCBib3RoZXIgdG8gYWRkIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBwaXBlbGluZQotICAgICAgICBpZiAoYXV0aGVudGljYXRvciAhPSBudWxsKQotICAgICAgICAgICAgYXV0aGVudGljYXRpb25IYW5kbGVyID0gYXV0aGVudGljYXRvci5nZXRDbGFzcygpID09IEFsbG93QWxsQXV0aGVudGljYXRvci5jbGFzcyA/Ci0gICAgICAgICAgICAgICAgICAgIG51bGwgOiBuZXcgU2FzbEF1dGhlbnRpY2F0aW9uSGFuZGxlcihhdXRoZW50aWNhdG9yLCBzZXR0aW5ncy5hdXRoZW50aWNhdGlvbik7Ci0KLSAgICAgICAgZ3JlbWxpblJlc3BvbnNlRnJhbWVFbmNvZGVyID0gbmV3IEdyZW1saW5SZXNwb25zZUZyYW1lRW5jb2RlcigpOwotICAgICAgICBuaW9HcmVtbGluUmVzcG9uc2VGcmFtZUVuY29kZXIgPSBuZXcgTmlvR3JlbWxpblJlc3BvbnNlRnJhbWVFbmNvZGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIENoYW5uZWxQaXBlbGluZSBwaXBlbGluZSkgewotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KG5ldyBMb2dnaW5nSGFuZGxlcigibG9nLWlvIiwgTG9nTGV2ZWwuREVCVUcpKTsKLQotICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJuaW8tZnJhbWUtZW5jb2RlciIsIG5pb0dyZW1saW5SZXNwb25zZUZyYW1lRW5jb2Rlcik7Ci0gICAgICAgIHBpcGVsaW5lLmFkZExhc3QoInJlc3BvbnNlLWZyYW1lLWVuY29kZXIiLCBncmVtbGluUmVzcG9uc2VGcmFtZUVuY29kZXIpOwotICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJyZXF1ZXN0LWJpbmFyeS1kZWNvZGVyIiwgbmV3IE5pb0dyZW1saW5CaW5hcnlSZXF1ZXN0RGVjb2RlcihzZXJpYWxpemVycykpOwotCi0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QobmV3IExvZ2dpbmdIYW5kbGVyKCJsb2ctY29kZWMiLCBMb2dMZXZlbC5ERUJVRykpOwotCi0gICAgICAgIGlmIChhdXRoZW50aWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoUElQRUxJTkVfQVVUSEVOVElDQVRPUiwgYXV0aGVudGljYXRpb25IYW5kbGVyKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL05pb0dyZW1saW5CaW5hcnlSZXF1ZXN0RGVjb2Rlci5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL05pb0dyZW1saW5CaW5hcnlSZXF1ZXN0RGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA5MTQzLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9OaW9HcmVtbGluQmluYXJ5UmVxdWVzdERlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlcjsKLQotaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuUmVwbGF5aW5nRGVjb2RlcjsKLWltcG9ydCBpby5uZXR0eS51dGlsLkNoYXJzZXRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLk1lc3NhZ2VTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLlNlcmlhbGl6YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7Ci1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2ltcGxlLldlYlNvY2tldENsaWVudDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCi0gKgotICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuMTAsIG5vdCByZXBsYWNlZCwgdXNlIHtAbGluayBXZWJTb2NrZXRDbGllbnR9LgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIE5pb0dyZW1saW5CaW5hcnlSZXF1ZXN0RGVjb2RlciBleHRlbmRzIFJlcGxheWluZ0RlY29kZXI8TmlvR3JlbWxpbkJpbmFyeVJlcXVlc3REZWNvZGVyLkRlY29kZXJTdGF0ZT4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihOaW9HcmVtbGluQmluYXJ5UmVxdWVzdERlY29kZXIuY2xhc3MpOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTWVzc2FnZVNlcmlhbGl6ZXI+IHNlcmlhbGl6ZXJzOwotICAgIHByaXZhdGUgaW50IG1lc3NhZ2VMZW5ndGg7Ci0KLSAgICBwdWJsaWMgTmlvR3JlbWxpbkJpbmFyeVJlcXVlc3REZWNvZGVyKGZpbmFsIE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXJpYWxpemVyPiBzZXJpYWxpemVycykgewotICAgICAgICBzdXBlcihEZWNvZGVyU3RhdGUuTUVTU0FHRV9MRU5HVEgpOwotICAgICAgICB0aGlzLnNlcmlhbGl6ZXJzID0gc2VyaWFsaXplcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlKGZpbmFsIENoYW5uZWxIYW5kbGVyQ29udGV4dCBjaGFubmVsSGFuZGxlckNvbnRleHQsIGZpbmFsIEJ5dGVCdWYgYnl0ZUJ1ZiwgZmluYWwgTGlzdDxPYmplY3Q+IG9iamVjdHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzd2l0Y2ggKHN0YXRlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUxlbmd0aCA9IGJ5dGVCdWYucmVhZEludCgpOwotICAgICAgICAgICAgICAgIGNoZWNrcG9pbnQoRGVjb2RlclN0YXRlLk1FU1NBR0UpOwotICAgICAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWYgbWVzc2FnZUZyYW1lID0gYnl0ZUJ1Zi5yZWFkQnl0ZXMobWVzc2FnZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50VHlwZUxlbmd0aCA9IG1lc3NhZ2VGcmFtZS5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQnVmIGNvbnRlbnRUeXBlRnJhbWUgPSBtZXNzYWdlRnJhbWUucmVhZEJ5dGVzKGNvbnRlbnRUeXBlTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVGcmFtZS50b1N0cmluZyhDaGFyc2V0VXRpbC5VVEZfOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc2VyaWFsaXplciB0byB1c2UgaGFzIGJlZW4gR3JhcGhTT04gMS4wIHRvIHRoaXMgcG9pbnQgKHdoaWNoIHdhcyBwcm9iYWJseSBiYWQpLAotICAgICAgICAgICAgICAgICAgICAvLyBzbyBtYWludGFpbiB0aGF0IGZvciAzLjMueAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBzZXJpYWxpemVyID0gc2VsZWN0KGNvbnRlbnRUeXBlLCBTZXJ2ZXJTZXJpYWxpemVycy5ERUZBVUxUX1NFUklBTElaRVIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgaW1wb3J0YW50IHRvIHJlLWluaXRpYWxpemUgdGhlc2UgY2hhbm5lbCBhdHRyaWJ1dGVzIGFzIHRoZXkgYXBwbHkgZ2xvYmFsbHkgdG8gdGhlIGNoYW5uZWwuIGluCi0gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIHdvcmRzLCB0aGUgbmV4dCByZXF1ZXN0IHRvIHRoaXMgY2hhbm5lbCBtaWdodCBub3QgY29tZSB3aXRoIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYW5kIG1peGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlIGNhbiBjYXJyeSB0aHJvdWdoIGZyb20gb25lIHJlcXVlc3QgdG8gdGhlIG5leHQKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LmNoYW5uZWwoKS5hdHRyKFN0YXRlS2V5LlNFU1NJT04pLnNldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LmNoYW5uZWwoKS5hdHRyKFN0YXRlS2V5LlNFUklBTElaRVIpLnNldChzZXJpYWxpemVyKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LmNoYW5uZWwoKS5hdHRyKFN0YXRlS2V5LlVTRV9CSU5BUlkpLnNldCh0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdCB0aGUgY29udGVudFR5cGVMZW5ndGggYW5kIHRoZSBieXRlIHRoYXQgaGVsZCBpdCBmcm9tIHRoZSBmdWxsIG1lc3NhZ2UgbGVuZ3RoIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgaG93IGxvbmcgdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2UgaXMKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHBheWxvYWRMZW5ndGggPSBtZXNzYWdlTGVuZ3RoIC0gMSAtIGNvbnRlbnRUeXBlTGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChzZXJpYWxpemVyLmRlc2VyaWFsaXplUmVxdWVzdChtZXNzYWdlRnJhbWUucmVhZEJ5dGVzKHBheWxvYWRMZW5ndGgpKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VyaWFsaXphdGlvbkV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChSZXF1ZXN0TWVzc2FnZS5JTlZBTElEKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGVja3BvaW50KERlY29kZXJTdGF0ZS5NRVNTQUdFX0xFTkdUSCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtZXNzYWdlIHNlbnQgdG8gR3JlbWxpbiBTZXJ2ZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlU2VyaWFsaXplciBzZWxlY3QoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBkZWZhdWx0U2VyaWFsaXplcikgewotICAgICAgICBpZiAobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSAmJiAhc2VyaWFsaXplcnMuY29udGFpbnNLZXkobWltZVR5cGUpKQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkdyZW1saW4gU2VydmVyIGlzIG5vdCBjb25maWd1cmVkIHdpdGggYSBzZXJpYWxpemVyIGZvciB0aGUgcmVxdWVzdGVkIG1pbWUgdHlwZSBbe31dIC0gdXNpbmcge30gYnkgZGVmYXVsdCIsCi0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLCBkZWZhdWx0U2VyaWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXJzLmdldE9yRGVmYXVsdChtaW1lVHlwZSwgZGVmYXVsdFNlcmlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBlbnVtIERlY29kZXJTdGF0ZSB7Ci0gICAgICAgIE1FU1NBR0VfTEVOR1RILAotICAgICAgICBNRVNTQUdFCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL05pb0dyZW1saW5SZXNwb25zZUZyYW1lRW5jb2Rlci5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL05pb0dyZW1saW5SZXNwb25zZUZyYW1lRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZjOThlLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9OaW9HcmVtbGluUmVzcG9uc2VGcmFtZUVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5oYW5kbGVyOwotCi1pbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7Ci1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlcjsKLWltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKLWltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLk1lc3NhZ2VUb0J5dGVFbmNvZGVyOwotaW1wb3J0IGlvLm5ldHR5LnV0aWwuQ2hhcnNldFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2ltcGxlLldlYlNvY2tldENsaWVudDsKLQotLyoqCi0gKiBFbmNvZGVzIHtAY29kZSBCeXRlQnVmfSBhbmQge0Bjb2RlIFN0cmluZ30gdmFsdWVzIHRvIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gb3ZlciBOSU8uCi0gKgotICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQotICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuMTAsIG5vdCByZXBsYWNlZCwgdXNlIHtAbGluayBXZWJTb2NrZXRDbGllbnR9LgotICovCi1ARGVwcmVjYXRlZAotQENoYW5uZWxIYW5kbGVyLlNoYXJhYmxlCi1wdWJsaWMgY2xhc3MgTmlvR3JlbWxpblJlc3BvbnNlRnJhbWVFbmNvZGVyIGV4dGVuZHMgTWVzc2FnZVRvQnl0ZUVuY29kZXI8RnJhbWU+IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmNvZGUoZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgZmluYWwgRnJhbWUgZnJhbWUsIGZpbmFsIEJ5dGVCdWYgYnl0ZUJ1ZikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmcmFtZS5nZXRNc2coKSBpbnN0YW5jZW9mIEJ5dGVCdWYpIHsKLSAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWYgYnl0ZXMgPSAoQnl0ZUJ1ZikgZnJhbWUuZ2V0TXNnKCk7Ci0gICAgICAgICAgICBieXRlQnVmLndyaXRlSW50KGJ5dGVzLmNhcGFjaXR5KCkpOwotICAgICAgICAgICAgYnl0ZUJ1Zi53cml0ZUJ5dGVzKGJ5dGVzKTsKLSAgICAgICAgICAgIGJ5dGVzLnJlbGVhc2UoKTsKLSAgICAgICAgfSBlbHNlIGlmIChmcmFtZS5nZXRNc2coKSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgZmluYWwgYnl0ZSBbXSBieXRlcyA9ICgoU3RyaW5nKSBmcmFtZS5nZXRNc2coKSkuZ2V0Qnl0ZXMoQ2hhcnNldFV0aWwuVVRGXzgpOwotICAgICAgICAgICAgYnl0ZUJ1Zi53cml0ZUludChieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgYnl0ZUJ1Zi53cml0ZUJ5dGVzKGJ5dGVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9TYXNsQXV0aGVudGljYXRpb25IYW5kbGVyLmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2hhbmRsZXIvU2FzbEF1dGhlbnRpY2F0aW9uSGFuZGxlci5qYXZhCmluZGV4IDNlMTFhZTguLjZiMmQyNDggMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9TYXNsQXV0aGVudGljYXRpb25IYW5kbGVyLmphdmEKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL1Nhc2xBdXRoZW50aWNhdGlvbkhhbmRsZXIuamF2YQpAQCAtMjEsOCArMjEsNiBAQAogaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyOwogaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEhhbmRsZXJDb250ZXh0OwotaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEluYm91bmRIYW5kbGVyQWRhcHRlcjsKLWltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmJhc2U2NC5CYXNlNjREZWNvZGVyOwogaW1wb3J0IGlvLm5ldHR5LnV0aWwuQXR0cmlidXRlOwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CkBAIC0zNywxMyArMzUsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlcXVlc3RNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVzcG9uc2VNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVzcG9uc2VTdGF0dXNDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLkNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuR3JlbWxpblNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5TZXR0aW5nczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5hdXRoLkF1dGhlbnRpY2F0ZWRVc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmF1dGguQXV0aGVudGljYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuYXV0aC5BdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmNoYW5uZWwuTmlvQ2hhbm5lbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuY2hhbm5lbC5XZWJTb2NrZXRDaGFubmVsaXplcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtNTEsNyArNDcsNiBAQAogLyoqCiAgKiBBIFNBU0wgYXV0aGVudGljYXRpb24gaGFuZGxlciB0aGF0IGFsbG93cyB0aGUge0BsaW5rIEF1dGhlbnRpY2F0b3J9IHRvIGJlIHBsdWdnZWQgaW50byBpdC4gVGhpcyBoYW5kbGVyIGlzIG1lYW50CiAgKiB0byBiZSB1c2VkIHdpdGggcHJvdG9jb2xzIHRoYXQgcHJvY2VzcyBhIHtAbGluayBSZXF1ZXN0TWVzc2FnZX0gc3VjaCBhcyB0aGUge0BsaW5rIFdlYlNvY2tldENoYW5uZWxpemVyfQotICogb3IgdGhlIHtAbGluayBOaW9DaGFubmVsaXplcn0KICAqCiAgKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCiAgKi8KZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9TZXJ2ZXJTZXJpYWxpemVycy5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL1NlcnZlclNlcmlhbGl6ZXJzLmphdmEKaW5kZXggZDU5ZTFlZC4uMDliNzU5OSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL1NlcnZlclNlcmlhbGl6ZXJzLmphdmEKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL1NlcnZlclNlcmlhbGl6ZXJzLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLk1lc3NhZ2VTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjFkMDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuU2VyaWFsaXplcnM7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhTT05NZXNzYWdlU2VyaWFsaXplclYzZDA7CiAKIC8qKgogICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQpAQCAtMzAsMTAgKzMwLDE1IEBACiAgICAgcHJpdmF0ZSBTZXJ2ZXJTZXJpYWxpemVycygpIHt9CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IHNlcmlhbGl6ZXIgdXNlZCBieSB0aGUgc2VydmVyIHdoZW4gdGhlIHNlcmlhbGl6ZXIgcmVxdWVzdGVkIGRvZXMgbm90IG1hdGNoIHdoYXQgaXMgb24gdGhlIHNlcnZlci4KLSAgICAgKiBVc2luZyBHcmFwaFNPTiAxLjAgb24gMy4zLjUgYmVjYXVzZSB0aGF0J3Mgd2hhdCBpdCBoYXMgbG9uZyBiZWVuIHNldCB0byBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvbgotICAgICAqIHtAbGluayBTZXJpYWxpemVycyNERUZBVUxUX1JFU1VMVF9TRVJJQUxJWkVSfSB3aGljaCBpcyBub3cgZGVwcmVjYXRlZC4KKyAgICAgKiBEZWZhdWx0IGJpbmFyeSBzZXJpYWxpemVyIHVzZWQgYnkgdGhlIHNlcnZlciB3aGVuIHRoZSBzZXJpYWxpemVyIHJlcXVlc3RlZCBkb2VzIG5vdCBtYXRjaCB3aGF0IGlzIG9uIHRoZSBzZXJ2ZXIuCisgICAgICogVGhpcyBkZWZhdWx0cyB0byBHcmFwaEJpbmFyeSAxLjAuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIERFRkFVTFRfU0VSSUFMSVpFUiA9IG5ldyBHcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjFkMCgpOworICAgIHN0YXRpYyBmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBERUZBVUxUX0JJTkFSWV9TRVJJQUxJWkVSID0gbmV3IEdyYXBoQmluYXJ5TWVzc2FnZVNlcmlhbGl6ZXJWMSgpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBiaW5hcnkgc2VyaWFsaXplciB1c2VkIGJ5IHRoZSBzZXJ2ZXIgd2hlbiB0aGUgc2VyaWFsaXplciByZXF1ZXN0ZWQgZG9lcyBub3QgbWF0Y2ggd2hhdCBpcyBvbiB0aGUgc2VydmVyLgorICAgICAqIFRoaXMgZGVmYXVsdHMgdG8gR3JhcGhTT04gMy4wLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBERUZBVUxUX1RFWFRfU0VSSUFMSVpFUiA9IG5ldyBHcmFwaFNPTk1lc3NhZ2VTZXJpYWxpemVyVjNkMCgpOwogCiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2hhbmRsZXIvV3NHcmVtbGluQmluYXJ5UmVxdWVzdERlY29kZXIuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9Xc0dyZW1saW5CaW5hcnlSZXF1ZXN0RGVjb2Rlci5qYXZhCmluZGV4IGE1NmQwMTcuLmUzYjYxYmMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9Xc0dyZW1saW5CaW5hcnlSZXF1ZXN0RGVjb2Rlci5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9Xc0dyZW1saW5CaW5hcnlSZXF1ZXN0RGVjb2Rlci5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtZXNzYWdlQnl0ZXMucmVhZEJ5dGVzKGNvbnRlbnRUeXBlQnl0ZXMpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVCeXRlcy50b1N0cmluZyhVVEY4KTsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBzZWxlY3QoY29udGVudFR5cGUsIFNlcnZlclNlcmlhbGl6ZXJzLkRFRkFVTFRfU0VSSUFMSVpFUik7CisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBzZXJpYWxpemVyID0gc2VsZWN0KGNvbnRlbnRUeXBlLCBTZXJ2ZXJTZXJpYWxpemVycy5ERUZBVUxUX0JJTkFSWV9TRVJJQUxJWkVSKTsKIAogICAgICAgICAgICAgLy8gaXQncyBpbXBvcnRhbnQgdG8gcmUtaW5pdGlhbGl6ZSB0aGVzZSBjaGFubmVsIGF0dHJpYnV0ZXMgYXMgdGhleSBhcHBseSBnbG9iYWxseSB0byB0aGUgY2hhbm5lbC4gaW4KICAgICAgICAgICAgIC8vIG90aGVyIHdvcmRzLCB0aGUgbmV4dCByZXF1ZXN0IHRvIHRoaXMgY2hhbm5lbCBtaWdodCBub3QgY29tZSB3aXRoIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYW5kIG1peGVkCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2hhbmRsZXIvV3NHcmVtbGluQ2xvc2VSZXF1ZXN0RGVjb2Rlci5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL1dzR3JlbWxpbkNsb3NlUmVxdWVzdERlY29kZXIuamF2YQppbmRleCA4NTY3ZmYwLi42MjgxODUxIDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2hhbmRsZXIvV3NHcmVtbGluQ2xvc2VSZXF1ZXN0RGVjb2Rlci5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9Xc0dyZW1saW5DbG9zZVJlcXVlc3REZWNvZGVyLmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5NZXNzYWdlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlcXVlc3RNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5TZXJpYWxpemF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5TZXJpYWxpemVyczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC02NCw3ICs2Myw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtZXNzYWdlQnl0ZXMucmVhZEJ5dGVzKGNvbnRlbnRUeXBlQnl0ZXMpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVCeXRlcy50b1N0cmluZyhVVEY4KTsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBzZWxlY3QoY29udGVudFR5cGUsIFNlcnZlclNlcmlhbGl6ZXJzLkRFRkFVTFRfU0VSSUFMSVpFUik7CisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlU2VyaWFsaXplciBzZXJpYWxpemVyID0gc2VsZWN0KGNvbnRlbnRUeXBlLCBTZXJ2ZXJTZXJpYWxpemVycy5ERUZBVUxUX0JJTkFSWV9TRVJJQUxJWkVSKTsKIAogICAgICAgICAgICAgLy8gaXQncyBpbXBvcnRhbnQgdG8gcmUtaW5pdGlhbGl6ZSB0aGVzZSBjaGFubmVsIGF0dHJpYnV0ZXMgYXMgdGhleSBhcHBseSBnbG9iYWxseSB0byB0aGUgY2hhbm5lbC4gaW4KICAgICAgICAgICAgIC8vIG90aGVyIHdvcmRzLCB0aGUgbmV4dCByZXF1ZXN0IHRvIHRoaXMgY2hhbm5lbCBtaWdodCBub3QgY29tZSB3aXRoIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYW5kIG1peGVkCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2hhbmRsZXIvV3NHcmVtbGluVGV4dFJlcXVlc3REZWNvZGVyLmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2hhbmRsZXIvV3NHcmVtbGluVGV4dFJlcXVlc3REZWNvZGVyLmphdmEKaW5kZXggMGY2MTRjYS4uNzc0NzJhYyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9oYW5kbGVyL1dzR3JlbWxpblRleHRSZXF1ZXN0RGVjb2Rlci5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvaGFuZGxlci9Xc0dyZW1saW5UZXh0UmVxdWVzdERlY29kZXIuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZShmaW5hbCBDaGFubmVsSGFuZGxlckNvbnRleHQgY2hhbm5lbEhhbmRsZXJDb250ZXh0LCBmaW5hbCBUZXh0V2ViU29ja2V0RnJhbWUgZnJhbWUsIGZpbmFsIExpc3Q8T2JqZWN0PiBvYmplY3RzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHNlcmlhbGl6ZXIgbXVzdCBiZSBhIE1lc3NhZ2VUZXh0U2VyaWFsaXplciBpbnN0YW5jZSB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBkZWNvZGVyCi0gICAgICAgICAgICBmaW5hbCBNZXNzYWdlVGV4dFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IChNZXNzYWdlVGV4dFNlcmlhbGl6ZXIpIHNlbGVjdCgiYXBwbGljYXRpb24vanNvbiIsIFNlcnZlclNlcmlhbGl6ZXJzLkRFRkFVTFRfU0VSSUFMSVpFUik7CisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlVGV4dFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IChNZXNzYWdlVGV4dFNlcmlhbGl6ZXIpIHNlbGVjdCgiYXBwbGljYXRpb24vanNvbiIsIFNlcnZlclNlcmlhbGl6ZXJzLkRFRkFVTFRfVEVYVF9TRVJJQUxJWkVSKTsKIAogICAgICAgICAgICAgLy8gaXQncyBpbXBvcnRhbnQgdG8gcmUtaW5pdGlhbGl6ZSB0aGVzZSBjaGFubmVsIGF0dHJpYnV0ZXMgYXMgdGhleSBhcHBseSBnbG9iYWxseSB0byB0aGUgY2hhbm5lbC4gaW4KICAgICAgICAgICAgIC8vIG90aGVyIHdvcmRzLCB0aGUgbmV4dCByZXF1ZXN0IHRvIHRoaXMgY2hhbm5lbCBtaWdodCBub3QgY29tZSB3aXRoIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYW5kIG1peGVkCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL29wL0Fic3RyYWN0RXZhbE9wUHJvY2Vzc29yLmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL29wL0Fic3RyYWN0RXZhbE9wUHJvY2Vzc29yLmphdmEKaW5kZXggMjYyMGU0Ny4uZmQ0NDkxYyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9BYnN0cmFjdEV2YWxPcFByb2Nlc3Nvci5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvb3AvQWJzdHJhY3RFdmFsT3BQcm9jZXNzb3IuamF2YQpAQCAtMzAsNyArMzAsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUG9wOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuU2NvcGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuT3BQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuUmVzcG9uc2VIYW5kbGVyQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Db2x1bW47CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5Db250ZXh0OwpAQCAtMTkwLDE1ICsxODksNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIHJlcGxhY2VkIGJ5IHtAbGluayAjZXZhbE9wSW50ZXJuYWwoQ29udGV4dCwgU3VwcGxpZXIsIEJpbmRpbmdTdXBwbGllcil9LgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIHZvaWQgZXZhbE9wSW50ZXJuYWwoZmluYWwgUmVzcG9uc2VIYW5kbGVyQ29udGV4dCBjdHgsIGZpbmFsIFN1cHBsaWVyPEdyZW1saW5FeGVjdXRvcj4gZ3JlbWxpbkV4ZWN1dG9yU3VwcGxpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQmluZGluZ1N1cHBsaWVyIGJpbmRpbmdzU3VwcGxpZXIpIHRocm93cyBPcFByb2Nlc3NvckV4Y2VwdGlvbiB7Ci0gICAgICAgIGV2YWxPcEludGVybmFsKGN0eC5nZXRDb250ZXh0KCksIGdyZW1saW5FeGVjdXRvclN1cHBsaWVyLCBiaW5kaW5nc1N1cHBsaWVyKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBIGdlbmVyYWxpemVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSAiZXZhbCIgb3BlcmF0aW9uLiAgSXQgaGFuZGxlcyBzY3JpcHQgZXZhbHVhdGlvbiBhbmQgaXRlcmF0aW9uIG9mIHJlc3VsdHMKICAgICAgKiBzbyBhcyB0byB3cml0ZSB7QGxpbmsgUmVzcG9uc2VNZXNzYWdlfSBvYmplY3RzIGRvd24gdGhlIE5ldHR5IHBpcGVsaW5lLiAgSXQgYWxzbyBoYW5kbGVzIHNjcmlwdCB0aW1lb3V0cywKICAgICAgKiBpdGVyYXRpb24gdGltZW91dHMsIG1ldHJpY3MgYW5kIGJ1aWxkaW5nIGJpbmRpbmdzLiAgTm90ZSB0aGF0IHJlc3VsdCBpdGVyYXRpb24gaXMgZGVsZWdhdGVkIHRvIHRoZQpAQCAtMjMwLDExICsyMjAsOCBAQAogCiAgICAgICAgIC8vIHRpbWVvdXQgb3ZlcnJpZGUgLSBoYW5kbGUgYm90aCBkZXByZWNhdGVkIGFuZCBuZXdseSBuYW1lZCBjb25maWd1cmF0aW9uLiBlYXJsaWVyIGxvZ2ljIHNob3VsZCBwcmV2ZW50CiAgICAgICAgIC8vIGJvdGggY29uZmlndXJhdGlvbnMgZnJvbSBiZWluZyBzdWJtaXR0ZWQgYXQgdGhlIHNhbWUgdGltZQotICAgICAgICBmaW5hbCBsb25nIHNldG8gPSBhcmdzLmNvbnRhaW5zS2V5KFRva2Vucy5BUkdTX1NDUklQVF9FVkFMX1RJTUVPVVQpIHx8IGFyZ3MuY29udGFpbnNLZXkoVG9rZW5zLkFSR1NfRVZBTF9USU1FT1VUKQotICAgICAgICAgICAgLy8gY291bGQgYmUgc2VudCBhcyBhbiBpbnRlZ2VyIG9yIGxvbmcKLSAgICAgICAgICAgID8gKGFyZ3MuY29udGFpbnNLZXkoVG9rZW5zLkFSR1NfU0NSSVBUX0VWQUxfVElNRU9VVCkgPwotICAgICAgICAgICAgICAgICgoTnVtYmVyKSBhcmdzLmdldChUb2tlbnMuQVJHU19TQ1JJUFRfRVZBTF9USU1FT1VUKSkubG9uZ1ZhbHVlKCkgOiAoKE51bWJlcikgYXJncy5nZXQoVG9rZW5zLkFSR1NfRVZBTF9USU1FT1VUKSkubG9uZ1ZhbHVlKCkpCi0gICAgICAgICAgICA6IHNldHRpbmdzLmdldEV2YWx1YXRpb25UaW1lb3V0KCk7CisgICAgICAgIGZpbmFsIGxvbmcgc2V0byA9IGFyZ3MuY29udGFpbnNLZXkoVG9rZW5zLkFSR1NfRVZBTF9USU1FT1VUKSA/CisgICAgICAgICAgICAgICAgKChOdW1iZXIpIGFyZ3MuZ2V0KFRva2Vucy5BUkdTX0VWQUxfVElNRU9VVCkpLmxvbmdWYWx1ZSgpIDogc2V0dGluZ3MuZ2V0RXZhbHVhdGlvblRpbWVvdXQoKTsKIAogICAgICAgICBmaW5hbCBHcmVtbGluRXhlY3V0b3IuTGlmZUN5Y2xlIGxpZmVDeWNsZSA9IEdyZW1saW5FeGVjdXRvci5MaWZlQ3ljbGUuYnVpbGQoKQogICAgICAgICAgICAgICAgIC5ldmFsdWF0aW9uVGltZW91dE92ZXJyaWRlKHNldG8pCkBAIC0zMDMsMTMgKzI5MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTXVsdGlwbGVDb21waWxhdGlvbkVycm9yc0V4Y2VwdGlvbikgdCkuZ2V0RXJyb3JDb2xsZWN0b3IoKS5nZXRFcnJvckNvdW50KCkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIlRoZSBHcmVtbGluIHN0YXRlbWVudCB0aGF0IHdhcyBzdWJtaXR0ZWQgZXhjZWVkcyB0aGUgbWF4aW11bSBjb21waWxhdGlvbiBzaXplIGFsbG93ZWQgYnkgdGhlIEpWTSwgcGxlYXNlIHNwbGl0IGl0IGludG8gbXVsdGlwbGUgc21hbGxlciBzdGF0ZW1lbnRzIC0gJXMiLCB0cmltTWVzc2FnZShtc2cpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGVycm9yTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHgud3JpdGVBbmRGbHVzaChSZXNwb25zZU1lc3NhZ2UuYnVpbGQobXNnKS5jb2RlKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfU0NSSVBUX0VWQUxVQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICBjdHgud3JpdGVBbmRGbHVzaChSZXNwb25zZU1lc3NhZ2UuYnVpbGQobXNnKS5jb2RlKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfRVZBTFVBVElPTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXNNZXNzYWdlKGVycm9yTWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXNBdHRyaWJ1dGVFeGNlcHRpb24odCkuY3JlYXRlKCkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICAodC5nZXRNZXNzYWdlKCkgPT0gbnVsbCkgPyB0LnRvU3RyaW5nKCkgOiB0LmdldE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFN0cmluZy5mb3JtYXQoIkV4Y2VwdGlvbiBwcm9jZXNzaW5nIGEgc2NyaXB0IG9uIHJlcXVlc3QgWyVzXS4iLCBtc2cpLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN0eC53cml0ZUFuZEZsdXNoKFJlc3BvbnNlTWVzc2FnZS5idWlsZChtc2cpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9TQ1JJUFRfRVZBTFVBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC53cml0ZUFuZEZsdXNoKFJlc3BvbnNlTWVzc2FnZS5idWlsZChtc2cpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9FVkFMVUFUSU9OKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1c01lc3NhZ2UoZXJyb3JNZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1c0F0dHJpYnV0ZUV4Y2VwdGlvbih0KS5jcmVhdGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvb3AvQWJzdHJhY3RPcFByb2Nlc3Nvci5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9BYnN0cmFjdE9wUHJvY2Vzc29yLmphdmEKaW5kZXggNjI1NGIxZC4uMGI3MmVkNiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9BYnN0cmFjdE9wUHJvY2Vzc29yLmphdmEKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9BYnN0cmFjdE9wUHJvY2Vzc29yLmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5Db250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLkdyYXBoTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5PcFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5SZXNwb25zZUhhbmRsZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLlNldHRpbmdzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmhhbmRsZXIuRnJhbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlci5TdGF0ZUtleTsKQEAgLTY0LDE0ICs2Myw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IHJlcGxhY2VkLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlSXRlcmF0b3IoZmluYWwgUmVzcG9uc2VIYW5kbGVyQ29udGV4dCByaGMsIGZpbmFsIEl0ZXJhdG9yIGl0dHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZUl0ZXJhdG9yKHJoYy5nZXRDb250ZXh0KCksIGl0dHkpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFByb3ZpZGVzIGEgZ2VuZXJpYyB3YXkgb2YgaXRlcmF0aW5nIGEgcmVzdWx0IHNldCBiYWNrIHRvIHRoZSBjbGllbnQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgR3JlbWxpbiBTZXJ2ZXIge0BsaW5rIENvbnRleHR9IG9iamVjdCBjb250YWluaW5nIHNldHRpbmdzLCByZXF1ZXN0IG1lc3NhZ2UsIGV0Yy4KQEAgLTI0MiwyNCArMjMzLDExIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXR0eSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB7QGxpbmsgSXRlcmF0b3J9IG9mIHJlc3VsdHMgLSBpdCBpcyBub3QgbWVhbnQgdG8gYmUgZm9yd2FyZGVkIGluCiAgICAgICogICAgICAgICAgICAgdGhpcyBtZXRob2QKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuNC4wLCByZXBsYWNlZCBieSB7QGxpbmsgI2dlbmVyYXRlUmVzdWx0TWV0YURhdGEoQ2hhbm5lbEhhbmRsZXJDb250ZXh0LCBSZXF1ZXN0TWVzc2FnZSwgUmVzcG9uc2VTdGF0dXNDb2RlLCBJdGVyYXRvciwgU2V0dGluZ3MpfQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2VuZXJhdGVNZXRhRGF0YShmaW5hbCBDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LCBmaW5hbCBSZXF1ZXN0TWVzc2FnZSBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZVN0YXR1c0NvZGUgY29kZSwgZmluYWwgSXRlcmF0b3IgaXR0eSkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgcmVzcG9uc2UgcmVzdWx0IG1ldGEtZGF0YSB0byBwdXQgb24gYSB7QGxpbmsgUmVzcG9uc2VNZXNzYWdlfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdHR5IGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHtAbGluayBJdGVyYXRvcn0gb2YgcmVzdWx0cyAtIGl0IGlzIG5vdCBtZWFudCB0byBiZSBmb3J3YXJkZWQgaW4KLSAgICAgKiAgICAgICAgICAgICB0aGlzIG1ldGhvZAogICAgICAqLwogICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdlbmVyYXRlUmVzdWx0TWV0YURhdGEoZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2VTdGF0dXNDb2RlIGNvZGUsIGZpbmFsIEl0ZXJhdG9yIGl0dHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXR0aW5ncyBzZXR0aW5ncykgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVNZXRhRGF0YShjdHgsIG1zZywgY29kZSwgaXR0eSk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgwLDUwICsyNTgsNiBAQAogICAgICAgICByZXR1cm4gbWV0YURhdGE7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgcmVwbGFjZWQgYnkge0BsaW5rICNtYWtlRnJhbWUoQ29udGV4dCwgUmVxdWVzdE1lc3NhZ2UsIE1lc3NhZ2VTZXJpYWxpemVyLCBib29sZWFuLCBMaXN0LCBSZXNwb25zZVN0YXR1c0NvZGUsIE1hcCl9LgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBGcmFtZSBtYWtlRnJhbWUoZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIGZpbmFsIGJvb2xlYW4gdXNlQmluYXJ5LCBmaW5hbCBMaXN0PE9iamVjdD4gYWdncmVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlU3RhdHVzQ29kZSBjb2RlLCBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcmVzcG9uc2VNZXRhRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gc3RhdHVzQXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG5ldyBDb250ZXh0KG1zZywgY3R4LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsgLy8gZHVtbXkgY29udGV4dCwgZ29vZCBvbmx5IGZvciB3cml0aW5nIHJlc3BvbnNlIG1lc3NhZ2VzIHRvIHRoZSBjaGFubmVsCi0gICAgICAgIGZpbmFsIFJlc3BvbnNlSGFuZGxlckNvbnRleHQgcmhjID0gbmV3IFJlc3BvbnNlSGFuZGxlckNvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBtYWtlRnJhbWUocmhjLCBtc2csIHNlcmlhbGl6ZXIsIHVzZUJpbmFyeSwgYWdncmVnYXRlLCBjb2RlLCByZXNwb25zZU1ldGFEYXRhLCBzdGF0dXNBdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCByZXBsYWNlZCBieSB7QGxpbmsgI21ha2VGcmFtZShDb250ZXh0LCBSZXF1ZXN0TWVzc2FnZSwgTWVzc2FnZVNlcmlhbGl6ZXIsIGJvb2xlYW4sIExpc3QsIFJlc3BvbnNlU3RhdHVzQ29kZSwgTWFwKX0uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZyYW1lIG1ha2VGcmFtZShmaW5hbCBSZXNwb25zZUhhbmRsZXJDb250ZXh0IHJoYywgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIGZpbmFsIGJvb2xlYW4gdXNlQmluYXJ5LCBmaW5hbCBMaXN0PE9iamVjdD4gYWdncmVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlU3RhdHVzQ29kZSBjb2RlLCBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcmVzcG9uc2VNZXRhRGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYWtlRnJhbWUocmhjLmdldENvbnRleHQoKSwgbXNnLCBzZXJpYWxpemVyLCB1c2VCaW5hcnksYWdncmVnYXRlLCBjb2RlLCByZXNwb25zZU1ldGFEYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCByZXBsYWNlZCBieSB7QGxpbmsgI21ha2VGcmFtZShDb250ZXh0LCBSZXF1ZXN0TWVzc2FnZSwgTWVzc2FnZVNlcmlhbGl6ZXIsIGJvb2xlYW4sIExpc3QsIFJlc3BvbnNlU3RhdHVzQ29kZSwgTWFwKX0uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZyYW1lIG1ha2VGcmFtZShmaW5hbCBSZXNwb25zZUhhbmRsZXJDb250ZXh0IHJoYywgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIGZpbmFsIGJvb2xlYW4gdXNlQmluYXJ5LCBmaW5hbCBMaXN0PE9iamVjdD4gYWdncmVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlU3RhdHVzQ29kZSBjb2RlLCBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcmVzcG9uc2VNZXRhRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gc3RhdHVzQXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYWtlRnJhbWUocmhjLmdldENvbnRleHQoKSwgbXNnLCBzZXJpYWxpemVyLCB1c2VCaW5hcnksYWdncmVnYXRlLCBjb2RlLCByZXNwb25zZU1ldGFEYXRhLCBzdGF0dXNBdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuNC4zLCByZXBsYWNlZCBieSB7QGxpbmsgI21ha2VGcmFtZShDb250ZXh0LCBSZXF1ZXN0TWVzc2FnZSwgTWVzc2FnZVNlcmlhbGl6ZXIsIGJvb2xlYW4sIExpc3QsIFJlc3BvbnNlU3RhdHVzQ29kZSwgTWFwKX0uCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZyYW1lIG1ha2VGcmFtZShmaW5hbCBDb250ZXh0IGN0eCwgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIGZpbmFsIGJvb2xlYW4gdXNlQmluYXJ5LCBmaW5hbCBMaXN0PE9iamVjdD4gYWdncmVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlU3RhdHVzQ29kZSBjb2RlLCBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcmVzcG9uc2VNZXRhRGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYWtlRnJhbWUoY3R4LCBtc2csIHNlcmlhbGl6ZXIsIHVzZUJpbmFyeSxhZ2dyZWdhdGUsIGNvZGUsIHJlc3BvbnNlTWV0YURhdGEsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOwotICAgIH0KLQogICAgIHByb3RlY3RlZCBzdGF0aWMgRnJhbWUgbWFrZUZyYW1lKGZpbmFsIENvbnRleHQgY3R4LCBmaW5hbCBSZXF1ZXN0TWVzc2FnZSBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZVNlcmlhbGl6ZXIgc2VyaWFsaXplciwgZmluYWwgYm9vbGVhbiB1c2VCaW5hcnksIGZpbmFsIExpc3Q8T2JqZWN0PiBhZ2dyZWdhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2VTdGF0dXNDb2RlIGNvZGUsIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiByZXNwb25zZU1ldGFEYXRhLApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9zZXNzaW9uL1Nlc3Npb25PcFByb2Nlc3Nvci5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9zZXNzaW9uL1Nlc3Npb25PcFByb2Nlc3Nvci5qYXZhCmluZGV4IDJiY2I0MzAuLmI0ZDZkNGUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvb3Avc2Vzc2lvbi9TZXNzaW9uT3BQcm9jZXNzb3IuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL29wL3Nlc3Npb24vU2Vzc2lvbk9wUHJvY2Vzc29yLmphdmEKQEAgLTEyMiwxMyArMTIyLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2Vzc2lvbiBiYXNlZCByZXF1ZXN0cyBhY2NlcHQgYSAiY2xvc2UiIG9wZXJhdG9yIGluIGFkZGl0aW9uIHRvICJldmFsIi4gQSBjbG9zZSB3aWxsIHRyaWdnZXIgdGhlIHNlc3Npb24gdG8gYmUKLSAgICAgKiBraWxsZWQgYW5kIGFueSB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbiB0byBiZSByb2xsZWQtYmFjay4KKyAgICAgKiBPbGRlciB2ZXJzaW9ucyBvZiBzZXNzaW9uLWJhc2VkIHJlcXVlc3RzIGFjY2VwdGVkIGEgImNsb3NlIiBvcGVyYXRvciBpbiBhZGRpdGlvbiB0byAiZXZhbCIuIFRoaXMgZmVhdHVyZQorICAgICAqIGVmZmVjdGl2ZWx5IGFjdHMgYXMgYSBkby1ub3RoaW5nIGZvciAzLjUuMCB0byBhbGxvdyBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgZHJpdmVycyB0byBjb25uZWN0LiBBdCBzb21lIHBvaW50CisgICAgICogdGhpcyBtYXkgYmUgcmVtb3ZlZCBjb21wbGV0ZWx5LiBOb3RlIHRoYXQgY2xvc2luZyB0aGUgY2hhbm5lbCBraWxscyB0aGUgc2Vzc2lvbiBub3cuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9wdGlvbmFsPFRocm93aW5nQ29uc3VtZXI8Q29udGV4dD4+IHNlbGVjdE90aGVyKGZpbmFsIFJlcXVlc3RNZXNzYWdlIHJlcXVlc3RNZXNzYWdlKSB0aHJvd3MgT3BQcm9jZXNzb3JFeGNlcHRpb24gewotICAgICAgICAvLyBkZXByZWNhdGVkIHRoZSAiY2xvc2UiIG1lc3NhZ2UgYXQgMy4zLjExIC0gc2hvdWxkIHByb2JhYmx5IGxlYXZlIHRoaXMgY2hlY2sgZm9yIHRoZSAiY2xvc2UiIHRva2VuIHNvIHRoYXQKLSAgICAgICAgLy8gaWYgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIGRyaXZlciBjb25uZWN0IHRoZXkgd29uJ3QgZ2V0IGFuIGVycm9yLiBjYW4gYmFzaWNhbGx5IGp1c3Qgd3JpdGUgYmFjayBhIE5PX0NPTlRFTlQKKyAgICAgICAgLy8gZGVwcmVjYXRlZCB0aGUgImNsb3NlIiBtZXNzYWdlIGF0IDMuMy4xMSAtIGxlZnQgdGhpcyBjaGVjayBmb3IgdGhlICJjbG9zZSIgdG9rZW4gc28gdGhhdCBpZiBvbGRlciB2ZXJzaW9ucworICAgICAgICAvLyBvZiB0aGUgZHJpdmVyIGNvbm5lY3QgdGhleSB3b24ndCBnZXQgYW4gZXJyb3IuIGJhc2ljYWxseSBqdXN0IHdyaXRlcyBiYWNrIGEgTk9fQ09OVEVOVAogICAgICAgICAvLyBmb3IgdGhlIGltbWVkaWF0ZSB0ZXJtIGluIDMuNS4wIGFuZCB0aGVuIGZvciBzb21lIGZ1dHVyZSB2ZXJzaW9uIHJlbW92ZSBzdXBwb3J0IGZvciB0aGUgbWVzc2FnZSBjb21wbGV0ZWx5CiAgICAgICAgIC8vIGFuZCB0aHVzIGRpc2FsbG93IG9sZGVyIGRyaXZlciB2ZXJzaW9ucyBmcm9tIGNvbm5lY3RpbmcgYXQgYWxsLgogICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuZ2V0T3AoKS5lcXVhbHMoVG9rZW5zLk9QU19DTE9TRSkpIHsKQEAgLTEzOCwxNCArMTM5LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BQcm9jZXNzb3JFeGNlcHRpb24obXNnLCBSZXNwb25zZU1lc3NhZ2UuYnVpbGQocmVxdWVzdE1lc3NhZ2UpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlJFUVVFU1RfRVJST1JfSU5WQUxJRF9SRVFVRVNUX0FSR1VNRU5UUykuc3RhdHVzTWVzc2FnZShtc2cpLmNyZWF0ZSgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JjZSA9IHJlcXVlc3RNZXNzYWdlLjxCb29sZWFuPm9wdGlvbmFsQXJncyhUb2tlbnMuQVJHU19GT1JDRSkub3JFbHNlKGZhbHNlKTsKLQogICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHJoYyAtPiB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2Vzc2lvbiBzZXNzaW9uVG9DbG9zZSA9IHNlc3Npb25zLmdldChyZXF1ZXN0TWVzc2FnZS5nZXRBcmdzKCkuZ2V0KFRva2Vucy5BUkdTX1NFU1NJT04pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHNlc3Npb25Ub0Nsb3NlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb25Ub0Nsb3NlLm1hbnVhbEtpbGwoZm9yY2UpOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIC8vIHNlbmQgYmFjayBhIGNvbmZpcm1hdGlvbiBvZiB0aGUgY2xvc2UKICAgICAgICAgICAgICAgICByaGMud3JpdGVBbmRGbHVzaChSZXNwb25zZU1lc3NhZ2UuYnVpbGQocmVxdWVzdE1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAuY29kZShSZXNwb25zZVN0YXR1c0NvZGUuTk9fQ09OVEVOVCkKQEAgLTE5MSw2ICsxODUsMTUgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBPcFByb2Nlc3NvckV4Y2VwdGlvbihzZXNzaW9uQ2xvc2VkTWVzc2FnZSwgcmVzcG9uc2UpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNlc3Npb24gaXMgYm91bmQgdG8gdGhpcyBjaGFubmVsLCB0aHVzIG9uZSBjbGllbnQgcGVyIHNlc3Npb24KKyAgICAgICAgaWYgKCFzZXNzaW9uLmlzQm91bmRUbyhjb250ZXh0LmdldENoYW5uZWxIYW5kbGVyQ29udGV4dCgpLmNoYW5uZWwoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXNzaW9uQ2xvc2VkTWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIlNlc3Npb24gJXMgaXMgbm90IGJvdW5kIHRvIHRoZSBjb25uZWN0aW5nIGNsaWVudCIsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1zZykuY29kZShSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAuc3RhdHVzTWVzc2FnZShzZXNzaW9uQ2xvc2VkTWVzc2FnZSkuY3JlYXRlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgT3BQcm9jZXNzb3JFeGNlcHRpb24oc2Vzc2lvbkNsb3NlZE1lc3NhZ2UsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHBsYWNlIHRoZSBzZXNzaW9uIG9uIHRoZSBjaGFubmVsIGNvbnRleHQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBkdXJpbmcgc2VyaWFsaXphdGlvbi4gIGluIHRoaXMgd2F5CiAgICAgICAgIC8vIHRoZSBzZXJpYWxpemF0aW9uIGNhbiBvY2N1ciBvbiB0aGUgc2FtZSB0aHJlYWQgdXNlZCB0byBleGVjdXRlIHRoZSBncmVtbGluIHdpdGhpbiB0aGUgc2Vzc2lvbi4gIHRoaXMKICAgICAgICAgLy8gaXMgaW1wb3J0YW50IGdpdmVuIHRoZSB0aHJlYWRsb2NhbCBuYXR1cmUgb2YgR3JhcGggaW1wbGVtZW50YXRpb24gdHJhbnNhY3Rpb25zLgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC90cmF2ZXJzYWwvVHJhdmVyc2FsT3BQcm9jZXNzb3IuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvb3AvdHJhdmVyc2FsL1RyYXZlcnNhbE9wUHJvY2Vzc29yLmphdmEKaW5kZXggNDE4YzY2Yy4uMGQ0Yjc5NyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC90cmF2ZXJzYWwvVHJhdmVyc2FsT3BQcm9jZXNzb3IuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL29wL3RyYXZlcnNhbC9UcmF2ZXJzYWxPcFByb2Nlc3Nvci5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLm9wLnRyYXZlcnNhbDsKIAogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlRpbWVyOwotaW1wb3J0IGNvbS5naXRodWIuYmVubWFuZXMuY2FmZmVpbmUuY2FjaGUuQ2FjaGU7Ci1pbXBvcnQgY29tLmdpdGh1Yi5iZW5tYW5lcy5jYWZmZWluZS5jYWNoZS5DYWZmZWluZTsKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5NZXNzYWdlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5Ub2tlbnM7CkBAIC0zMCw3ICsyOCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuSmF2YVRyYW5zbGF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5CeXRlY29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNpZGVFZmZlY3RzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5CeXRlY29kZUhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsSW50ZXJydXB0ZWRFeGNlcHRpb247CkBAIC00NCw3ICs0MSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIub3AuQWJzdHJhY3RPcFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5vcC5PcFByb2Nlc3NvckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci51dGlsLk1ldHJpY01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIudXRpbC5TaWRlRWZmZWN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIudXRpbC5UcmF2ZXJzZXJJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbi5HcmFwaFNPTk1hcHBlcjsKQEAgLTU5LDEzICs1NSwxMCBAQAogaW1wb3J0IGphdmF4LnNjcmlwdC5TaW1wbGVCaW5kaW5nczsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5VbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTc5LDYyICs3MiwxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgVHJhdmVyc2FsT3BQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdE9wUHJvY2Vzc29yIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhdmVyc2FsT3BQcm9jZXNzb3IuY2xhc3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBhdWRpdExvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdyZW1saW5TZXJ2ZXIuQVVESVRfTE9HR0VSX05BTUUpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdE1hcHBlciBtYXBwZXIgPSBHcmFwaFNPTk1hcHBlci5idWlsZCgpLnZlcnNpb24oR3JhcGhTT05WZXJzaW9uLlYyXzApLmNyZWF0ZSgpLmNyZWF0ZU1hcHBlcigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QX1BST0NFU1NPUl9OQU1FID0gInRyYXZlcnNhbCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lciB0cmF2ZXJzYWxPcFRpbWVyID0gTWV0cmljTWFuYWdlci5JTlNUQU5DRS5nZXRUaW1lcihuYW1lKEdyZW1saW5TZXJ2ZXIuY2xhc3MsICJvcCIsICJ0cmF2ZXJzYWwiKSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldHRpbmdzLlByb2Nlc3NvclNldHRpbmdzIERFRkFVTFRfU0VUVElOR1MgPSBuZXcgU2V0dGluZ3MuUHJvY2Vzc29yU2V0dGluZ3MoKTsKLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyYXRpb24gc2V0dGluZyBmb3IgaG93IGxvbmcgYSBjYWNoZWQgc2lkZS1lZmZlY3Qgd2lsbCBiZSBhdmFpbGFibGUgYmVmb3JlIGl0IGlzIGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgaW4gdGhlIHByb3RvY29sIGFzIHNpZGUtZWZmZWN0IHJldHJpZXZhbCBhZnRlcgotICAgICAqIHRyYXZlcnNhbCBpdGVyYXRpb24gaXMgbm90IGJlaW5nIHByb21vdGVkIGFueW1vcmUgYXMgYSBmZWF0dXJlLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0NBQ0hFX0VYUElSQVRJT05fVElNRSA9ICJjYWNoZUV4cGlyYXRpb25UaW1lIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgdGltZW91dCBmb3IgYSBjYWNoZWQgc2lkZS1lZmZlY3QgaXMgdGVuIG1pbnV0ZXMuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgaW4gdGhlIHByb3RvY29sIGFzIHNpZGUtZWZmZWN0IHJldHJpZXZhbCBhZnRlcgotICAgICAqIHRyYXZlcnNhbCBpdGVyYXRpb24gaXMgbm90IGJlaW5nIHByb21vdGVkIGFueW1vcmUgYXMgYSBmZWF0dXJlLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfQ0FDSEVfRVhQSVJBVElPTl9USU1FID0gNjAwMDAwOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJhdGlvbiBzZXR0aW5nIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0aGUgY2FjaGUgd2lsbCBoYXZlLgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkIGluIHRoZSBwcm90b2NvbCBhcyBzaWRlLWVmZmVjdCByZXRyaWV2YWwgYWZ0ZXIKLSAgICAgKiB0cmF2ZXJzYWwgaXRlcmF0aW9uIGlzIG5vdCBiZWluZyBwcm9tb3RlZCBhbnltb3JlIGFzIGEgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DQUNIRV9NQVhfU0laRSA9ICJjYWNoZU1heFNpemUiOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBzaXplIG9mIHRoZSBtYXggc2l6ZSBvZiB0aGUgY2FjaGUuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgZGlyZWN0bHkgcmVwbGFjZWQgaW4gdGhlIHByb3RvY29sIGFzIHNpZGUtZWZmZWN0IHJldHJpZXZhbCBhZnRlcgotICAgICAqIHRyYXZlcnNhbCBpdGVyYXRpb24gaXMgbm90IGJlaW5nIHByb21vdGVkIGFueW1vcmUgYXMgYSBmZWF0dXJlLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfQ0FDSEVfTUFYX1NJWkUgPSAxMDAwOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5jbGFzc05hbWUgPSBUcmF2ZXJzYWxPcFByb2Nlc3Nvci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIERFRkFVTFRfU0VUVElOR1MuY29uZmlnID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKLSAgICAgICAgICAgIHB1dChDT05GSUdfQ0FDSEVfRVhQSVJBVElPTl9USU1FLCBERUZBVUxUX0NBQ0hFX0VYUElSQVRJT05fVElNRSk7Ci0gICAgICAgICAgICBwdXQoQ09ORklHX0NBQ0hFX01BWF9TSVpFLCBERUZBVUxUX0NBQ0hFX01BWF9TSVpFKTsKLSAgICAgICAgfX07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IGRpcmVjdGx5IHJlcGxhY2VkIGluIHRoZSBwcm90b2NvbCBhcyBzaWRlLWVmZmVjdCByZXRyaWV2YWwgYWZ0ZXIKLSAgICAgKiB0cmF2ZXJzYWwgaXRlcmF0aW9uIGlzIG5vdCBiZWluZyBwcm9tb3RlZCBhbnltb3JlIGFzIGEgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIENhY2hlPFVVSUQsIFRyYXZlcnNhbFNpZGVFZmZlY3RzPiBjYWNoZSA9IG51bGw7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaW5kaW5ncyBFTVBUWV9CSU5ESU5HUyA9IG5ldyBTaW1wbGVCaW5kaW5ncygpOwogCiAgICAgcHVibGljIFRyYXZlcnNhbE9wUHJvY2Vzc29yKCkgewpAQCAtMTUyLDIzICs5NCw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChmaW5hbCBTZXR0aW5ncyBzZXR0aW5ncykgewotICAgICAgICBmaW5hbCBTZXR0aW5ncy5Qcm9jZXNzb3JTZXR0aW5ncyBwcm9jZXNzb3JTZXR0aW5ncyA9IHNldHRpbmdzLnByb2Nlc3NvcnMuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAuZmlsdGVyKHAgLT4gcC5jbGFzc05hbWUuZXF1YWxzKFRyYXZlcnNhbE9wUHJvY2Vzc29yLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgLmZpbmRBbnkoKS5vckVsc2UoVHJhdmVyc2FsT3BQcm9jZXNzb3IuREVGQVVMVF9TRVRUSU5HUyk7Ci0gICAgICAgIGZpbmFsIGxvbmcgbWF4U2l6ZSA9IExvbmcucGFyc2VMb25nKHByb2Nlc3NvclNldHRpbmdzLmNvbmZpZy5nZXQoVHJhdmVyc2FsT3BQcm9jZXNzb3IuQ09ORklHX0NBQ0hFX01BWF9TSVpFKS50b1N0cmluZygpKTsKLSAgICAgICAgZmluYWwgbG9uZyBleHBpcmF0aW9uVGltZSA9IExvbmcucGFyc2VMb25nKHByb2Nlc3NvclNldHRpbmdzLmNvbmZpZy5nZXQoVHJhdmVyc2FsT3BQcm9jZXNzb3IuQ09ORklHX0NBQ0hFX0VYUElSQVRJT05fVElNRSkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgY2FjaGUgPSBDYWZmZWluZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuZXhwaXJlQWZ0ZXJXcml0ZShleHBpcmF0aW9uVGltZSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKQotICAgICAgICAgICAgICAgIC5tYXhpbXVtU2l6ZShtYXhTaXplKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJJbml0aWFsaXplZCBjYWNoZSBmb3Ige30gd2l0aCBzaXplIHt9IGFuZCBleHBpcmF0aW9uIHRpbWUgb2Yge30gbXMiLAotICAgICAgICAgICAgICAgIFRyYXZlcnNhbE9wUHJvY2Vzc29yLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWF4U2l6ZSwgZXhwaXJhdGlvblRpbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUaHJvd2luZ0NvbnN1bWVyPENvbnRleHQ+IHNlbGVjdChmaW5hbCBDb250ZXh0IGNvbnRleHQpIHRocm93cyBPcFByb2Nlc3NvckV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIG1lc3NhZ2UgPSBjb250ZXh0LmdldFJlcXVlc3RNZXNzYWdlKCk7CiAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2VsZWN0aW5nIHByb2Nlc3NvciBmb3IgUmVxdWVzdE1lc3NhZ2Uge30iLCBtZXNzYWdlKTsKQEAgLTE3OSw2MiArMTA0LDYgQEAKICAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYXZlcnNhbFNvdXJjZUFsaWFzKGNvbnRleHQsIG1lc3NhZ2UsIHZhbGlkYXRlVHJhdmVyc2FsUmVxdWVzdChtZXNzYWdlKSk7CiAgICAgICAgICAgICAgICAgb3AgPSB0aGlzOjppdGVyYXRlQnl0ZWNvZGVUcmF2ZXJzYWw7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRva2Vucy5PUFNfR0FUSEVSOgotICAgICAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPFN0cmluZz4gc2lkZUVmZmVjdEZvckdhdGhlciA9IG1lc3NhZ2Uub3B0aW9uYWxBcmdzKFRva2Vucy5BUkdTX1NJREVfRUZGRUNUKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNpZGVFZmZlY3RGb3JHYXRoZXIuaXNQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkEgbWVzc2FnZSB3aXRoIGFuIFslc10gb3AgY29kZSByZXF1aXJlcyBhIFslc10gYXJndW1lbnQuIiwgVG9rZW5zLk9QU19HQVRIRVIsIFRva2Vucy5BUkdTX1NJREVfRUZGRUNUKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wUHJvY2Vzc29yRXhjZXB0aW9uKG1zZywgUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1lc3NhZ2UpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlJFUVVFU1RfRVJST1JfSU5WQUxJRF9SRVFVRVNUX0FSR1VNRU5UUykuc3RhdHVzTWVzc2FnZShtc2cpLmNyZWF0ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBPcHRpb25hbDxTdHJpbmc+IHNpZGVFZmZlY3RLZXkgPSBtZXNzYWdlLm9wdGlvbmFsQXJncyhUb2tlbnMuQVJHU19TSURFX0VGRkVDVF9LRVkpOwotICAgICAgICAgICAgICAgIGlmICghc2lkZUVmZmVjdEtleS5pc1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiQSBtZXNzYWdlIHdpdGggYW4gWyVzXSBvcCBjb2RlIHJlcXVpcmVzIGEgWyVzXSBhcmd1bWVudC4iLCBUb2tlbnMuT1BTX0dBVEhFUiwgVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1RfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wUHJvY2Vzc29yRXhjZXB0aW9uKG1zZywgUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1lc3NhZ2UpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlJFUVVFU1RfRVJST1JfSU5WQUxJRF9SRVFVRVNUX0FSR1VNRU5UUykuc3RhdHVzTWVzc2FnZShtc2cpLmNyZWF0ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYXZlcnNhbFNvdXJjZUFsaWFzKGNvbnRleHQsIG1lc3NhZ2UsIHZhbGlkYXRlZEFsaWFzZXMobWVzc2FnZSkuZ2V0KCkpOwotCi0gICAgICAgICAgICAgICAgb3AgPSB0aGlzOjpnYXRoZXJTaWRlRWZmZWN0OwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRva2Vucy5PUFNfS0VZUzoKLSAgICAgICAgICAgICAgICBmaW5hbCBPcHRpb25hbDxTdHJpbmc+IHNpZGVFZmZlY3RGb3JLZXlzID0gbWVzc2FnZS5vcHRpb25hbEFyZ3MoVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1QpOwotICAgICAgICAgICAgICAgIGlmICghc2lkZUVmZmVjdEZvcktleXMuaXNQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkEgbWVzc2FnZSB3aXRoIGFuIFslc10gb3AgY29kZSByZXF1aXJlcyBhIFslc10gYXJndW1lbnQuIiwgVG9rZW5zLk9QU19HQVRIRVIsIFRva2Vucy5BUkdTX1NJREVfRUZGRUNUKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wUHJvY2Vzc29yRXhjZXB0aW9uKG1zZywgUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1lc3NhZ2UpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlJFUVVFU1RfRVJST1JfSU5WQUxJRF9SRVFVRVNUX0FSR1VNRU5UUykuc3RhdHVzTWVzc2FnZShtc2cpLmNyZWF0ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcCA9IHZhclJoYyAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIG1zZyA9IGNvbnRleHQuZ2V0UmVxdWVzdE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgT3B0aW9uYWw8VVVJRD4gc2lkZUVmZmVjdCA9IG1zZy5vcHRpb25hbEFyZ3MoVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1QpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzYWxTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cyA9IGNhY2hlLmdldElmUHJlc2VudChzaWRlRWZmZWN0LmdldCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBzaWRlRWZmZWN0cykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJSZXF1ZXN0IGZvciBzaWRlLWVmZmVjdCBrZXlzIG9uIHt9IHJldHVybmVkIG5vIHNpZGUtZWZmZWN0cyBpbiB0aGUgY2FjaGUiLCBzaWRlRWZmZWN0LmdldCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVJdGVyYXRvcih2YXJSaGMsIG51bGwgPT0gc2lkZUVmZmVjdHMgPyBDb2xsZWN0aW9ucy5lbXB0eUl0ZXJhdG9yKCkgOiBzaWRlRWZmZWN0cy5rZXlzKCkuaXRlcmF0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUb2tlbnMuT1BTX0NMT1NFOgotICAgICAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPFN0cmluZz4gc2lkZUVmZmVjdEZvckNsb3NlID0gbWVzc2FnZS5vcHRpb25hbEFyZ3MoVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1QpOwotICAgICAgICAgICAgICAgIGlmICghc2lkZUVmZmVjdEZvckNsb3NlLmlzUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJBIG1lc3NhZ2Ugd2l0aCBhbiBbJXNdIG9wIGNvZGUgcmVxdWlyZXMgYSBbJXNdIGFyZ3VtZW50LiIsIFRva2Vucy5PUFNfQ0xPU0UsIFRva2Vucy5BUkdTX1NJREVfRUZGRUNUKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wUHJvY2Vzc29yRXhjZXB0aW9uKG1zZywgUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1lc3NhZ2UpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlJFUVVFU1RfRVJST1JfSU5WQUxJRF9SRVFVRVNUX0FSR1VNRU5UUykuc3RhdHVzTWVzc2FnZShtc2cpLmNyZWF0ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcCA9IHZhclJoYyAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIG1zZyA9IGNvbnRleHQuZ2V0UmVxdWVzdE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDbG9zZSByZXF1ZXN0IHt9IGZvciBpbiB0aHJlYWQge30iLCBtc2cuZ2V0UmVxdWVzdElkKCksIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBPcHRpb25hbDxVVUlEPiBzaWRlRWZmZWN0ID0gbXNnLm9wdGlvbmFsQXJncyhUb2tlbnMuQVJHU19TSURFX0VGRkVDVCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlLmludmFsaWRhdGUoc2lkZUVmZmVjdC5nZXQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN1Y2Nlc3NNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiU3VjY2Vzc2Z1bGx5IGNsZWFyZWQgc2lkZSBlZmZlY3QgY2FjaGUgZm9yIFslc10uIiwgVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1QpOwotICAgICAgICAgICAgICAgICAgICB2YXJSaGMud3JpdGVBbmRGbHVzaChSZXNwb25zZU1lc3NhZ2UuYnVpbGQobWVzc2FnZSkuY29kZShSZXNwb25zZVN0YXR1c0NvZGUuTk9fQ09OVEVOVCkuc3RhdHVzTWVzc2FnZShzdWNjZXNzTWVzc2FnZSkuY3JlYXRlKCkpOwotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVG9rZW5zLk9QU19JTlZBTElEOgogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2dJbnZhbGlkID0gU3RyaW5nLmZvcm1hdCgiTWVzc2FnZSBjb3VsZCBub3QgYmUgcGFyc2VkLiAgQ2hlY2sgdGhlIGZvcm1hdCBvZiB0aGUgcmVxdWVzdC4gWyVzXSIsIG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcFByb2Nlc3NvckV4Y2VwdGlvbihtc2dJbnZhbGlkLCBSZXNwb25zZU1lc3NhZ2UuYnVpbGQobWVzc2FnZSkuY29kZShSZXNwb25zZVN0YXR1c0NvZGUuUkVRVUVTVF9FUlJPUl9NQUxGT1JNRURfUkVRVUVTVCkuc3RhdHVzTWVzc2FnZShtc2dJbnZhbGlkKS5jcmVhdGUoKSk7CkBAIC0yNzksODAgKzE0OCw5IEBACiAgICAgICAgIHJldHVybiBhbGlhc2VzOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBnYXRoZXJTaWRlRWZmZWN0KGZpbmFsIENvbnRleHQgY29udGV4dCkgdGhyb3dzIE9wUHJvY2Vzc29yRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnID0gY29udGV4dC5nZXRSZXF1ZXN0TWVzc2FnZSgpOwotICAgICAgICBsb2dnZXIuZGVidWcoIlNpZGUtZWZmZWN0IHJlcXVlc3Qge30gZm9yIGluIHRocmVhZCB7fSIsIG1zZy5nZXRSZXF1ZXN0SWQoKSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGVhcmxpZXIgdmFsaWRhdGlvbiBpbiBzZWxlY3Rpb24gb2YgdGhpcyBvcCBtZXRob2Qgc2hvdWxkIGZyZWUgdXMgdG8gY2FzdCB0aGlzIHdpdGhvdXQgd29ycnkKLSAgICAgICAgZmluYWwgT3B0aW9uYWw8VVVJRD4gc2lkZUVmZmVjdCA9IG1zZy5vcHRpb25hbEFyZ3MoVG9rZW5zLkFSR1NfU0lERV9FRkZFQ1QpOwotICAgICAgICBmaW5hbCBPcHRpb25hbDxTdHJpbmc+IHNpZGVFZmZlY3RLZXkgPSBtc2cub3B0aW9uYWxBcmdzKFRva2Vucy5BUkdTX1NJREVfRUZGRUNUX0tFWSk7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxpYXNlcyA9IChNYXA8U3RyaW5nLCBTdHJpbmc+KSBtc2cub3B0aW9uYWxBcmdzKFRva2Vucy5BUkdTX0FMSUFTRVMpLmdldCgpOwotCi0gICAgICAgIGZpbmFsIEdyYXBoTWFuYWdlciBncmFwaE1hbmFnZXIgPSBjb250ZXh0LmdldEdyYXBoTWFuYWdlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdHJhdmVyc2FsU291cmNlTmFtZSA9IGFsaWFzZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRWYWx1ZSgpOwotICAgICAgICBmaW5hbCBUcmF2ZXJzYWxTb3VyY2UgZyA9IGdyYXBoTWFuYWdlci5nZXRUcmF2ZXJzYWxTb3VyY2UodHJhdmVyc2FsU291cmNlTmFtZSk7Ci0KLSAgICAgICAgZmluYWwgVGltZXIuQ29udGV4dCB0aW1lckNvbnRleHQgPSB0cmF2ZXJzYWxPcFRpbWVyLnRpbWUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHggPSBjb250ZXh0LmdldENoYW5uZWxIYW5kbGVyQ29udGV4dCgpOwotICAgICAgICAgICAgZmluYWwgR3JhcGggZ3JhcGggPSBnLmdldEdyYXBoKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQuZ2V0R3JlbWxpbkV4ZWN1dG9yKCkuZ2V0RXhlY3V0b3JTZXJ2aWNlKCkuc3VibWl0KCgpIC0+IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBiZWZvcmVQcm9jZXNzaW5nKGdyYXBoLCBjb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJhdmVyc2FsU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPSBjYWNoZS5nZXRJZlByZXNlbnQoc2lkZUVmZmVjdC5nZXQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IHNpZGVFZmZlY3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIkNvdWxkIG5vdCBmaW5kIHNpZGUtZWZmZWN0cyBmb3IgJXMuIiwgc2lkZUVmZmVjdC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQW5kRmx1c2goUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1zZykuY29kZShSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SKS5zdGF0dXNNZXNzYWdlKGVycm9yTWVzc2FnZSkuY3JlYXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ3JhcGgsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaWRlRWZmZWN0cy5leGlzdHMoc2lkZUVmZmVjdEtleS5nZXQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXJyb3JNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiQ291bGQgbm90IGZpbmQgc2lkZS1lZmZlY3Qga2V5IGZvciAlcyBpbiAlcy4iLCBzaWRlRWZmZWN0S2V5LmdldCgpLCBzaWRlRWZmZWN0LmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBbmRGbHVzaChSZXNwb25zZU1lc3NhZ2UuYnVpbGQobXNnKS5jb2RlKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1IpLnN0YXR1c01lc3NhZ2UoZXJyb3JNZXNzYWdlKS5jcmVhdGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihncmFwaCwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVJdGVyYXRvcihjb250ZXh0LCBuZXcgU2lkZUVmZmVjdEl0ZXJhdG9yKHNpZGVFZmZlY3RzLmdldChzaWRlRWZmZWN0S2V5LmdldCgpKSwgc2lkZUVmZmVjdEtleS5nZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFN0cmluZy5mb3JtYXQoIkV4Y2VwdGlvbiBwcm9jZXNzaW5nIGEgc2lkZS1lZmZlY3Qgb24gaXRlcmF0aW9uIGZvciByZXF1ZXN0IFslc10uIiwgbXNnLmdldFJlcXVlc3RJZCgpKSwgZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUFuZEZsdXNoKFJlc3BvbnNlTWVzc2FnZS5idWlsZChtc2cpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzTWVzc2FnZShleC5nZXRNZXNzYWdlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1c0F0dHJpYnV0ZUV4Y2VwdGlvbihleCkuY3JlYXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihncmFwaCwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBvblNpZGVFZmZlY3RTdWNjZXNzKGdyYXBoLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oU3RyaW5nLmZvcm1hdCgiRXhjZXB0aW9uIHByb2Nlc3NpbmcgYSBzaWRlLWVmZmVjdCBvbiByZXF1ZXN0IFslc10uIiwgbXNnLmdldFJlcXVlc3RJZCgpKSwgZXgpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQW5kRmx1c2goUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1zZykuY29kZShSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1c01lc3NhZ2UoZXguZ2V0TWVzc2FnZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1c0F0dHJpYnV0ZUV4Y2VwdGlvbihleCkuY3JlYXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdyYXBoLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0aW1lckNvbnRleHQuc3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGltZXJDb250ZXh0LnN0b3AoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBPcFByb2Nlc3NvckV4Y2VwdGlvbigiQ291bGQgbm90IGl0ZXJhdGUgdGhlIHNpZGUtZWZmZWN0IGluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VNZXNzYWdlLmJ1aWxkKG1zZykuY29kZShSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXNNZXNzYWdlKGV4LmdldE1lc3NhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzQXR0cmlidXRlRXhjZXB0aW9uKGV4KS5jcmVhdGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgaXRlcmF0ZUJ5dGVjb2RlVHJhdmVyc2FsKGZpbmFsIENvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIG1zZyA9IGNvbnRleHQuZ2V0UmVxdWVzdE1lc3NhZ2UoKTsKKyAgICAgICAgZmluYWwgU2V0dGluZ3Mgc2V0dGluZ3MgPSBjb250ZXh0LmdldFNldHRpbmdzKCk7CiAgICAgICAgIGxvZ2dlci5kZWJ1ZygiVHJhdmVyc2FsIHJlcXVlc3Qge30gZm9yIGluIHRocmVhZCB7fSIsIG1zZy5nZXRSZXF1ZXN0SWQoKSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwogCiAgICAgICAgIC8vIHJpZ2h0IG5vdyB0aGUgVHJhdmVyc2FsT3BQcm9jZXNzb3IgY2FuIHRha2UgYSBkaXJlY3QgR3JhcGhTT04gcmVwcmVzZW50YXRpb24gb2YgQnl0ZWNvZGUgb3IgZGlyZWN0bHkgdGFrZQpAQCAtMzY3LDExICsxNjUsOCBAQAogICAgICAgICAvLyB0aW1lb3V0IG92ZXJyaWRlIC0gaGFuZGxlIGJvdGggZGVwcmVjYXRlZCBhbmQgbmV3bHkgbmFtZWQgY29uZmlndXJhdGlvbi4gZWFybGllciBsb2dpYyBzaG91bGQgcHJldmVudAogICAgICAgICAvLyBib3RoIGNvbmZpZ3VyYXRpb25zIGZyb20gYmVpbmcgc3VibWl0dGVkIGF0IHRoZSBzYW1lIHRpbWUKICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbXNnLmdldEFyZ3MoKTsKLSAgICAgICAgZmluYWwgbG9uZyBzZXRvID0gYXJncy5jb250YWluc0tleShUb2tlbnMuQVJHU19TQ1JJUFRfRVZBTF9USU1FT1VUKSB8fCBhcmdzLmNvbnRhaW5zS2V5KFRva2Vucy5BUkdTX0VWQUxfVElNRU9VVCkKLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBzZW50IGFzIGFuIGludGVnZXIgb3IgbG9uZwotICAgICAgICAgICAgICAgID8gKGFyZ3MuY29udGFpbnNLZXkoVG9rZW5zLkFSR1NfU0NSSVBUX0VWQUxfVElNRU9VVCkgPwotICAgICAgICAgICAgICAgICgoTnVtYmVyKSBhcmdzLmdldChUb2tlbnMuQVJHU19TQ1JJUFRfRVZBTF9USU1FT1VUKSkubG9uZ1ZhbHVlKCkgOiAoKE51bWJlcikgYXJncy5nZXQoVG9rZW5zLkFSR1NfRVZBTF9USU1FT1VUKSkubG9uZ1ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgOiBjb250ZXh0LmdldFNldHRpbmdzKCkuZ2V0RXZhbHVhdGlvblRpbWVvdXQoKTsKKyAgICAgICAgZmluYWwgbG9uZyBzZXRvID0gYXJncy5jb250YWluc0tleShUb2tlbnMuQVJHU19FVkFMX1RJTUVPVVQpID8KKyAgICAgICAgICAgICAgICAoKE51bWJlcikgYXJncy5nZXQoVG9rZW5zLkFSR1NfRVZBTF9USU1FT1VUKSkubG9uZ1ZhbHVlKCkgOiBjb250ZXh0LmdldFNldHRpbmdzKCkuZ2V0RXZhbHVhdGlvblRpbWVvdXQoKTsKIAogICAgICAgICBmaW5hbCBHcmFwaE1hbmFnZXIgZ3JhcGhNYW5hZ2VyID0gY29udGV4dC5nZXRHcmFwaE1hbmFnZXIoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIHRyYXZlcnNhbFNvdXJjZU5hbWUgPSBhbGlhc2VzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0VmFsdWUoKTsKQEAgLTM4Nyw3ICsxODIsNyBAQAogICAgICAgICB9IGNhdGNoIChTY3JpcHRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVHJhdmVyc2FsIGNvbnRhaW5zIGEgbGFtYmRhIHRoYXQgY2Fubm90IGJlIGNvbXBpbGVkIiwgZXgpOwogICAgICAgICAgICAgdGhyb3cgbmV3IE9wUHJvY2Vzc29yRXhjZXB0aW9uKCJUcmF2ZXJzYWwgY29udGFpbnMgYSBsYW1iZGEgdGhhdCBjYW5ub3QgYmUgY29tcGlsZWQiLAotICAgICAgICAgICAgICAgICAgICBSZXNwb25zZU1lc3NhZ2UuYnVpbGQobXNnKS5jb2RlKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfU0NSSVBUX0VWQUxVQVRJT04pCisgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlTWVzc2FnZS5idWlsZChtc2cpLmNvZGUoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9FVkFMVUFUSU9OKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXNNZXNzYWdlKGV4LmdldE1lc3NhZ2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzQXR0cmlidXRlRXhjZXB0aW9uKGV4KS5jcmVhdGUoKSk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewpAQCAtMzk3LDYgKzE5MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXNNZXNzYWdlKGV4LmdldE1lc3NhZ2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzQXR0cmlidXRlRXhjZXB0aW9uKGV4KS5jcmVhdGUoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHRpbmdzLmF1dGhlbnRpY2F0aW9uLmVuYWJsZUF1ZGl0TG9nKSB7CisgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGNvbnRleHQuZ2V0Q2hhbm5lbEhhbmRsZXJDb250ZXh0KCkuY2hhbm5lbCgpLnJlbW90ZUFkZHJlc3MoKS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgiLyIpICYmIGFkZHJlc3MubGVuZ3RoKCkgPiAxKSBhZGRyZXNzID0gYWRkcmVzcy5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICBhdWRpdExvZ2dlci5pbmZvKCJVc2VyIHdpdGggYWRkcmVzcyB7fSByZXF1ZXN0ZWQ6IHt9IiwgYWRkcmVzcywgYnl0ZWNvZGUpOworICAgICAgICB9CiAKICAgICAgICAgZmluYWwgVGltZXIuQ29udGV4dCB0aW1lckNvbnRleHQgPSB0cmF2ZXJzYWxPcFRpbWVyLnRpbWUoKTsKICAgICAgICAgZmluYWwgRnV0dXJlVGFzazxWb2lkPiBldmFsRnV0dXJlID0gbmV3IEZ1dHVyZVRhc2s8PigoKSAtPiB7CkBAIC00NDksMTYgKzI0OSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpdGVyYXRlQ29tcGxldGUoZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnLCBmaW5hbCBJdGVyYXRvciBpdHR5KSB7Ci0gICAgICAgIGlmIChpdHR5IGluc3RhbmNlb2YgVHJhdmVyc2VySXRlcmF0b3IpIHsKLSAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNhbC5BZG1pbiB0cmF2ZXJzYWwgPSAoKFRyYXZlcnNlckl0ZXJhdG9yKSBpdHR5KS5nZXRUcmF2ZXJzYWwoKTsKLSAgICAgICAgICAgIGlmICghdHJhdmVyc2FsLmdldFNpZGVFZmZlY3RzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGUucHV0KG1zZy5nZXRSZXF1ZXN0SWQoKSwgdHJhdmVyc2FsLmdldFNpZGVFZmZlY3RzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlUHJvY2Vzc2luZyhmaW5hbCBHcmFwaCBncmFwaCwgZmluYWwgQ29udGV4dCBjdHgpIHsKICAgICAgICAgaWYgKGdyYXBoLmZlYXR1cmVzKCkuZ3JhcGgoKS5zdXBwb3J0c1RyYW5zYWN0aW9ucygpICYmIGdyYXBoLnR4KCkuaXNPcGVuKCkpIGdyYXBoLnR4KCkucm9sbGJhY2soKTsKICAgICB9CkBAIC00NzEsMzUgKzI2MSw2IEBACiAgICAgICAgIGlmIChncmFwaC5mZWF0dXJlcygpLmdyYXBoKCkuc3VwcG9ydHNUcmFuc2FjdGlvbnMoKSAmJiBncmFwaC50eCgpLmlzT3BlbigpKSBncmFwaC50eCgpLmNvbW1pdCgpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIG9uU2lkZUVmZmVjdFN1Y2Nlc3MoZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIENvbnRleHQgY3R4KSB7Ci0gICAgICAgIC8vIHRoZXJlIHdhcyBubyAid3JpdGluZyIgaGVyZSwganVzdCBzaWRlLWVmZmVjdCByZXRyaWV2YWwsIHNvIGlmIGEgdHJhbnNhY3Rpb24gd2FzIG9wZW5lZCB0aGVuCi0gICAgICAgIC8vIGp1c3QgY2xvc2Ugd2l0aCByb2xsYmFjawotICAgICAgICBpZiAoZ3JhcGguZmVhdHVyZXMoKS5ncmFwaCgpLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkgJiYgZ3JhcGgudHgoKS5pc09wZW4oKSkgZ3JhcGgudHgoKS5yb2xsYmFjaygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdlbmVyYXRlTWV0YURhdGEoZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2VTdGF0dXNDb2RlIGNvZGUsIGZpbmFsIEl0ZXJhdG9yIGl0dHkpIHsKLSAgICAgICAgLy8gbGVhdmluZyB0aGlzIG92ZXJyaWRpbmcgdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCBiZWNhdXNlIGl0IHByb3ZpZGVzIGEgZGVjZW50IHRlc3QgdG8gdGhvc2UKLSAgICAgICAgLy8gd2hvIG1pZ2h0IGhhdmUgdGhlaXIgb3duIE9wUHJvY2Vzc29yIGltcGxlbWVudGF0aW9ucyB0aGF0IGFwcGx5IG1ldGEtZGF0YS4gbGVhdmluZyB0aGlzIGFsb25lIGhlbHBzIHZhbGlkYXRlCi0gICAgICAgIC8vIHRoYXQgdGhlIHVwZ3JhZGUgcGF0aCBpcyBjbGVhbi4gIGl0IGNhbiBiZSByZW1vdmVkIGF0IHRoZSBuZXh0IGJyZWFraW5nIGNoYW5nZSAzLjUuMAotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICAgICAgaWYgKGl0dHkgaW5zdGFuY2VvZiBTaWRlRWZmZWN0SXRlcmF0b3IpIHsKLSAgICAgICAgICAgIGZpbmFsIFNpZGVFZmZlY3RJdGVyYXRvciB0cmF2ZXJzYWxJdGVyYXRvciA9IChTaWRlRWZmZWN0SXRlcmF0b3IpIGl0dHk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gdHJhdmVyc2FsSXRlcmF0b3IuZ2V0U2lkZUVmZmVjdEtleSgpOwotICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGEucHV0KFRva2Vucy5BUkdTX1NJREVfRUZGRUNUX0tFWSwga2V5KTsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoVG9rZW5zLkFSR1NfQUdHUkVHQVRFX1RPLCB0cmF2ZXJzYWxJdGVyYXRvci5nZXRTaWRlRWZmZWN0QWdncmVnYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdGFuZGFyZCB0cmF2ZXJzYWwgaXRlcmF0b3IKLSAgICAgICAgICAgIG1ldGFEYXRhID0gc3VwZXIuZ2VuZXJhdGVNZXRhRGF0YShjdHgsIG1zZywgY29kZSwgaXR0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWV0YURhdGE7Ci0gICAgfQotCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlSXRlcmF0b3IoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBJdGVyYXRvciBpdHR5LCBmaW5hbCBHcmFwaCBncmFwaCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IG5ldHR5Q29udGV4dCA9IGNvbnRleHQuZ2V0Q2hhbm5lbEhhbmRsZXJDb250ZXh0KCk7CiAgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIG1zZyA9IGNvbnRleHQuZ2V0UmVxdWVzdE1lc3NhZ2UoKTsKQEAgLTUxMSwxMSArMjcyLDcgQEAKICAgICAgICAgLy8gd2UgaGF2ZSBhbiBlbXB0eSBpdGVyYXRvciAtIGhhcHBlbnMgb24gc3R1ZmYgbGlrZTogZy5WKCkuaXRlcmF0ZSgpCiAgICAgICAgIGlmICghaXR0eS5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcyA9IGdlbmVyYXRlU3RhdHVzQXR0cmlidXRlcyhuZXR0eUNvbnRleHQsIG1zZywgUmVzcG9uc2VTdGF0dXNDb2RlLk5PX0NPTlRFTlQsIGl0dHksIHNldHRpbmdzKTsKLSAgICAgICAgICAgIC8vIGlmIGl0IHdhcyBhIGcuVigpLml0ZXJhdGUoKSwgdGhlbiBiZSBzdXJlIHRvIGFkZCB0aGUgc2lkZS1lZmZlY3RzIHRvIHRoZSBjYWNoZQotICAgICAgICAgICAgaWYgKGl0dHkgaW5zdGFuY2VvZiBUcmF2ZXJzZXJJdGVyYXRvciAmJgotICAgICAgICAgICAgICAgICAgICAhKChUcmF2ZXJzZXJJdGVyYXRvcilpdHR5KS5nZXRUcmF2ZXJzYWwoKS5nZXRTaWRlRWZmZWN0cygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGNhY2hlLnB1dChtc2cuZ2V0UmVxdWVzdElkKCksICgoVHJhdmVyc2VySXRlcmF0b3IpaXR0eSkuZ2V0VHJhdmVyc2FsKCkuZ2V0U2lkZUVmZmVjdHMoKSk7Ci0gICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIGFzIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBpdGVyYXRlIGlmIHdlIGFyZSB0cmFuc2FjdGlvbiBtYW5hZ2VkIHRoZW4gd2Ugc2hvdWxkIGV4ZWN1dGUgYQogICAgICAgICAgICAgLy8gY29tbWl0IGhlcmUgYmVmb3JlIHdlIHNlbmQgYmFjayBhIE5PX0NPTlRFTlQgd2hpY2ggaW1wbGllcyBzdWNjZXNzCiAgICAgICAgICAgICBvblRyYXZlcnNhbFN1Y2Nlc3MoZ3JhcGgsIGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci91dGlsL1NpZGVFZmZlY3RJdGVyYXRvci5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci91dGlsL1NpZGVFZmZlY3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjM0Li4wMDAwMDAwCi0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvdXRpbC9TaWRlRWZmZWN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuVG9rZW5zOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsLkRlZmF1bHRSZW1vdGVUcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuQnVsa1NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuaXRlcmF0b3IuSXRlcmF0b3JVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQotICovCi1wdWJsaWMgY2xhc3MgU2lkZUVmZmVjdEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8T2JqZWN0PiB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE9iamVjdD4gc2lkZUVmZmVjdEl0ZXJhdG9yOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNpZGVFZmZlY3RLZXk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2lkZUVmZmVjdEFnZ3JlZ2F0b3I7Ci0KLSAgICBwdWJsaWMgU2lkZUVmZmVjdEl0ZXJhdG9yKGZpbmFsIE9iamVjdCBzaWRlRWZmZWN0LCBmaW5hbCBTdHJpbmcgc2lkZUVmZmVjdEtleSkgewotICAgICAgICB0aGlzLnNpZGVFZmZlY3RLZXkgPSBzaWRlRWZmZWN0S2V5OwotICAgICAgICBzaWRlRWZmZWN0QWdncmVnYXRvciA9IGdldEFnZ3JlZ2F0b3JUeXBlKHNpZGVFZmZlY3QpOwotICAgICAgICBzaWRlRWZmZWN0SXRlcmF0b3IgPSBzaWRlRWZmZWN0IGluc3RhbmNlb2YgQnVsa1NldCA/Ci0gICAgICAgICAgICAgICAgbmV3IEJ1bGtTZXRJdGVyYXRvcigoQnVsa1NldCkgc2lkZUVmZmVjdCkgOgotICAgICAgICAgICAgICAgIEl0ZXJhdG9yVXRpbHMuYXNJdGVyYXRvcihzaWRlRWZmZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpZGVFZmZlY3RLZXkoKSB7Ci0gICAgICAgIHJldHVybiBzaWRlRWZmZWN0S2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lkZUVmZmVjdEFnZ3JlZ2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzaWRlRWZmZWN0QWdncmVnYXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gc2lkZUVmZmVjdEl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBzaWRlRWZmZWN0SXRlcmF0b3IubmV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFnZ3JlZ2F0b3JUeXBlKGZpbmFsIE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQnVsa1NldCkKLSAgICAgICAgICAgIHJldHVybiBUb2tlbnMuVkFMX0FHR1JFR0FURV9UT19CVUxLU0VUOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgU2V0KQotICAgICAgICAgICAgcmV0dXJuIFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX1NFVDsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEl0ZXJhYmxlIHx8IG8gaW5zdGFuY2VvZiBJdGVyYXRvcikKLSAgICAgICAgICAgIHJldHVybiBUb2tlbnMuVkFMX0FHR1JFR0FURV9UT19MSVNUOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAgICAgcmV0dXJuIFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX01BUDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFRva2Vucy5WQUxfQUdHUkVHQVRFX1RPX05PTkU7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEJ1bGtTZXRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxPYmplY3QsTG9uZz4+IGl0dHk7Ci0KLSAgICAgICAgcHVibGljIEJ1bGtTZXRJdGVyYXRvcihmaW5hbCBCdWxrU2V0PE9iamVjdD4gYnVsa1NldCkgewotICAgICAgICAgICAgaXR0eSA9IGJ1bGtTZXQuYXNCdWxrKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXR0eS5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5PE9iamVjdCwgTG9uZz4gZW50cnkgPSBpdHR5Lm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbW90ZVRyYXZlcnNlcjw+KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NsaWVudENvbm5lY3Rpb25JbnRlZ3JhdGVUZXN0LmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL0NsaWVudENvbm5lY3Rpb25JbnRlZ3JhdGVUZXN0LmphdmEKaW5kZXggODcwNDJkYy4uYmQ1MDc1MCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9DbGllbnRDb25uZWN0aW9uSW50ZWdyYXRlVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvQ2xpZW50Q29ubmVjdGlvbkludGVncmF0ZVRlc3QuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuQ29ycnVwdGVkRnJhbWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuU2VyaWFsaXplcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuQWJzdHJhY3RHcmVtbGluU2VydmVySW50ZWdyYXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLlRlc3RDbGllbnRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5Mb2c0alJlY29yZGluZ0FwcGVuZGVyOwpAQCAtNzAsNiArNzEsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNob3VsZENsb3NlQ29ubmVjdGlvbkRlYWREdWVUb1VuUmVjb3ZlcmFibGVFcnJvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgYSBsb3cgdmFsdWUgb2YgbWF4Q29udGVudExlbmd0aCB0byBpbnRlbnRpb25hbGx5IHRyaWdnZXIgQ29ycnVwdGVkRnJhbWVFeGNlcHRpb24KICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXJpYWxpemVyKFNlcmlhbGl6ZXJzLkdSWU9fVjNEMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4Q29udGVudExlbmd0aCg2NCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluQ29ubmVjdGlvblBvb2xTaXplKDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heENvbm5lY3Rpb25Qb29sU2l6ZSgyKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvQWJzdHJhY3RSZW1vdGVHcmFwaFByb3ZpZGVyLmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9BYnN0cmFjdFJlbW90ZUdyYXBoUHJvdmlkZXIuamF2YQppbmRleCBlODZhNTQ2Li43YmYyNDIzIDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9BYnN0cmFjdFJlbW90ZUdyYXBoUHJvdmlkZXIuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9BYnN0cmFjdFJlbW90ZUdyYXBoUHJvdmlkZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnJlbW90ZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5BYnN0cmFjdEdyYXBoUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uVGVzdEhlbHBlcjsKZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0dyYXBoQmluYXJ5UmVtb3RlR3JhcGhDb21wdXRlclByb3ZpZGVyLmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9HcmFwaEJpbmFyeVJlbW90ZUdyYXBoQ29tcHV0ZXJQcm92aWRlci5qYXZhCmluZGV4IGZhMDdjYTMuLmQ2ZTc1M2QgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0dyYXBoQmluYXJ5UmVtb3RlR3JhcGhDb21wdXRlclByb3ZpZGVyLmphdmEKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvR3JhcGhCaW5hcnlSZW1vdGVHcmFwaENvbXB1dGVyUHJvdmlkZXIuamF2YQpAQCAtNTcsMTEgKzU3LDcgQEAKICAgICAgICAgcmVhc29uID0gIk1pZC10cmF2ZXJzYWwgVigpL0UoKSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiBHcmFwaENvbXB1dGVyIikKIEBHcmFwaC5PcHRPdXQoCiAgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuSW5qZWN0VGVzdCIsCi0gICAgICAgIG1ldGhvZCA9ICJnX1ZYMVhfaW5qZWN0WGdfVlg0WFhfb3V0X25hbWUiLAotICAgICAgICByZWFzb24gPSAiVGhlIGluamVjdCgpIHN0ZXAgaXMgbm90IHN1cHBvcnRlZCBieSBHcmFwaENvbXB1dGVyIikKLUBHcmFwaC5PcHRPdXQoCi0gICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuSW5qZWN0VGVzdCIsCi0gICAgICAgIG1ldGhvZCA9ICJnX1ZYMVhfb3V0X2luamVjdFh2MlhfbmFtZSIsCisgICAgICAgIG1ldGhvZCA9ICIqIiwKICAgICAgICAgcmVhc29uID0gIlRoZSBpbmplY3QoKSBzdGVwIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR3JhcGhDb21wdXRlciIpCiBAR3JhcGguT3B0T3V0KAogICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuTWF0aFRlc3QiLApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvR3JhcGhTT05SZW1vdGVHcmFwaENvbXB1dGVyUHJvdmlkZXIuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0dyYXBoU09OUmVtb3RlR3JhcGhDb21wdXRlclByb3ZpZGVyLmphdmEKaW5kZXggNjQ4ZGU1Yy4uMzBlY2Y4NSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvR3JhcGhTT05SZW1vdGVHcmFwaENvbXB1dGVyUHJvdmlkZXIuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9HcmFwaFNPTlJlbW90ZUdyYXBoQ29tcHV0ZXJQcm92aWRlci5qYXZhCkBAIC01NywxMSArNTcsNyBAQAogICAgICAgICByZWFzb24gPSAiTWlkLXRyYXZlcnNhbCBWKCkvRSgpIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIG9uIEdyYXBoQ29tcHV0ZXIiKQogQEdyYXBoLk9wdE91dCgKICAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JbmplY3RUZXN0IiwKLSAgICAgICAgbWV0aG9kID0gImdfVlgxWF9pbmplY3RYZ19WWDRYWF9vdXRfbmFtZSIsCi0gICAgICAgIHJlYXNvbiA9ICJUaGUgaW5qZWN0KCkgc3RlcCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEdyYXBoQ29tcHV0ZXIiKQotQEdyYXBoLk9wdE91dCgKLSAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JbmplY3RUZXN0IiwKLSAgICAgICAgbWV0aG9kID0gImdfVlgxWF9vdXRfaW5qZWN0WHYyWF9uYW1lIiwKKyAgICAgICAgbWV0aG9kID0gIioiLAogICAgICAgICByZWFzb24gPSAiVGhlIGluamVjdCgpIHN0ZXAgaXMgbm90IHN1cHBvcnRlZCBieSBHcmFwaENvbXB1dGVyIikKIEBHcmFwaC5PcHRPdXQoCiAgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5NYXRoVGVzdCIsCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9HcnlvUmVtb3RlR3JhcGhDb21wdXRlclByb3ZpZGVyLmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZHJpdmVyL3JlbW90ZS9HcnlvUmVtb3RlR3JhcGhDb21wdXRlclByb3ZpZGVyLmphdmEKaW5kZXggZTVjMWE0ZC4uNmU2NTk4OSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2RyaXZlci9yZW1vdGUvR3J5b1JlbW90ZUdyYXBoQ29tcHV0ZXJQcm92aWRlci5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9kcml2ZXIvcmVtb3RlL0dyeW9SZW1vdGVHcmFwaENvbXB1dGVyUHJvdmlkZXIuamF2YQpAQCAtNTgsMTEgKzU4LDcgQEAKICAgICAgICAgcmVhc29uID0gIk1pZC10cmF2ZXJzYWwgVigpL0UoKSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiBHcmFwaENvbXB1dGVyIikKIEBHcmFwaC5PcHRPdXQoCiAgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuSW5qZWN0VGVzdCIsCi0gICAgICAgIG1ldGhvZCA9ICJnX1ZYMVhfaW5qZWN0WGdfVlg0WFhfb3V0X25hbWUiLAotICAgICAgICByZWFzb24gPSAiVGhlIGluamVjdCgpIHN0ZXAgaXMgbm90IHN1cHBvcnRlZCBieSBHcmFwaENvbXB1dGVyIikKLUBHcmFwaC5PcHRPdXQoCi0gICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuSW5qZWN0VGVzdCIsCi0gICAgICAgIG1ldGhvZCA9ICJnX1ZYMVhfb3V0X2luamVjdFh2MlhfbmFtZSIsCisgICAgICAgIG1ldGhvZCA9ICIqIiwKICAgICAgICAgcmVhc29uID0gIlRoZSBpbmplY3QoKSBzdGVwIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR3JhcGhDb21wdXRlciIpCiBAR3JhcGguT3B0T3V0KAogICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuTWF0aFRlc3QiLApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3J5b1JlbW90ZUdyYXBoR3Jvb3Z5VHJhbnNsYXRvckNvbXB1dGVyUHJvdmlkZXIuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9ncm9vdnkvanNyMjIzL0dyeW9SZW1vdGVHcmFwaEdyb292eVRyYW5zbGF0b3JDb21wdXRlclByb3ZpZGVyLmphdmEKaW5kZXggYjU5NDEyNy4uMmUwOGFhOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2dyb292eS9qc3IyMjMvR3J5b1JlbW90ZUdyYXBoR3Jvb3Z5VHJhbnNsYXRvckNvbXB1dGVyUHJvdmlkZXIuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vZ3Jvb3Z5L2pzcjIyMy9HcnlvUmVtb3RlR3JhcGhHcm9vdnlUcmFuc2xhdG9yQ29tcHV0ZXJQcm92aWRlci5qYXZhCkBAIC02MCwxMSArNjAsNyBAQAogICAgICAgICByZWFzb24gPSAiTWlkLXRyYXZlcnNhbCBWKCkvRSgpIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIG9uIEdyYXBoQ29tcHV0ZXIiKQogQEdyYXBoLk9wdE91dCgKICAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JbmplY3RUZXN0IiwKLSAgICAgICAgbWV0aG9kID0gImdfVlgxWF9pbmplY3RYZ19WWDRYWF9vdXRfbmFtZSIsCi0gICAgICAgIHJlYXNvbiA9ICJUaGUgaW5qZWN0KCkgc3RlcCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEdyYXBoQ29tcHV0ZXIiKQotQEdyYXBoLk9wdE91dCgKLSAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JbmplY3RUZXN0IiwKLSAgICAgICAgbWV0aG9kID0gImdfVlgxWF9vdXRfaW5qZWN0WHYyWF9uYW1lIiwKKyAgICAgICAgbWV0aG9kID0gIioiLAogICAgICAgICByZWFzb24gPSAiVGhlIGluamVjdCgpIHN0ZXAgaXMgbm90IHN1cHBvcnRlZCBieSBHcmFwaENvbXB1dGVyIikKIEBHcmFwaC5PcHRPdXQoCiAgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5NYXRoVGVzdCIsCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0Fic3RyYWN0R3JlbWxpblNlcnZlckludGVncmF0aW9uVGVzdC5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9BYnN0cmFjdEdyZW1saW5TZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuamF2YQppbmRleCA2NjdjNjlmLi45ZmE4NTA0IDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0Fic3RyYWN0R3JlbWxpblNlcnZlckludGVncmF0aW9uVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvQWJzdHJhY3RHcmVtbGluU2VydmVySW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLm5lbzRqLnRpbmtlcnBvcC5hcGkuaW1wbC5OZW80akdyYXBoQVBJSW1wbCIpOwogICAgICAgICAgICAgbmVvNGpJbmNsdWRlZEZvclRlc3RpbmcgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CiAgICAgICAgICAgICBuZW80akluY2x1ZGVkRm9yVGVzdGluZyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGFzc3VtZVRoYXQoIk5lbzRqIGltcGxlbWVudGF0aW9uIHdhcyBub3QgaW5jbHVkZWQgZm9yIHRlc3RpbmcgLSBydW4gd2l0aCAtRGluY2x1ZGVOZW80aiIsIG5lbzRqSW5jbHVkZWRGb3JUZXN0aW5nLCBpcyh0cnVlKSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5Ecml2ZXJJbnRlZ3JhdGVUZXN0LmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5Ecml2ZXJJbnRlZ3JhdGVUZXN0LmphdmEKaW5kZXggZDc0NzkxMy4uYWU3NjZiZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluRHJpdmVySW50ZWdyYXRlVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpbkRyaXZlckludGVncmF0ZVRlc3QuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5leGNlcHRpb24uRXhjZXB0aW9uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQ2hhbm5lbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQ2xpZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNsdXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuUmVxdWVzdE9wdGlvbnM7CkBAIC0zMyw2ICszMiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXF1ZXN0TWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlc3BvbnNlU3RhdHVzQ29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5yZW1vdGUuRHJpdmVyUmVtb3RlQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zZXIuR3JhcGhCaW5hcnlNZXNzYWdlU2VyaWFsaXplclYxOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWM2QwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5Kc29uQnVpbGRlckdyeW9TZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNlci5HcnlvTWVzc2FnZVNlcmlhbGl6ZXJWMWQwOwpAQCAtNDEsNyArNDEsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQW5vbnltb3VzVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQnl0ZWNvZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuY2hhbm5lbC5OaW9DaGFubmVsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uU3RvcmFnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmRldGFjaGVkLkRldGFjaGVkVmVydGV4OwpAQCAtMTU5LDkgKzE1OCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICJzaG91bGRXb3JrT3Zlck5pb1RyYW5zcG9ydCI6Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MuY2hhbm5lbGl6ZXIgPSBOaW9DaGFubmVsaXplci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICJzaG91bGRGYWlsV2l0aEJhZENsaWVudFNpZGVTZXJpYWxpemF0aW9uIjoKICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY3VzdG9tID0gQXJyYXlzLmFzTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIEpzb25CdWlsZGVyLmNsYXNzLmdldE5hbWUoKSArICI7IiArIEpzb25CdWlsZGVyR3J5b1NlcmlhbGl6ZXIuY2xhc3MuZ2V0TmFtZSgpLApAQCAtMTkzLDkgKzE4OSw2IEBACiAgICAgICAgICAgICBjYXNlICJzaG91bGRQcm9jZXNzRXZhbEludGVycnVwdGlvbiI6CiAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZXZhbHVhdGlvblRpbWVvdXQgPSAxNTAwOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAic2hvdWxkUHJvY2Vzc0V2YWxUaW1lb3V0T3ZlcnJpZGUiOgotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNjcmlwdEV2YWx1YXRpb25UaW1lb3V0ID0gMTUwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc2V0dGluZ3M7CkBAIC0yMjgsMjUgKzIyMSw2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRQcm9jZXNzRXZhbFRpbWVvdXRPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5vcGVuKCk7Ci0gICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RPcHRpb25zIG9wdGlvbnMgPSBSZXF1ZXN0T3B0aW9ucy5idWlsZCgpLnRpbWVvdXQoNTAwKS5jcmVhdGUoKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGllbnQuc3VibWl0KCJUaHJlYWQuc2xlZXAoNTAwMCk7J2RvbmUnIiwgb3B0aW9ucykuYWxsKCkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGltZWQgb3V0Iik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZUV4Y2VwdGlvbiByZSA9IChSZXNwb25zZUV4Y2VwdGlvbikgZXguZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9USU1FT1VULCByZS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbHVzdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZFByb2Nlc3NUcmF2ZXJzYWxJbnRlcnJ1cHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3Rvcnkub3BlbigpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CkBAIC01MjAsOSArNDk0LDggQEAKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3Rvcnkub3BlbigpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBSZXN1bHRTZXQgcmVzdWx0cyA9IGNsaWVudC5zdWJtaXQoIjEvMCIpOwotCiAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc3VsdFNldCByZXN1bHRzID0gY2xpZW50LnN1Ym1pdCgiMS8wIik7CiAgICAgICAgICAgICAgICAgcmVzdWx0cy5hbGwoKS5qb2luKCk7CiAgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiBvdmVyIGJhZCBzZXJpYWxpemF0aW9uIik7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKQEAgLTUzMyw3ICs1MDYsNyBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlRXhjZXB0aW9uIHJleCA9IChSZXNwb25zZUV4Y2VwdGlvbikgaW5uZXI7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQXJpdGhtZXRpY0V4Y2VwdGlvbiIsIHJleC5nZXRSZW1vdGVFeGNlcHRpb25IaWVyYXJjaHkoKS5nZXQoKS5nZXQoMCkpOwogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXguZ2V0UmVtb3RlRXhjZXB0aW9uSGllcmFyY2h5KCkuZ2V0KCkuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHJleC5nZXRSZW1vdGVTdGFja1RyYWNlKCkuZ2V0KCksIHN0YXJ0c1dpdGgoImphdmEubGFuZy5Bcml0aG1ldGljRXhjZXB0aW9uOiBEaXZpc2lvbiBieSB6ZXJvXG5cdGF0IGphdmEubWF0aC5CaWdEZWNpbWFsLmRpdmlkZShCaWdEZWNpbWFsLmphdmEiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXguZ2V0UmVtb3RlU3RhY2tUcmFjZSgpLmdldCgpLCBjb250YWluc1N0cmluZygiRGl2aXNpb24gYnkgemVybyIpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBkaWUgY29tcGxldGVseSBqdXN0IGJlY2F1c2Ugd2UgaGFkIGEgYmFkIHNlcmlhbGl6YXRpb24gZXJyb3IuICB0aGF0IGtpbmQgb2Ygc3R1ZmYgaGFwcGVucwpAQCAtNjMyLDI3ICs2MDUsNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkV29ya092ZXJOaW9UcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5jaGFubmVsaXplcihDaGFubmVsaXplci5OaW9DaGFubmVsaXplci5jbGFzcy5nZXROYW1lKCkpLmNyZWF0ZSgpOwotICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY2hlY2tlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOwotICAgICAgICAgICAgZmluYWwgUmVzdWx0U2V0IHJlc3VsdHMgPSBjbGllbnQuc3VibWl0KCJbMSwyLDMsNCw1LDYsNyw4LDldIik7Ci0gICAgICAgICAgICB3aGlsZSAoIXJlc3VsdHMuYWxsSXRlbXNBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0cy5nZXRBdmFpbGFibGVJdGVtQ291bnQoKSA8IDEwKTsKLSAgICAgICAgICAgICAgICBjaGVja2VkLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNoZWNrZWQuZ2V0KCkgPiAwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyg5LCByZXN1bHRzLmdldEF2YWlsYWJsZUl0ZW1Db3VudCgpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsdXN0ZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkU3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIENsdXN0ZXIgY2x1c3RlciA9IFRlc3RDbGllbnRGYWN0b3J5Lm9wZW4oKTsKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwpAQCAtODU4LDYgKzgxMCwyNCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkU2VyaWFsaXplVG9TdHJpbmdXaGVuUmVxdWVzdGVkR3JhcGhCaW5hcnlWMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIG0ucHV0KCJzZXJpYWxpemVSZXN1bHRUb1N0cmluZyIsIHRydWUpOworICAgICAgICBmaW5hbCBHcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEgc2VyaWFsaXplciA9IG5ldyBHcmFwaEJpbmFyeU1lc3NhZ2VTZXJpYWxpemVyVjEoKTsKKyAgICAgICAgc2VyaWFsaXplci5jb25maWd1cmUobSwgbnVsbCk7CisKKyAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5zZXJpYWxpemVyKHNlcmlhbGl6ZXIpLmNyZWF0ZSgpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CisKKyAgICAgICAgZmluYWwgUmVzdWx0U2V0IHJlc3VsdFNldCA9IGNsaWVudC5zdWJtaXQoIlRpbmtlckZhY3RvcnkuY3JlYXRlQ2xhc3NpYygpIik7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzdWx0PiByZXN1bHRzID0gcmVzdWx0U2V0LmFsbCgpLmpvaW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aW5rZXJncmFwaFt2ZXJ0aWNlczo2IGVkZ2VzOjZdIiwgcmVzdWx0cy5nZXQoMCkuZ2V0U3RyaW5nKCkpOworCisgICAgICAgIGNsdXN0ZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZFNlcmlhbGl6ZVRvU3RyaW5nV2hlblJlcXVlc3RlZEdyeW9WMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIG0ucHV0KCJzZXJpYWxpemVSZXN1bHRUb1N0cmluZyIsIHRydWUpOwpAQCAtOTk5LDEyICs5NjksMTEgQEAKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnN0YW50IG5vdyA9IEluc3RhbnQubm93KCk7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFJlc3VsdD4gciA9IGNsaWVudC5zdWJtaXQoImphdmEudGltZS5JbnN0YW50Lm9mRXBvY2hNaWxsaSgiICsgbm93LnRvRXBvY2hNaWxsaSgpICsgIikiKS5hbGwoKS5qb2luKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlc3VsdD4gciA9IGNsaWVudC5zdWJtaXQoImphdmEudGltZS5JbnN0YW50LkVQT0NIIikuYWxsKCkuam9pbigpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHIuc2l6ZSgpKTsKIAogICAgICAgICAgICAgZmluYWwgSW5zdGFudCB0aGVuID0gci5nZXQoMCkuZ2V0KEluc3RhbnQuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdywgdGhlbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW5zdGFudC5FUE9DSCwgdGhlbik7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBjbHVzdGVyLmNsb3NlKCk7CiAgICAgICAgIH0KQEAgLTEwMzcsMTIgKzEwMDYsMTEgQEAKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnN0YW50IG5vdyA9IEluc3RhbnQubm93KCk7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFJlc3VsdD4gciA9IGNsaWVudC5zdWJtaXQoImphdmEudGltZS5JbnN0YW50Lm9mRXBvY2hNaWxsaSgiICsgbm93LnRvRXBvY2hNaWxsaSgpICsgIikiKS5hbGwoKS5qb2luKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlc3VsdD4gciA9IGNsaWVudC5zdWJtaXQoImphdmEudGltZS5JbnN0YW50LkVQT0NIIikuYWxsKCkuam9pbigpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHIuc2l6ZSgpKTsKIAogICAgICAgICAgICAgZmluYWwgSW5zdGFudCB0aGVuID0gci5nZXQoMCkuZ2V0KEluc3RhbnQuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdywgdGhlbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW5zdGFudC5FUE9DSCwgdGhlbik7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBjbHVzdGVyLmNsb3NlKCk7CiAgICAgICAgIH0KQEAgLTExNzEsMTggKzExMzksMTggQEAKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3Rvcnkub3BlbigpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KG5hbWUuZ2V0TWV0aG9kTmFtZSgpKTsKIAotICAgICAgICBmaW5hbCBWZXJ0ZXggdmVydGV4QmVmb3JlVHggPSBjbGllbnQuc3VibWl0KCJ2PWdyYXBoLmFkZFZlcnRleChcIm5hbWVcIixcInN0ZXBoZW5cIikiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIHZlcnRleEJlZm9yZVR4LnZhbHVlcygibmFtZSIpLm5leHQoKSk7CisgICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXhCZWZvcmVUeCA9IGNsaWVudC5zdWJtaXQoInY9Zy5hZGRWKFwicGVyc29uXCIpLnByb3BlcnR5KFwibmFtZVwiLFwic3RlcGhlblwiKS5uZXh0KCkiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGVyc29uIiwgdmVydGV4QmVmb3JlVHgubGFiZWwoKSk7CiAKLSAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleEZyb21WID0gY2xpZW50LnN1Ym1pdCgiZ3JhcGgudmVydGljZXMoKS5uZXh0KCkiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIHZlcnRleEZyb21WLnZhbHVlcygibmFtZSIpLm5leHQoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lVmFsdWVGcm9tViA9IGNsaWVudC5zdWJtaXQoImcuVigpLnZhbHVlcygnbmFtZScpLm5leHQoKSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRTdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGVwaGVuIiwgbmFtZVZhbHVlRnJvbVYpOwogCiAgICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXhGcm9tQmluZGluZyA9IGNsaWVudC5zdWJtaXQoInYiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIHZlcnRleEZyb21CaW5kaW5nLnZhbHVlcygibmFtZSIpLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGVyc29uIiwgdmVydGV4RnJvbUJpbmRpbmcubGFiZWwoKSk7CiAKLSAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleEFmdGVyVHggPSBjbGllbnQuc3VibWl0KCJ2LnByb3BlcnR5KFwiY29sb3JcIixcImJsdWVcIik7IGdyYXBoLnR4KCkuY29tbWl0KCk7IHYiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIHZlcnRleEFmdGVyVHgudmFsdWVzKCJuYW1lIikubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJibHVlIiwgdmVydGV4QWZ0ZXJUeC52YWx1ZXMoImNvbG9yIikubmV4dCgpKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IHZlcnRleEFmdGVyVHggPSBjbGllbnQuc3VibWl0KCJnLlYodikucHJvcGVydHkoXCJjb2xvclwiLFwiYmx1ZVwiKS5pdGVyYXRlKCk7IGcudHgoKS5jb21taXQoKTsgZy5WKHYpLnZhbHVlTWFwKCkuYnkodW5mb2xkKCkpIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldChNYXAuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN0ZXBoZW4iLCB2ZXJ0ZXhBZnRlclR4LmdldCgibmFtZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibHVlIiwgdmVydGV4QWZ0ZXJUeC5nZXQoImNvbG9yIikpOwogCiAgICAgICAgIGNsdXN0ZXIuY2xvc2UoKTsKICAgICB9CkBAIC0xMTk3LDI5ICsxMTY1LDI5IEBACiAgICAgICAgIGNsaWVudC5zdWJtaXQoImdyYXBoLnR4KCkub25SZWFkV3JpdGUoVHJhbnNhY3Rpb24uUkVBRF9XUklURV9CRUhBVklPUi5NQU5VQUwpO251bGwiKS5hbGwoKS5nZXQoKTsKICAgICAgICAgY2xpZW50LnN1Ym1pdCgiZ3JhcGgudHgoKS5vcGVuKCkiKS5hbGwoKS5nZXQoKTsKIAotICAgICAgICBmaW5hbCBWZXJ0ZXggdmVydGV4QmVmb3JlVHggPSBjbGllbnQuc3VibWl0KCJ2PWdyYXBoLmFkZFZlcnRleChcIm5hbWVcIixcInN0ZXBoZW5cIikiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIHZlcnRleEJlZm9yZVR4LnZhbHVlcygibmFtZSIpLm5leHQoKSk7CisgICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXhCZWZvcmVUeCA9IGNsaWVudC5zdWJtaXQoInY9Zy5hZGRWKFwicGVyc29uXCIpLnByb3BlcnR5KFwibmFtZVwiLCBcInN0ZXBoZW5cIikubmV4dCgpIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldFZlcnRleCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIHZlcnRleEJlZm9yZVR4LmxhYmVsKCkpOwogCi0gICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXhGcm9tViA9IGNsaWVudC5zdWJtaXQoImdyYXBoLnZlcnRpY2VzKCkubmV4dCgpIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldFZlcnRleCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInN0ZXBoZW4iLCB2ZXJ0ZXhGcm9tVi52YWx1ZXMoIm5hbWUiKS5uZXh0KCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZVZhbHVlRnJvbVYgPSBjbGllbnQuc3VibWl0KCJnLlYoKS52YWx1ZXMoXCJuYW1lXCIpLm5leHQoKSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRTdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGVwaGVuIiwgbmFtZVZhbHVlRnJvbVYpOwogCiAgICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXhGcm9tQmluZGluZyA9IGNsaWVudC5zdWJtaXQoInYiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIHZlcnRleEZyb21CaW5kaW5nLnZhbHVlcygibmFtZSIpLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGVyc29uIiwgdmVydGV4RnJvbUJpbmRpbmcubGFiZWwoKSk7CiAKLSAgICAgICAgY2xpZW50LnN1Ym1pdCgidi5wcm9wZXJ0eShcImNvbG9yXCIsXCJibHVlXCIpIikuYWxsKCkuZ2V0KCk7Ci0gICAgICAgIGNsaWVudC5zdWJtaXQoImdyYXBoLnR4KCkuY29tbWl0KCkiKS5hbGwoKS5nZXQoKTsKKyAgICAgICAgY2xpZW50LnN1Ym1pdCgiZy5WKHYpLnByb3BlcnR5KFwiY29sb3JcIixcImJsdWVcIikiKS5hbGwoKS5nZXQoKTsKKyAgICAgICAgY2xpZW50LnN1Ym1pdCgiZy50eCgpLmNvbW1pdCgpIikuYWxsKCkuZ2V0KCk7CiAKICAgICAgICAgLy8gUnVuIGEgc2Vzc2lvbmxlc3MgcmVxdWVzdCB0byBjaGFuZ2UgdHJhbnNhY3Rpb24ucmVhZFdyaXRlQ29uc3VtZXIgYmFjayB0byBBVVRPCiAgICAgICAgIC8vIFRoZSB3aWxsIG1ha2UgdGhlIG5leHQgaW4gc2Vzc2lvbiByZXF1ZXN0IGZhaWwgaWYgY29uc3VtZXJzIGFyZW4ndCBUaHJlYWRMb2NhbAotICAgICAgICBzZXNzaW9ubGVzc0NsaWVudC5zdWJtaXQoImdyYXBoLnZlcnRpY2VzKCkubmV4dCgpIikuYWxsKCkuZ2V0KCk7CisgICAgICAgIHNlc3Npb25sZXNzQ2xpZW50LnN1Ym1pdCgiZy5WKCkubmV4dCgpIikuYWxsKCkuZ2V0KCk7CiAKLSAgICAgICAgY2xpZW50LnN1Ym1pdCgiZ3JhcGgudHgoKS5vcGVuKCkiKS5hbGwoKS5nZXQoKTsKKyAgICAgICAgY2xpZW50LnN1Ym1pdCgiZy50eCgpLm9wZW4oKSIpLmFsbCgpLmdldCgpOwogCi0gICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXhBZnRlclR4ID0gY2xpZW50LnN1Ym1pdCgiZ3JhcGgudmVydGljZXMoKS5uZXh0KCkiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIHZlcnRleEFmdGVyVHgudmFsdWVzKCJuYW1lIikubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJibHVlIiwgdmVydGV4QWZ0ZXJUeC52YWx1ZXMoImNvbG9yIikubmV4dCgpKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IHZlcnRleEFmdGVyVHggPSBjbGllbnQuc3VibWl0KCJnLlYoKS52YWx1ZU1hcCgpLmJ5KHVuZm9sZCgpKSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXQoTWFwLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGVwaGVuIiwgdmVydGV4QWZ0ZXJUeC5nZXQoIm5hbWUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmx1ZSIsIHZlcnRleEFmdGVyVHguZ2V0KCJjb2xvciIpKTsKIAotICAgICAgICBjbGllbnQuc3VibWl0KCJncmFwaC50eCgpLnJvbGxiYWNrKCkiKS5hbGwoKS5nZXQoKTsKKyAgICAgICAgY2xpZW50LnN1Ym1pdCgiZy50eCgpLnJvbGxiYWNrKCkiKS5hbGwoKS5nZXQoKTsKIAogICAgICAgICBjbHVzdGVyLmNsb3NlKCk7CiAgICAgfQpAQCAtMTIzNCwyMCArMTIwMiwyMCBAQAogICAgICAgICAgICAgZmluYWwgQ2xpZW50IHNlc3Npb25sZXNzQ2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CiAKICAgICAgICAgICAgIC8vb3BlbiB0cmFuc2FjdGlvbiBpbiBzZXNzaW9uLCB0aGVuIGFkZCB2ZXJ0ZXggYW5kIGNvbW1pdAotICAgICAgICAgICAgc2Vzc2lvbkNsaWVudC5zdWJtaXQoImdyYXBoLnR4KCkub3BlbigpIikuYWxsKCkuZ2V0KCk7Ci0gICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdmVydGV4QmVmb3JlVHggPSBzZXNzaW9uQ2xpZW50LnN1Ym1pdCgidj1ncmFwaC5hZGRWZXJ0ZXgoXCJuYW1lXCIsXCJzdGVwaGVuXCIpIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldFZlcnRleCgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGVwaGVuIiwgdmVydGV4QmVmb3JlVHgudmFsdWVzKCJuYW1lIikubmV4dCgpKTsKLSAgICAgICAgICAgIHNlc3Npb25DbGllbnQuc3VibWl0KCJncmFwaC50eCgpLmNvbW1pdCgpIikuYWxsKCkuZ2V0KCk7CisgICAgICAgICAgICBzZXNzaW9uQ2xpZW50LnN1Ym1pdCgiZy50eCgpLm9wZW4oKSIpLmFsbCgpLmdldCgpOworICAgICAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleEJlZm9yZVR4ID0gc2Vzc2lvbkNsaWVudC5zdWJtaXQoInY9Zy5hZGRWKFwicGVyc29uXCIpLnByb3BlcnR5KFwibmFtZVwiLFwic3RlcGhlblwiKS5uZXh0KCkiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIHZlcnRleEJlZm9yZVR4LmxhYmVsKCkpOworICAgICAgICAgICAgc2Vzc2lvbkNsaWVudC5zdWJtaXQoImcudHgoKS5jb21taXQoKSIpLmFsbCgpLmdldCgpOwogCiAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHNlc3Npb24gdHJhbnNhY3Rpb24gaXMgY2xvc2VkCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzT3BlbiA9IHNlc3Npb25DbGllbnQuc3VibWl0KCJncmFwaC50eCgpLmlzT3BlbigpIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNPcGVuID0gc2Vzc2lvbkNsaWVudC5zdWJtaXQoImcudHgoKS5pc09wZW4oKSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRCb29sZWFuKCk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUcmFuc2FjdGlvbiBzaG91bGQgYmUgY2xvc2VkIiwgIWlzT3Blbik7CiAKICAgICAgICAgICAgIC8vcnVuIGEgc2Vzc2lvbmxlc3MgcmVhZAotICAgICAgICAgICAgc2Vzc2lvbmxlc3NDbGllbnQuc3VibWl0KCJncmFwaC50cmF2ZXJzYWwoKS5WKCkiKS5hbGwoKS5nZXQoKTsKKyAgICAgICAgICAgIHNlc3Npb25sZXNzQ2xpZW50LnN1Ym1pdCgiZy5WKCkiKS5hbGwoKS5nZXQoKTsKIAogICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBzZXNzaW9uIHRyYW5zYWN0aW9uIGlzIHN0aWxsIGNsb3NlZAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc09wZW5BZnRlclNlc3Npb25sZXNzID0gc2Vzc2lvbkNsaWVudC5zdWJtaXQoImdyYXBoLnR4KCkuaXNPcGVuKCkiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0Qm9vbGVhbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc09wZW5BZnRlclNlc3Npb25sZXNzID0gc2Vzc2lvbkNsaWVudC5zdWJtaXQoImcudHgoKS5pc09wZW4oKSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRCb29sZWFuKCk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUcmFuc2FjdGlvbiBzaG91bGQgc3RpbCBiZSBjbG9zZWQiLCAhaXNPcGVuQWZ0ZXJTZXNzaW9ubGVzcyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBjbHVzdGVyLmNsb3NlKCk7CkBAIC0xNDQ0LDggKzE0MTIsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgQ2xpZW50IHJlYm91bmQgPSBjbHVzdGVyLmNvbm5lY3QoKS5hbGlhcygiZ3JhcGgiKTsKLSAgICAgICAgZmluYWwgVmVydGV4IHYgPSByZWJvdW5kLnN1Ym1pdCgiZy5hZGRWZXJ0ZXgoJ25hbWUnLCdqYXNvbicpIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldFZlcnRleCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphc29uIiwgdi52YWx1ZSgibmFtZSIpKTsKKyAgICAgICAgZmluYWwgVmVydGV4IHYgPSByZWJvdW5kLnN1Ym1pdCgiZy5hZGRWZXJ0ZXgoVC5sYWJlbCwncGVyc29uJykiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGVyc29uIiwgdi5sYWJlbCgpKTsKIAogICAgICAgICBjbHVzdGVyLmNsb3NlKCk7CiAgICAgfQpAQCAtMTQ1NiwyOCArMTQyNCwyNyBAQAogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsaWVudC5zdWJtaXQoImcuYWRkVmVydGV4KCduYW1lJywnc3RlcGhlbicpOyIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRWZXJ0ZXgoKTsKKyAgICAgICAgICAgIGNsaWVudC5zdWJtaXQoImcuYWRkVmVydGV4KGxhYmVsLCdwZXJzb24nLCduYW1lJywnc3RlcGhlbicpOyIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRWZXJ0ZXgoKTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRvc3NlZCBhbiBleGNlcHRpb24gYmVjYXVzZSBcImdcIiBkb2VzIG5vdCBoYXZlIHRoZSBhZGRWZXJ0ZXggbWV0aG9kIHVuZGVyIGRlZmF1bHQgY29uZmlnIik7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoZXgpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChyb290LCBpbnN0YW5jZU9mKFJlc3BvbnNlRXhjZXB0aW9uLmNsYXNzKSk7CiAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZUV4Y2VwdGlvbiByZSA9IChSZXNwb25zZUV4Y2VwdGlvbikgcm9vdDsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX1NDUklQVF9FVkFMVUFUSU9OLCByZS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9FVkFMVUFUSU9OLCByZS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBDbGllbnQgcmVib3VuZCA9IGNsdXN0ZXIuY29ubmVjdCgpLmFsaWFzKCJncmFwaCIpOwotICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IHJlYm91bmQuc3VibWl0KCJnLmFkZFZlcnRleCgnbmFtZScsJ2phc29uJykiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamFzb24iLCB2LnZhbHVlKCJuYW1lIikpOworICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IHJlYm91bmQuc3VibWl0KCJnLmFkZFZlcnRleChsYWJlbCwncGVyc29uJywnbmFtZScsJ2phc29uJykiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0VmVydGV4KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGVyc29uIiwgdi5sYWJlbCgpKTsKIAogICAgICAgICBjbHVzdGVyLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRBbGlhc1RyYXZlcnNhbFNvdXJjZVZhcmlhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5vcGVuKCk7CisgICAgICAgIGZpbmFsIENsdXN0ZXIgY2x1c3RlciA9IFRlc3RDbGllbnRGYWN0b3J5LmJ1aWxkKCkuc2VyaWFsaXplcihTZXJpYWxpemVycy5HUllPX1YzRDApLmNyZWF0ZSgpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7Ci0gICAgICAgIHRyeSB7Ci0KKyAgICAgICAgdHJ5IHsgICAgCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGNsaWVudC5zdWJtaXQoImcuYWRkVigpLnByb3BlcnR5KCduYW1lJywnc3RlcGhlbicpIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldFZlcnRleCgpOwogICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRvc3NlZCBhbiBleGNlcHRpb24gYmVjYXVzZSBcImdcIiBpcyByZWFkb25seSBpbiB0aGlzIGNvbnRleHQiKTsKQEAgLTE0ODUsNyArMTQ1Miw3IEBACiAgICAgICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoZXgpOwogICAgICAgICAgICAgICAgIGFzc2VydFRoYXQocm9vdCwgaW5zdGFuY2VPZihSZXNwb25zZUV4Y2VwdGlvbi5jbGFzcykpOwogICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlRXhjZXB0aW9uIHJlID0gKFJlc3BvbnNlRXhjZXB0aW9uKSByb290OwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX1NDUklQVF9FVkFMVUFUSU9OLCByZS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfRVZBTFVBVElPTiwgcmUuZ2V0UmVzcG9uc2VTdGF0dXNDb2RlKCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50QWxpYXNlZCA9IGNsaWVudC5hbGlhcygiZzEiKTsKQEAgLTE0OTgsNyArMTQ2NSw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZEFsaWFzR3JhcGhWYXJpYWJsZXNJblNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3Rvcnkub3BlbigpOworICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpLnNlcmlhbGl6ZXIoU2VyaWFsaXplcnMuR1JZT19WM0QwKS5jcmVhdGUoKTsKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdChuYW1lLmdldE1ldGhvZE5hbWUoKSk7CiAKICAgICAgICAgdHJ5IHsKQEAgLTE1MDgsNyArMTQ3NSw3IEBACiAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgcm9vdCA9IEV4Y2VwdGlvblV0aWxzLmdldFJvb3RDYXVzZShleCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KHJvb3QsIGluc3RhbmNlT2YoUmVzcG9uc2VFeGNlcHRpb24uY2xhc3MpKTsKICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlRXhjZXB0aW9uIHJlID0gKFJlc3BvbnNlRXhjZXB0aW9uKSByb290OwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfU0NSSVBUX0VWQUxVQVRJT04sIHJlLmdldFJlc3BvbnNlU3RhdHVzQ29kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX0VWQUxVQVRJT04sIHJlLmdldFJlc3BvbnNlU3RhdHVzQ29kZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIENsaWVudCBhbGlhc2VkID0gY2xpZW50LmFsaWFzKCJncmFwaCIpOwpAQCAtMTUyMSw3ICsxNDg4LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkQWxpYXNUcmF2ZXJzYWxTb3VyY2VWYXJpYWJsZXNJblNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3Rvcnkub3BlbigpOworICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpLnNlcmlhbGl6ZXIoU2VyaWFsaXplcnMuR1JZT19WM0QwKS5jcmVhdGUoKTsKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdChuYW1lLmdldE1ldGhvZE5hbWUoKSk7CiAKICAgICAgICAgdHJ5IHsKQEAgLTE1MzEsNyArMTQ5OCw3IEBACiAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgcm9vdCA9IEV4Y2VwdGlvblV0aWxzLmdldFJvb3RDYXVzZShleCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KHJvb3QsIGluc3RhbmNlT2YoUmVzcG9uc2VFeGNlcHRpb24uY2xhc3MpKTsKICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlRXhjZXB0aW9uIHJlID0gKFJlc3BvbnNlRXhjZXB0aW9uKSByb290OwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfU0NSSVBUX0VWQUxVQVRJT04sIHJlLmdldFJlc3BvbnNlU3RhdHVzQ29kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX0VWQUxVQVRJT04sIHJlLmdldFJlc3BvbnNlU3RhdHVzQ29kZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnRBbGlhc2VkID0gY2xpZW50LmFsaWFzKCJnMSIpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluU2VydmVyQXVkaXRMb2dJbnRlZ3JhdGVUZXN0LmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJBdWRpdExvZ0ludGVncmF0ZVRlc3QuamF2YQppbmRleCA4ZWI2MTA2Li40ODQzYzZjIDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJBdWRpdExvZ0ludGVncmF0ZVRlc3QuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJBdWRpdExvZ0ludGVncmF0ZVRlc3QuamF2YQpAQCAtMjUsMjAgKzI1LDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnV0aWwuRW50aXR5VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuTG9nZ2luZ0V2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNoYW5uZWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNsaWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnJlbW90ZS5Ecml2ZXJSZW1vdGVDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQW5vbnltb3VzVHJhdmVyc2FsU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmF1dGguQWxsb3dBbGxBdXRoZW50aWNhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmF1dGguS3JiNUF1dGhlbnRpY2F0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuYXV0aC5TaW1wbGVBdXRoZW50aWNhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmNoYW5uZWwuSHR0cENoYW5uZWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmNoYW5uZWwuTmlvQ2hhbm5lbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uZ3JhcGhzb24uR3JhcGhTT05Ub2tlbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLkxvZzRqUmVjb3JkaW5nQXBwZW5kZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3Auc2hhZGVkLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3Auc2hhZGVkLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC03NCw3ICs3Myw2IEBACiAKICAgICBwcml2YXRlIEtkY0ZpeHR1cmUga2RjU2VydmVyOwogCi0gICAgQEJlZm9yZQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJlY29yZGluZ0FwcGVuZGVyID0gbmV3IExvZzRqUmVjb3JkaW5nQXBwZW5kZXIoKTsKQEAgLTgyLDkgKzgwLDEwIEBACiAgICAgICAgIHJvb3RMb2dnZXIuYWRkQXBwZW5kZXIocmVjb3JkaW5nQXBwZW5kZXIpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYnVpbGREaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLmRpciIpOwotICAgICAgICAgICAga2RjU2VydmVyID0gbmV3IEtkY0ZpeHR1cmUoYnVpbGREaXIgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9ncmVtbGluLWNvbnNvbGUtamFhcy5jb25mIik7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlQmFzZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhDb25maWdOYW1lID0gbW9kdWxlQmFzZURpciArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2dyZW1saW4tY29uc29sZS1qYWFzLmNvbmYiOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnIiwgYXV0aENvbmZpZ05hbWUpOworICAgICAgICAgICAga2RjU2VydmVyID0gbmV3IEtkY0ZpeHR1cmUobW9kdWxlQmFzZURpcik7CiAgICAgICAgICAgICBrZGNTZXJ2ZXIuc2V0VXAoKTsKICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgIHsKICAgICAgICAgICAgIGxvZ2dlci53YXJuKGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTkyLDEzICs5MSwxNCBAQAogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgIH0KIAotICAgIEBBZnRlcgogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgICAgIGZpbmFsIExvZ2dlciByb290TG9nZ2VyID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsKICAgICAgICAgcm9vdExvZ2dlci5yZW1vdmVBcHBlbmRlcihyZWNvcmRpbmdBcHBlbmRlcik7CiAgICAgICAgIGtkY1NlcnZlci5jbG9zZSgpOworICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldHRpbmdzIG92ZXJyaWRlU2V0dGluZ3MoZmluYWwgU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICAgICAgc2V0dGluZ3MuaG9zdCA9IGtkY1NlcnZlci5ob3N0bmFtZTsKKyAgICAgICAgc2V0dGluZ3MuaG9zdCA9IGtkY1NlcnZlci5ncmVtbGluSG9zdG5hbWU7CiAgICAgICAgIGZpbmFsIFNldHRpbmdzLlNzbFNldHRpbmdzIHNzbENvbmZpZyA9IG5ldyBTZXR0aW5ncy5Tc2xTZXR0aW5ncygpOwogICAgICAgICBzc2xDb25maWcuZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICBzZXR0aW5ncy5zc2wgPSBzc2xDb25maWc7CkBAIC0xMjIsNiArMTIyLDcgQEAKICAgICAgICAgICAgIGNhc2UgInNob3VsZEF1ZGl0TG9nV2l0aEFsbG93QWxsQXV0aGVudGljYXRvciI6CiAgICAgICAgICAgICAgICAgYXV0aFNldHRpbmdzLmF1dGhlbnRpY2F0b3IgPSBBbGxvd0FsbEF1dGhlbnRpY2F0b3IuY2xhc3MuZ2V0TmFtZSgpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAic2hvdWxkQXVkaXRMb2dXaXRoVHJhdmVyc2FsT3AiOgogICAgICAgICAgICAgY2FzZSAic2hvdWxkQXVkaXRMb2dXaXRoU2ltcGxlQXV0aGVudGljYXRvciI6CiAgICAgICAgICAgICAgICAgYXV0aFNldHRpbmdzLmF1dGhlbnRpY2F0b3IgPSBTaW1wbGVBdXRoZW50aWNhdG9yLmNsYXNzLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICBhdXRoQ29uZmlnLnB1dChTaW1wbGVBdXRoZW50aWNhdG9yLkNPTkZJR19DUkVERU5USUFMU19EQiwgImNvbmYvdGlua2VyZ3JhcGgtY3JlZGVudGlhbHMucHJvcGVydGllcyIpOwpAQCAtMTMzLDExICsxMzQsNiBAQAogICAgICAgICAgICAgICAgIGF1dGhDb25maWcucHV0KCJrZXl0YWIiLCBrZGNTZXJ2ZXIuc2VydmljZUtleXRhYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgIGF1dGhDb25maWcucHV0KCJwcmluY2lwYWwiLCBrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsKTsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgInNob3VsZEF1ZGl0TG9nV2l0aE5pb1RyYW5zcG9ydCI6Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MuY2hhbm5lbGl6ZXIgPSBOaW9DaGFubmVsaXplci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgYXV0aENvbmZpZy5wdXQoImtleXRhYiIsIGtkY1NlcnZlci5zZXJ2aWNlS2V5dGFiRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgYXV0aENvbmZpZy5wdXQoInByaW5jaXBhbCIsIGtkY1NlcnZlci5zZXJ2ZXJQcmluY2lwYWwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAic2hvdWxkQXVkaXRMb2dXaXRoSHR0cFRyYW5zcG9ydCI6CiAgICAgICAgICAgICAgICAgc2V0dGluZ3MuaG9zdCA9ICJsb2NhbGhvc3QiOwogICAgICAgICAgICAgICAgIHNldHRpbmdzLmNoYW5uZWxpemVyID0gSHR0cENoYW5uZWxpemVyLmNsYXNzLmdldE5hbWUoKTsKQEAgLTE1MSw3ICsxNDcsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkQXVkaXRMb2dXaXRoQWxsb3dBbGxBdXRoZW50aWNhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmhvc3RuYW1lKS5jcmVhdGUoKTsKKyAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmdyZW1saW5Ib3N0bmFtZSkuY3JlYXRlKCk7CiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKIAogICAgICAgICB0cnkgewpAQCAtMTc5LDcgKzE3NSw3IEBACiAgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9ICJwYXNzd29yZCI7CiAKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5jcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpCi0gICAgICAgICAgICAgICAgLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuaG9zdG5hbWUpLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIC5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmdyZW1saW5Ib3N0bmFtZSkuY3JlYXRlKCk7CiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKIAogICAgICAgICB0cnkgewpAQCAtMjE1LDcgKzIxMSw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRBdWRpdExvZ1dpdGhLcmI1QXV0aGVudGljYXRvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpLmphYXNFbnRyeShURVNUQ09OU09MRSkKLSAgICAgICAgICAgICAgICAucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuaG9zdG5hbWUpLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIC5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ncmVtbGluSG9zdG5hbWUpLmNyZWF0ZSgpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2xpZW50LnN1Ym1pdCgiMSsxIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldEludCgpKTsKQEAgLTI0Nyw3ICsyNDMsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkTm90QXVkaXRMb2dXaGVuRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5qYWFzRW50cnkoVEVTVENPTlNPTEUpCi0gICAgICAgICAgICAgICAgLnByb3RvY29sKGtkY1NlcnZlci5zZXJ2ZXJQcmluY2lwYWxOYW1lKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmhvc3RuYW1lKS5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuZ3JlbWxpbkhvc3RuYW1lKS5jcmVhdGUoKTsKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsaWVudC5zdWJtaXQoIjErMSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRJbnQoKSk7CkBAIC0yNzMsMzggKzI2OSw2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRBdWRpdExvZ1dpdGhOaW9UcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5jaGFubmVsaXplcihDaGFubmVsaXplci5OaW9DaGFubmVsaXplci5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgLmphYXNFbnRyeShURVNUQ09OU09MRSkucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuaG9zdG5hbWUpLmNyZWF0ZSgpOwotICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2xpZW50LnN1Ym1pdCgiMSsxIikuYWxsKCkuZ2V0KCkuZ2V0KDApLmdldEludCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBjbGllbnQuc3VibWl0KCIxKzIiKS5hbGwoKS5nZXQoKS5nZXQoMCkuZ2V0SW50KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGNsaWVudC5zdWJtaXQoIjErMyIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRJbnQoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbHVzdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3YWl0IGZvciBsb2dnZXIgdG8gZmx1c2ggLSAoZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYSB3YXkgdG8gZGV0ZWN0IHRoaXMpCi0gICAgICAgIHN0b3BTZXJ2ZXIoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TG9nZ2luZ0V2ZW50PiBsb2cgPSByZWNvcmRpbmdBcHBlbmRlci5nZXRFdmVudHMoKTsKLSAgICAgICAgZmluYWwgU3RyZWFtPExvZ2dpbmdFdmVudD4gYXVkaXRFdmVudHMgPSBsb2cuc3RyZWFtKCkuZmlsdGVyKGV2ZW50IC0+IGV2ZW50LmdldExvZ2dlck5hbWUoKS5lcXVhbHMoQVVESVRfTE9HR0VSX05BTUUpKTsKLSAgICAgICAgZmluYWwgTG9nZ2luZ0V2ZW50IGF1dGhFdmVudCA9IGF1ZGl0RXZlbnRzCi0gICAgICAgICAgICAgICAgLmZpbHRlcihldmVudCAtPiBldmVudC5nZXRNZXNzYWdlKCkudG9TdHJpbmcoKS5jb250YWlucygiS3JiNUF1dGhlbnRpY2F0b3IiKSkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhdXRoTXNnID0gYXV0aEV2ZW50LmdldE1lc3NhZ2UoKS50b1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKGF1dGhFdmVudC5nZXRMZXZlbCgpID09IElORk8gJiYKLSAgICAgICAgICAgICAgICBhdXRoTXNnLm1hdGNoZXMoU3RyaW5nLmZvcm1hdCgiVXNlciAlcyB3aXRoIGFkZHJlc3MgLio/IGF1dGhlbnRpY2F0ZWQgYnkgS3JiNUF1dGhlbnRpY2F0b3IiLCBrZGNTZXJ2ZXIuY2xpZW50UHJpbmNpcGFsTmFtZSkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsb2cuc3RyZWFtKCkuYW55TWF0Y2goaXRlbSAtPiBpdGVtLmdldExldmVsKCkgPT0gSU5GTyAmJgotICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TWVzc2FnZSgpLnRvU3RyaW5nKCkubWF0Y2hlcygiVXNlciB3aXRoIGFkZHJlc3MgLio/IHJlcXVlc3RlZDogMVxcKzEiKSkpOwotICAgICAgICBhc3NlcnRUcnVlKGxvZy5zdHJlYW0oKS5hbnlNYXRjaChpdGVtIC0+IGl0ZW0uZ2V0TGV2ZWwoKSA9PSBJTkZPICYmCi0gICAgICAgICAgICAgICAgaXRlbS5nZXRNZXNzYWdlKCkudG9TdHJpbmcoKS5tYXRjaGVzKCJVc2VyIHdpdGggYWRkcmVzcyAuKj8gcmVxdWVzdGVkOiAxXFwrMiIpKSk7Ci0gICAgICAgIGFzc2VydFRydWUobG9nLnN0cmVhbSgpLmFueU1hdGNoKGl0ZW0gLT4gaXRlbS5nZXRMZXZlbCgpID09IElORk8gJiYKLSAgICAgICAgICAgICAgICBpdGVtLmdldE1lc3NhZ2UoKS50b1N0cmluZygpLm1hdGNoZXMoIlVzZXIgd2l0aCBhZGRyZXNzIC4qPyByZXF1ZXN0ZWQ6IDFcXCszIikpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZEF1ZGl0TG9nV2l0aEh0dHBUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOwogICAgICAgICBmaW5hbCBIdHRwR2V0IGh0dHBnZXQgPSBuZXcgSHR0cEdldChUZXN0Q2xpZW50RmFjdG9yeS5jcmVhdGVVUkxTdHJpbmcoIj9ncmVtbGluPTEtMSIpKTsKQEAgLTMzNiwxMiArMzAwLDQ2IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRBdWRpdExvZ1dpdGhUcmF2ZXJzYWxPcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdXNlcm5hbWUgPSAic3RlcGhlbiI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9ICJwYXNzd29yZCI7CisKKyAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5jcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpCisgICAgICAgICAgICAgICAgLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuZ3JlbWxpbkhvc3RuYW1lKS5jcmVhdGUoKTsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOworICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gQW5vbnltb3VzVHJhdmVyc2FsU291cmNlLnRyYXZlcnNhbCgpLgorICAgICAgICAgICAgICAgIHdpdGhSZW1vdGUoRHJpdmVyUmVtb3RlQ29ubmVjdGlvbi51c2luZyhjbHVzdGVyLCAiZ21vZGVybiIpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGcuVigpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2FpdCBmb3IgbG9nZ2VyIHRvIGZsdXNoIC0gKGRvbid0IHRoaW5rIHRoZXJlIGlzIGEgd2F5IHRvIGRldGVjdCB0aGlzKQorICAgICAgICBzdG9wU2VydmVyKCk7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgc2ltcGxlQXV0aGVudGljYXRvck5hbWUgPSBTaW1wbGVBdXRoZW50aWNhdG9yLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgICAgICBmaW5hbCBMaXN0PExvZ2dpbmdFdmVudD4gbG9nID0gcmVjb3JkaW5nQXBwZW5kZXIuZ2V0RXZlbnRzKCk7CisgICAgICAgIGZpbmFsIFN0cmVhbTxMb2dnaW5nRXZlbnQ+IGF1ZGl0RXZlbnRzID0gbG9nLnN0cmVhbSgpLmZpbHRlcihldmVudCAtPiBldmVudC5nZXRMb2dnZXJOYW1lKCkuZXF1YWxzKEFVRElUX0xPR0dFUl9OQU1FKSk7CisgICAgICAgIGZpbmFsIExvZ2dpbmdFdmVudCBhdXRoRXZlbnQgPSBhdWRpdEV2ZW50cworICAgICAgICAgICAgICAgIC5maWx0ZXIoZXZlbnQgLT4gZXZlbnQuZ2V0TWVzc2FnZSgpLnRvU3RyaW5nKCkuY29udGFpbnMoc2ltcGxlQXV0aGVudGljYXRvck5hbWUpKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhNc2cgPSBhdXRoRXZlbnQuZ2V0TWVzc2FnZSgpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydFRydWUoYXV0aEV2ZW50LmdldExldmVsKCkgPT0gSU5GTyAmJgorICAgICAgICAgICAgICAgIGF1dGhNc2cubWF0Y2hlcyhTdHJpbmcuZm9ybWF0KCJVc2VyICVzIHdpdGggYWRkcmVzcyAuKj8gYXV0aGVudGljYXRlZCBieSAlcyIsIHVzZXJuYW1lLCBzaW1wbGVBdXRoZW50aWNhdG9yTmFtZSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2cuc3RyZWFtKCkuYW55TWF0Y2goaXRlbSAtPiBpdGVtLmdldExldmVsKCkgPT0gSU5GTyAmJgorICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TWVzc2FnZSgpLnRvU3RyaW5nKCkubWF0Y2hlcygiVXNlciB3aXRoIGFkZHJlc3MgLio/IHJlcXVlc3RlZDogXFxbXFxbXSwgXFxbVlxcKFxcKSwgY291bnRcXChcXCldXSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRBdWRpdExvZ1R3b0NsaWVudHNXaXRoS3JiNUF1dGhlbnRpY2F0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5qYWFzRW50cnkoVEVTVENPTlNPTEUpCi0gICAgICAgICAgICAgICAgLnByb3RvY29sKGtkY1NlcnZlci5zZXJ2ZXJQcmluY2lwYWxOYW1lKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmhvc3RuYW1lKS5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuZ3JlbWxpbkhvc3RuYW1lKS5jcmVhdGUoKTsKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwogICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5qYWFzRW50cnkoVEVTVENPTlNPTEUyKQotICAgICAgICAgICAgICAgIC5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ob3N0bmFtZSkuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgLnByb3RvY29sKGtkY1NlcnZlci5zZXJ2ZXJQcmluY2lwYWxOYW1lKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmdyZW1saW5Ib3N0bmFtZSkuY3JlYXRlKCk7CiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQyID0gY2x1c3RlcjIuY29ubmVjdCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsaWVudC5zdWJtaXQoIjErMSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRJbnQoKSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJBdXRoS3JiNUludGVncmF0ZVRlc3QuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlckF1dGhLcmI1SW50ZWdyYXRlVGVzdC5qYXZhCmluZGV4IDAyOWE0MDguLjQ3NmU5NjIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlckF1dGhLcmI1SW50ZWdyYXRlVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlckF1dGhLcmI1SW50ZWdyYXRlVGVzdC5qYXZhCkBAIC0yOSw3ICsyOSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLkdyeW9NZXNzYWdlU2VyaWFsaXplclYzZDA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuYXV0aC5LcmI1QXV0aGVudGljYXRvcjsKIGltcG9ydCBvcmcuaWV0Zi5qZ3NzLkdTU0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC01NCwxMyArNTMsMTMgQEAKIAogICAgIHByaXZhdGUgS2RjRml4dHVyZSBrZGNTZXJ2ZXI7CiAKLSAgICBAQmVmb3JlCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBidWlsZERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQuZGlyIik7Ci0gICAgICAgICAgICBrZGNTZXJ2ZXIgPSBuZXcgS2RjRml4dHVyZShidWlsZERpciArCi0gICAgICAgICAgICAgICAgICAgICIvdGVzdC1jbGFzc2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2dyZW1saW4tY29uc29sZS1qYWFzLmNvbmYiKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0QmFzZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhDb25maWdOYW1lID0gcHJvamVjdEJhc2VEaXIgKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9ncmVtbGluLWNvbnNvbGUtamFhcy5jb25mIjsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsIGF1dGhDb25maWdOYW1lKTsKKyAgICAgICAgICAgIGtkY1NlcnZlciA9IG5ldyBLZGNGaXh0dXJlKHByb2plY3RCYXNlRGlyKTsKICAgICAgICAgICAgIGtkY1NlcnZlci5zZXRVcCgpOwogICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSAgewogICAgICAgICAgICAgbG9nZ2VyLndhcm4oZS5nZXRNZXNzYWdlKCkpOwpAQCAtNjgsMTIgKzY3LDE5IEBACiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAga2RjU2VydmVyLmNsb3NlKCk7CisgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnIik7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHNwZWNpZmljIEdyZW1saW4gU2VydmVyIHNldHRpbmdzIGZvciBzcGVjaWZpYyB0ZXN0cy4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2V0dGluZ3Mgb3ZlcnJpZGVTZXR0aW5ncyhmaW5hbCBTZXR0aW5ncyBzZXR0aW5ncykgewotICAgICAgICBzZXR0aW5ncy5ob3N0ID0ga2RjU2VydmVyLmhvc3RuYW1lOworICAgICAgICBzZXR0aW5ncy5ob3N0ID0ga2RjU2VydmVyLmdyZW1saW5Ib3N0bmFtZTsKICAgICAgICAgZmluYWwgU2V0dGluZ3MuU3NsU2V0dGluZ3Mgc3NsQ29uZmlnID0gbmV3IFNldHRpbmdzLlNzbFNldHRpbmdzKCk7CiAgICAgICAgIHNzbENvbmZpZy5lbmFibGVkID0gZmFsc2U7CiAgICAgICAgIHNldHRpbmdzLnNzbCA9IHNzbENvbmZpZzsKQEAgLTEyMCw3ICsxMjYsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkQXV0aGVudGljYXRlV2l0aERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIENsdXN0ZXIgY2x1c3RlciA9IFRlc3RDbGllbnRGYWN0b3J5LmJ1aWxkKCkuamFhc0VudHJ5KFRFU1RDT05TT0xFKQotICAgICAgICAgICAgICAgIC5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ob3N0bmFtZSkuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgLnByb3RvY29sKGtkY1NlcnZlci5zZXJ2ZXJQcmluY2lwYWxOYW1lKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmdyZW1saW5Ib3N0bmFtZSkuY3JlYXRlKCk7CiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKICAgICAgICAgYXNzZXJ0Q29ubmVjdGlvbihjbHVzdGVyLCBjbGllbnQpOwogICAgIH0KQEAgLTEyOCw3ICsxMzQsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkRmFpbFdpdGhvdXRDbGllbnRKYWFzRW50cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkKLSAgICAgICAgICAgICAgICAuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ob3N0bmFtZSkuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuZ3JlbWxpbkhvc3RuYW1lKS5jcmVhdGUoKTsKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2xpZW50LnN1Ym1pdCgiMSsxIikuYWxsKCkuZ2V0KCk7CkBAIC0xNDQsNyArMTUwLDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWxXaXRob3V0Q2xpZW50VGlja2V0Q2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5qYWFzRW50cnkoVEVTVENPTlNPTEVfTk9UX0xPR0dFRF9JTikKLSAgICAgICAgICAgICAgICAucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuaG9zdG5hbWUpLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIC5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ncmVtbGluSG9zdG5hbWUpLmNyZWF0ZSgpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbGllbnQuc3VibWl0KCIxKzEiKS5hbGwoKS5nZXQoKTsKQEAgLTE3Nyw3ICsxODMsNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgb2xkUW9wID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5zZWN1cml0eS5zYXNsLnFvcCIsICIiKTsKICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5zZWN1cml0eS5zYXNsLnFvcCIsICJhdXRoLWNvbmYiKTsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5qYWFzRW50cnkoVEVTVENPTlNPTEUpCi0gICAgICAgICAgICAgICAgLnByb3RvY29sKGtkY1NlcnZlci5zZXJ2ZXJQcmluY2lwYWxOYW1lKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmhvc3RuYW1lKS5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuZ3JlbWxpbkhvc3RuYW1lKS5jcmVhdGUoKTsKICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsaWVudC5zdWJtaXQoIjErMSIpLmFsbCgpLmdldCgpLmdldCgwKS5nZXRJbnQoKSk7CkBAIC0xOTIsNyArMTk4LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZEF1dGhlbnRpY2F0ZVdpdGhTc2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5qYWFzRW50cnkoVEVTVENPTlNPTEUpLmVuYWJsZVNzbCh0cnVlKS5zc2xTa2lwQ2VydFZhbGlkYXRpb24odHJ1ZSkKLSAgICAgICAgICAgICAgICAucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuaG9zdG5hbWUpLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIC5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ncmVtbGluSG9zdG5hbWUpLmNyZWF0ZSgpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CiAgICAgICAgIGFzc2VydENvbm5lY3Rpb24oY2x1c3RlciwgY2xpZW50KTsKICAgICB9CkBAIC0yMTcsNyArMjIzLDcgQEAKICAgICAgICAgY29uZmlnLnB1dCgic2VyaWFsaXplUmVzdWx0VG9TdHJpbmciLCB0cnVlKTsKICAgICAgICAgc2VyaWFsaXplci5jb25maWd1cmUoY29uZmlnLCBudWxsKTsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5qYWFzRW50cnkoVEVTVENPTlNPTEUpCi0gICAgICAgICAgICAgICAgLnByb3RvY29sKGtkY1NlcnZlci5zZXJ2ZXJQcmluY2lwYWxOYW1lKS5hZGRDb250YWN0UG9pbnQoa2RjU2VydmVyLmhvc3RuYW1lKS5zZXJpYWxpemVyKHNlcmlhbGl6ZXIpLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIC5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ncmVtbGluSG9zdG5hbWUpLnNlcmlhbGl6ZXIoc2VyaWFsaXplcikuY3JlYXRlKCk7CiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKICAgICAgICAgYXNzZXJ0Q29ubmVjdGlvbihjbHVzdGVyLCBjbGllbnQpOwogICAgIH0KQEAgLTIzNyw3ICsyNDMsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGYWlsZWRMb2dpbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpLmphYXNFbnRyeShURVNUQ09OU09MRSkKLSAgICAgICAgICAgICAgICAucHJvdG9jb2woa2RjU2VydmVyLnNlcnZlclByaW5jaXBhbE5hbWUpLmFkZENvbnRhY3RQb2ludChrZGNTZXJ2ZXIuaG9zdG5hbWUpLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIC5wcm90b2NvbChrZGNTZXJ2ZXIuc2VydmVyUHJpbmNpcGFsTmFtZSkuYWRkQ29udGFjdFBvaW50KGtkY1NlcnZlci5ncmVtbGluSG9zdG5hbWUpLmNyZWF0ZSgpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbGllbnQuc3VibWl0KCIxKzEiKS5hbGwoKS5nZXQoKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlckh0dHBJbnRlZ3JhdGVUZXN0LmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJIdHRwSW50ZWdyYXRlVGVzdC5qYXZhCmluZGV4IDBiZDllY2YuLmYzNGIwZjIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlckh0dHBJbnRlZ3JhdGVUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluU2VydmVySHR0cEludGVncmF0ZVRlc3QuamF2YQpAQCAtNDksNiArNDksNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuU3RyaW5nQ29udGFpbnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLlN0cmluZ1N0YXJ0c1dpdGguc3RhcnRzV2l0aDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKQEAgLTc3Myw3ICs3NzQsNyBAQAogICAgICAgICAgICAgZmluYWwgSnNvbk5vZGUgbm9kZSA9IG1hcHBlci5yZWFkVHJlZShqc29uKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkFyaXRobWV0aWNFeGNlcHRpb24iLCBub2RlLmdldChUb2tlbnMuU1RBVFVTX0FUVFJJQlVURV9FWENFUFRJT05TKS5nZXQoMCkuYXNUZXh0KCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUuZ2V0KFRva2Vucy5TVEFUVVNfQVRUUklCVVRFX0VYQ0VQVElPTlMpLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KG5vZGUuZ2V0KFRva2Vucy5TVEFUVVNfQVRUUklCVVRFX1NUQUNLX1RSQUNFKS5hc1RleHQoKSwgc3RhcnRzV2l0aCgiamF2YS5sYW5nLkFyaXRobWV0aWNFeGNlcHRpb246IERpdmlzaW9uIGJ5IHplcm9cblx0YXQgamF2YS5tYXRoLkJpZ0RlY2ltYWwuZGl2aWRlKEJpZ0RlY2ltYWwuamF2YSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobm9kZS5nZXQoVG9rZW5zLlNUQVRVU19BVFRSSUJVVEVfU1RBQ0tfVFJBQ0UpLmFzVGV4dCgpLCBjb250YWluc1N0cmluZygiRGl2aXNpb24gYnkgemVybyIpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluU2VydmVySW50ZWdyYXRlVGVzdC5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluU2VydmVySW50ZWdyYXRlVGVzdC5qYXZhCmluZGV4IDIzZDRmZTAuLjZlOWYxNjYgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlckludGVncmF0ZVRlc3QuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJJbnRlZ3JhdGVUZXN0LmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5leGNlcHRpb24uRXhjZXB0aW9uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKQEAgLTM0LDcgKzM0LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlc3BvbnNlTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlc3BvbnNlU3RhdHVzQ29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5yZW1vdGUuRHJpdmVyUmVtb3RlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5yZW1vdGUuRHJpdmVyUmVtb3RlVHJhdmVyc2FsU2lkZUVmZmVjdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2VyLlNlcmlhbGl6ZXJzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLnNpbXBsZS5TaW1wbGVDbGllbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyZW1saW5Hcm9vdnlTY3JpcHRFbmdpbmU7CkBAIC00MywxMCArNDIsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLlNjcmlwdEZpbGVHcmVtbGluUGx1Z2luOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlJlbW90ZUdyYXBoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkJ1bGtTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuaGFuZGxlci5PcFNlbGVjdG9ySGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5vcC5BYnN0cmFjdEV2YWxPcFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5vcC5zdGFuZGFyZC5TdGFuZGFyZE9wUHJvY2Vzc29yOwpAQCAtNjAsMTMgKzU3LDEyIEBACiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC03Niw3ICs3Miw3IEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlRva2Vucy5BUkdTX1NDUklQVF9FVkFMX1RJTUVPVVQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLlRva2Vucy5BUkdTX0VWQUxfVElNRU9VVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5ncm9vdnkuanNyMjIzLkdyb292eUNvbXBpbGVyR3JlbWxpblBsdWdpbi5Db21waWxhdGlvbi5DT01QSUxFX1NUQVRJQzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS5SZW1vdGVDb25uZWN0aW9uLkdSRU1MSU5fUkVNT1RFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLlJlbW90ZUNvbm5lY3Rpb24uR1JFTUxJTl9SRU1PVEVfQ09OTkVDVElPTl9DTEFTUzsKQEAgLTkxLDEyICs4NywxNCBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCiAvKioKICAqIEludGVncmF0aW9uIHRlc3RzIGZvciBzZXJ2ZXItc2lkZSBzZXR0aW5ncyBhbmQgcHJvY2Vzc2luZy4KICAqCiAgKiBAYXV0aG9yIFN0ZXBoZW4gTWFsbGV0dGUgKGh0dHA6Ly9zdGVwaGVuLmdlbm9wcmltZS5jb20pCiAgKi8KIHB1YmxpYyBjbGFzcyBHcmVtbGluU2VydmVySW50ZWdyYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0R3JlbWxpblNlcnZlckludGVncmF0aW9uVGVzdCB7CisKICAgICBwcml2YXRlIExldmVsIHByZXZpb3VzTG9nTGV2ZWw7CiAKICAgICBwcml2YXRlIExvZzRqUmVjb3JkaW5nQXBwZW5kZXIgcmVjb3JkaW5nQXBwZW5kZXIgPSBudWxsOwpAQCAtMTk1LDkgKzE5Myw2IEBACiAgICAgICAgICAgICBjYXNlICJzaG91bGRUaW1lT3V0UmVtb3RlVHJhdmVyc2FsIjoKICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ldmFsdWF0aW9uVGltZW91dCA9IDUwMDsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgInNob3VsZFRpbWVPdXRSZW1vdGVUcmF2ZXJzYWxVc2luZ0RlcHJlY2F0ZWRDb25maWd1cmF0aW9uIjoKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zY3JpcHRFdmFsdWF0aW9uVGltZW91dCA9IDUwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgInNob3VsZFBpbmdDaGFubmVsSWZDbGllbnREaWVzIjoKICAgICAgICAgICAgICAgICBzZXR0aW5ncy5rZWVwQWxpdmVJbnRlcnZhbCA9IDEwMDA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNDksNyArMjQ0LDcgQEAKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgdCA9IGV4LmdldENhdXNlKCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KHQsIGluc3RhbmNlT2YoUmVzcG9uc2VFeGNlcHRpb24uY2xhc3MpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX1NDUklQVF9FVkFMVUFUSU9OLCAoKFJlc3BvbnNlRXhjZXB0aW9uKSB0KS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9FVkFMVUFUSU9OLCAoKFJlc3BvbnNlRXhjZXB0aW9uKSB0KS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBtYWtlIGEgZ3JhcGggd2l0aCBhIGN5Y2xlIGluIGl0IHRvIGZvcmNlIGEgbG9uZyBydW4gdHJhdmVyc2FsCkBAIC0zMjcsNDAgKzMyMiwxMiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkVGltZU91dFJlbW90ZVRyYXZlcnNhbFVzaW5nRGVwcmVjYXRlZENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUoY29uZik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHRlc3RzIHNsZWVwaW5nIHRocmVhZAotICAgICAgICAgICAgZy5pbmplY3QoMSkuc2lkZUVmZmVjdChMYW1iZGEuY29uc3VtZXIoIlRocmVhZC5zbGVlcCgxMDAwMCkiKSkuaXRlcmF0ZSgpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyB0cmF2ZXJzYWwgc2hvdWxkIGhhdmUgdGltZWQgb3V0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSBleC5nZXRDYXVzZSgpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdCh0LCBpbnN0YW5jZU9mKFJlc3BvbnNlRXhjZXB0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9USU1FT1VULCAoKFJlc3BvbnNlRXhjZXB0aW9uKSB0KS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIGEgZ3JhcGggd2l0aCBhIGN5Y2xlIGluIGl0IHRvIGZvcmNlIGEgbG9uZyBydW4gdHJhdmVyc2FsCi0gICAgICAgIGdyYXBoR2V0dGVyLmdldCgpLnRyYXZlcnNhbCgpLmFkZFYoInBlcnNvbiIpLmFzKCJwIikuYWRkRSgic2VsZiIpLnRvKCJwIikuaXRlcmF0ZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB0ZXN0cyBhbiAidW5lbmRpbmciIHRyYXZlcnNhbAotICAgICAgICAgICAgZy5WKCkucmVwZWF0KF9fLm91dCgpKS51bnRpbChfXy5vdXRFKCkuY291bnQoKS5pcygwKSkuaXRlcmF0ZSgpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyB0cmF2ZXJzYWwgc2hvdWxkIGhhdmUgdGltZWQgb3V0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSBleC5nZXRDYXVzZSgpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdCh0LCBpbnN0YW5jZU9mKFJlc3BvbnNlRXhjZXB0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9USU1FT1VULCAoKFJlc3BvbnNlRXhjZXB0aW9uKSB0KS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZFRpbWVPdXRSZW1vdGVUcmF2ZXJzYWxXaXRoUGVyUmVxdWVzdE9wdGlvbigpIHsKICAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IHRyYXZlcnNhbCgpLndpdGhSZW1vdGUoY29uZik7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIHRlc3RzIHNsZWVwaW5nIHRocmVhZAotICAgICAgICAgICAgZy53aXRoKEFSR1NfU0NSSVBUX0VWQUxfVElNRU9VVCwgNTAwTCkuaW5qZWN0KDEpLnNpZGVFZmZlY3QoTGFtYmRhLmNvbnN1bWVyKCJUaHJlYWQuc2xlZXAoMTAwMDApIikpLml0ZXJhdGUoKTsKKyAgICAgICAgICAgIGcud2l0aChBUkdTX0VWQUxfVElNRU9VVCwgNTAwTCkuaW5qZWN0KDEpLnNpZGVFZmZlY3QoTGFtYmRhLmNvbnN1bWVyKCJUaHJlYWQuc2xlZXAoMTAwMDApIikpLml0ZXJhdGUoKTsKICAgICAgICAgICAgIGZhaWwoIlRoaXMgdHJhdmVyc2FsIHNob3VsZCBoYXZlIHRpbWVkIG91dCIpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSB0ID0gZXguZ2V0Q2F1c2UoKTsKQEAgLTM3Myw3ICszNDAsNyBAQAogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyB0ZXN0cyBhbiAidW5lbmRpbmciIHRyYXZlcnNhbAotICAgICAgICAgICAgZy53aXRoKEFSR1NfU0NSSVBUX0VWQUxfVElNRU9VVCwgNTAwTCkuVigpLnJlcGVhdChfXy5vdXQoKSkudW50aWwoX18ub3V0RSgpLmNvdW50KCkuaXMoMCkpLml0ZXJhdGUoKTsKKyAgICAgICAgICAgIGcud2l0aChBUkdTX0VWQUxfVElNRU9VVCwgNTAwTCkuVigpLnJlcGVhdChfXy5vdXQoKSkudW50aWwoX18ub3V0RSgpLmNvdW50KCkuaXMoMCkpLml0ZXJhdGUoKTsKICAgICAgICAgICAgIGZhaWwoIlRoaXMgdHJhdmVyc2FsIHNob3VsZCBoYXZlIHRpbWVkIG91dCIpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSB0ID0gZXguZ2V0Q2F1c2UoKTsKQEAgLTc0MSwyMiArNzA4LDYgQEAKIAogICAgIEBUZXN0CiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgc2hvdWxkUmVjZWl2ZUZhaWx1cmVUaW1lT3V0T25TY3JpcHRFdmFsVXNpbmdPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBUZXN0Q2xpZW50RmFjdG9yeS5jcmVhdGVXZWJTb2NrZXRDbGllbnQoKSkgewotICAgICAgICAgICAgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnID0gUmVxdWVzdE1lc3NhZ2UuYnVpbGQoImV2YWwiKQotICAgICAgICAgICAgICAgICAgICAuYWRkQXJnKEFSR1NfU0NSSVBUX0VWQUxfVElNRU9VVCwgMTAwTCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEFyZyhUb2tlbnMuQVJHU19HUkVNTElOLCAiVGhyZWFkLnNsZWVwKDMwMDApOydzb21lLXN0dWZmLXRoYXQtc2hvdWxkIG5vdCByZXR1cm4nIikKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOwotICAgICAgICAgICAgZmluYWwgTGlzdDxSZXNwb25zZU1lc3NhZ2U+IHJlc3BvbnNlcyA9IGNsaWVudC5zdWJtaXQobXNnKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VzLmdldCgwKS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIHN0YXJ0c1dpdGgoIkV2YWx1YXRpb24gZXhjZWVkZWQgdGhlIGNvbmZpZ3VyZWQgJ2V2YWx1YXRpb25UaW1lb3V0JyB0aHJlc2hvbGQgb2YgMTAwIG1zIikpOwotCi0gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHdlIGNhbiBzdGlsbCBzZW5kIG1lc3NhZ2VzIHRvIHRoZSBzZXJ2ZXIKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCAoKExpc3Q8SW50ZWdlcj4pIGNsaWVudC5zdWJtaXQoIjErMSIpLmdldCgwKS5nZXRSZXN1bHQoKS5nZXREYXRhKCkpLmdldCgwKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjZWl2ZUZhaWx1cmVUaW1lT3V0T25FdmFsVXNpbmdPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBUZXN0Q2xpZW50RmFjdG9yeS5jcmVhdGVXZWJTb2NrZXRDbGllbnQoKSkgewogICAgICAgICAgICAgZmluYWwgUmVxdWVzdE1lc3NhZ2UgbXNnID0gUmVxdWVzdE1lc3NhZ2UuYnVpbGQoImV2YWwiKQpAQCAtODIxLDcgKzc3Miw3IEBACiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xpZW50LnN1Ym1pdCgiZGVmIGNsYXNzIEMgeyBkZWYgQyBnZXRDKCl7cmV0dXJuIHRoaXN9fTsgbmV3IEMoKSIpLmFsbCgpLmpvaW4oKTsKKyAgICAgICAgICAgIGNsaWVudC5zdWJtaXQoImNsYXNzIEMgeyBkZWYgQyBnZXRDKCl7cmV0dXJuIHRoaXN9fTsgbmV3IEMoKSIpLmFsbCgpLmpvaW4oKTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24uIik7CiAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSByb290ID0gRXhjZXB0aW9uVXRpbHMuZ2V0Um9vdENhdXNlKHJlKTsKQEAgLTk2Miw3ICs5MTMsNyBAQAogICAgICAgICAgICAgZmluYWwgUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCA9IFJlcXVlc3RNZXNzYWdlLmJ1aWxkKFRva2Vucy5PUFNfRVZBTCkKICAgICAgICAgICAgICAgICAgICAgLmFkZEFyZyhUb2tlbnMuQVJHU19HUkVNTElOLCAibmV3IFN0cmluZygpLmRvTm90aGluZ0F0QWxsQmVjYXVzZVRoaXMgaXMgYSBzeW50YXggZXJyb3IiKS5jcmVhdGUoKTsKICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzcG9uc2VNZXNzYWdlPiByZXNwb25zZXMgPSBjbGllbnQuc3VibWl0KHJlcXVlc3QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfU0NSSVBUX0VWQUxVQVRJT04sIHJlc3BvbnNlcy5nZXQoMCkuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX0VWQUxVQVRJT04sIHJlc3BvbnNlcy5nZXQoMCkuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXNwb25zZXMuc2l6ZSgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTk3NiwxNzggKzkyNyw2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRHZXRTaWRlRWZmZWN0S2V5c0FuZFN0YXR1c1VzaW5nV2l0aFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShjb25mKTsKLSAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiYWdlIiwgMjApLml0ZXJhdGUoKTsKLSAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiYWdlIiwgMTApLml0ZXJhdGUoKTsKLSAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWwgdHJhdmVyc2FsID0gZy5WKCkuYWdncmVnYXRlKCJhIikuYWdncmVnYXRlKCJiIik7Ci0gICAgICAgIHRyYXZlcnNhbC5pdGVyYXRlKCk7Ci0gICAgICAgIGZpbmFsIERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIHNlID0gKERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmdldFNpZGVFZmZlY3RzKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc2Uuc3RhdHVzQXR0cmlidXRlcygpLmNvbnRhaW5zS2V5KFRva2Vucy5BUkdTX0hPU1QpLCBpcyh0cnVlKSk7Ci0KLSAgICAgICAgLy8gR2V0IGtleXMKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2lkZUVmZmVjdEtleXMgPSBzZS5rZXlzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBzaWRlRWZmZWN0S2V5cy5zaXplKCkpOwotCi0gICAgICAgIC8vIEdldCBzaWRlIGVmZmVjdHMKLSAgICAgICAgZmluYWwgQnVsa1NldCBhU2lkZUVmZmVjdHMgPSBzZS5nZXQoImEiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChhU2lkZUVmZmVjdHMuaXNFbXB0eSgpLCBpcyhmYWxzZSkpOwotICAgICAgICBmaW5hbCBCdWxrU2V0IGJTaWRlRWZmZWN0cyA9IHNlLmdldCgiYiIpOwotICAgICAgICBhc3NlcnRUaGF0KGJTaWRlRWZmZWN0cy5pc0VtcHR5KCksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gU2hvdWxkIGdldCBsb2NhbCBrZXlzL3NpZGUgZWZmZWN0cyBhZnRlciBjbG9zZQotICAgICAgICBzZS5jbG9zZSgpOwotCi0gICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGxvY2FsU2lkZUVmZmVjdEtleXMgPSBzZS5rZXlzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBsb2NhbFNpZGVFZmZlY3RLZXlzLnNpemUoKSk7Ci0KLSAgICAgICAgZmluYWwgQnVsa1NldCBsb2NhbEFTaWRlRWZmZWN0cyA9IHNlLmdldCgiYSIpOwotICAgICAgICBhc3NlcnRUaGF0KGxvY2FsQVNpZGVFZmZlY3RzLmlzRW1wdHkoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICBmaW5hbCBCdWxrU2V0IGxvY2FsQlNpZGVFZmZlY3RzID0gc2UuZ2V0KCJiIik7Ci0gICAgICAgIGFzc2VydFRoYXQobG9jYWxCU2lkZUVmZmVjdHMuaXNFbXB0eSgpLCBpcyhmYWxzZSkpOwotCi0gICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsIGdkb3R2ID0gZy5WKCk7Ci0gICAgICAgIGdkb3R2LnRvTGlzdCgpOwotICAgICAgICBmaW5hbCBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyBnZG90dlNlID0gKERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKSBnZG90di5hc0FkbWluKCkuZ2V0U2lkZUVmZmVjdHMoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChnZG90dlNlLnN0YXR1c0F0dHJpYnV0ZXMoKS5jb250YWluc0tleShUb2tlbnMuQVJHU19IT1NUKSwgaXModHJ1ZSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkQ2xvc2VTaWRlRWZmZWN0c1VzaW5nV2l0aFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShjb25mKTsKLSAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiYWdlIiwgMjApLml0ZXJhdGUoKTsKLSAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiYWdlIiwgMTApLml0ZXJhdGUoKTsKLSAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWwgdHJhdmVyc2FsID0gZy5WKCkuYWdncmVnYXRlKCJhIikuYWdncmVnYXRlKCJiIik7Ci0gICAgICAgIHRyYXZlcnNhbC5pdGVyYXRlKCk7Ci0gICAgICAgIGZpbmFsIERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIHNlID0gKERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmdldFNpZGVFZmZlY3RzKCk7Ci0gICAgICAgIGZpbmFsIEJ1bGtTZXQgc2lkZUVmZmVjdHMgPSBzZS5nZXQoImEiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzaWRlRWZmZWN0cy5pc0VtcHR5KCksIGlzKGZhbHNlKSk7Ci0gICAgICAgIHNlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy8gQ2FuJ3QgZ2V0IG5ldyBzaWRlIGVmZmVjdHMgYWZ0ZXIgY2xvc2UKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlLmdldCgiYiIpOwotICAgICAgICAgICAgZmFpbCgiVGhlIHRyYXZlcnNhbCBpcyBjbG9zZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KGV4LCBpbnN0YW5jZU9mKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUcmF2ZXJzYWwgaGFzIGJlZW4gY2xvc2VkIC0gbm8gbmV3IHNpZGUtZWZmZWN0cyBjYW4gYmUgcmV0cmlldmVkIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVhcmxpZXIga2V5cyBzaG91bGQgYmUgY2FjaGVkIGxvY2FsbHkKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gbG9jYWxTaWRlRWZmZWN0S2V5cyA9IHNlLmtleXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGxvY2FsU2lkZUVmZmVjdEtleXMuc2l6ZSgpKTsKLSAgICAgICAgZmluYWwgQnVsa1NldCBsb2NhbFNpZGVFZmZlY3RzID0gc2UuZ2V0KCJhIik7Ci0gICAgICAgIGFzc2VydFRoYXQobG9jYWxTaWRlRWZmZWN0cy5pc0VtcHR5KCksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGdldCBzaWRlIGVmZmVjdCBmcm9tIHNlcnZlcgotICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5vcGVuKCk7Ci0gICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKLSAgICAgICAgZmluYWwgRmllbGQgZmllbGQgPSBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJzZXJ2ZXJTaWRlRWZmZWN0Iik7Ci0gICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIGZpbmFsIFVVSUQgc2VydmVyU2lkZUVmZmVjdElkID0gKFVVSUQpIGZpZWxkLmdldChzZSk7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxpYXNlcyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgYWxpYXNlcy5wdXQoImciLCAiZyIpOwotICAgICAgICBmaW5hbCBSZXF1ZXN0TWVzc2FnZSBtc2cgPSBSZXF1ZXN0TWVzc2FnZS5idWlsZChUb2tlbnMuT1BTX0dBVEhFUikKLSAgICAgICAgICAgICAgICAuYWRkQXJnKFRva2Vucy5BUkdTX1NJREVfRUZGRUNULCBzZXJ2ZXJTaWRlRWZmZWN0SWQpCi0gICAgICAgICAgICAgICAgLmFkZEFyZyhUb2tlbnMuQVJHU19TSURFX0VGRkVDVF9LRVksICJiIikKLSAgICAgICAgICAgICAgICAuYWRkQXJnKFRva2Vucy5BUkdTX0FMSUFTRVMsIGFsaWFzZXMpCi0gICAgICAgICAgICAgICAgLnByb2Nlc3NvcigidHJhdmVyc2FsIikuY3JlYXRlKCk7Ci0gICAgICAgIGJvb2xlYW4gZXJyb3I7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGllbnQuc3VibWl0QXN5bmMobXNnKS5nZXQoKS5vbmUoKTsKLSAgICAgICAgICAgIGVycm9yID0gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRoYXQoZXJyb3IsIGlzKHRydWUpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZEJsb2NrV2hlbkdldHRpbmdTaWRlRWZmZWN0S2V5c1VzaW5nV2l0aFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gdHJhdmVyc2FsKCkud2l0aFJlbW90ZShjb25mKTsKLSAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiYWdlIiwgMjApLml0ZXJhdGUoKTsKLSAgICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgiYWdlIiwgMTApLml0ZXJhdGUoKTsKLSAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWwgdHJhdmVyc2FsID0gZy5WKCkuYWdncmVnYXRlKCJhIikKLSAgICAgICAgICAgICAgICAuc2lkZUVmZmVjdChMYW1iZGEuY29uc3VtZXIoIntUaHJlYWQuc2xlZXAoMzAwMCl9IikpCi0gICAgICAgICAgICAgICAgLmFnZ3JlZ2F0ZSgiYiIpOwotCi0gICAgICAgIC8vIGZvcmNlIHN0cmF0ZWd5IGFwcGxpY2F0aW9uIC0gaWYgdGhpcyBkb2Vzbid0IGhhcHBlbiB0aGVuIGdldFNpZGVFZmZlY3RzKCkgcmV0dXJucyBEZWZhdWx0VHJhdmVyc2FsU2lkZUVmZmVjdHMKLSAgICAgICAgdHJhdmVyc2FsLmhhc05leHQoKTsKLQotICAgICAgICAvLyBzdGFydCBhIHNlcGFyYXRlIHRocmVhZCB0byBpdGVyYXRlCi0gICAgICAgIGZpbmFsIFRocmVhZCB0ID0gbmV3IFRocmVhZCh0cmF2ZXJzYWw6Oml0ZXJhdGUpOwotICAgICAgICB0LnN0YXJ0KCk7Ci0KLSAgICAgICAgLy8gYmxvY2tzIGhlcmUgdW50aWwgdHJhdmVyc2FsIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZQotICAgICAgICBmaW5hbCBEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cyBzZSA9IChEcml2ZXJSZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0cykgdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTaWRlRWZmZWN0cygpOwotCi0gICAgICAgIC8vIEdldCBrZXlzCi0gICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHNpZGVFZmZlY3RLZXlzID0gc2Uua2V5cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2lkZUVmZmVjdEtleXMuc2l6ZSgpKTsKLQotICAgICAgICAvLyBHZXQgc2lkZSBlZmZlY3RzCi0gICAgICAgIGZpbmFsIEJ1bGtTZXQgYVNpZGVFZmZlY3RzID0gc2UuZ2V0KCJhIik7Ci0gICAgICAgIGFzc2VydFRoYXQoYVNpZGVFZmZlY3RzLmlzRW1wdHkoKSwgaXMoZmFsc2UpKTsKLSAgICAgICAgZmluYWwgQnVsa1NldCBiU2lkZUVmZmVjdHMgPSBzZS5nZXQoImIiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChiU2lkZUVmZmVjdHMuaXNFbXB0eSgpLCBpcyhmYWxzZSkpOwotCi0gICAgICAgIC8vIFNob3VsZCBnZXQgbG9jYWwga2V5cy9zaWRlIGVmZmVjdHMgYWZ0ZXIgY2xvc2UKLSAgICAgICAgc2UuY2xvc2UoKTsKLQotICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBsb2NhbFNpZGVFZmZlY3RLZXlzID0gc2Uua2V5cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbG9jYWxTaWRlRWZmZWN0S2V5cy5zaXplKCkpOwotCi0gICAgICAgIGZpbmFsIEJ1bGtTZXQgbG9jYWxBU2lkZUVmZmVjdHMgPSBzZS5nZXQoImEiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChsb2NhbEFTaWRlRWZmZWN0cy5pc0VtcHR5KCksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgZmluYWwgQnVsa1NldCBsb2NhbEJTaWRlRWZmZWN0cyA9IHNlLmdldCgiYiIpOwotICAgICAgICBhc3NlcnRUaGF0KGxvY2FsQlNpZGVFZmZlY3RzLmlzRW1wdHkoKSwgaXMoZmFsc2UpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZEJsb2NrV2hlbkdldHRpbmdTaWRlRWZmZWN0VmFsdWVzVXNpbmdXaXRoUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKGNvbmYpOwotICAgICAgICBnLmFkZFYoInBlcnNvbiIpLnByb3BlcnR5KCJhZ2UiLCAyMCkuaXRlcmF0ZSgpOwotICAgICAgICBnLmFkZFYoInBlcnNvbiIpLnByb3BlcnR5KCJhZ2UiLCAxMCkuaXRlcmF0ZSgpOwotICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBnLlYoKS5hZ2dyZWdhdGUoImEiKQotICAgICAgICAgICAgICAgIC5zaWRlRWZmZWN0KExhbWJkYS5jb25zdW1lcigie1RocmVhZC5zbGVlcCgzMDAwKX0iKSkKLSAgICAgICAgICAgICAgICAuYWdncmVnYXRlKCJiIik7Ci0KLSAgICAgICAgLy8gZm9yY2Ugc3RyYXRlZ3kgYXBwbGljYXRpb24gLSBpZiB0aGlzIGRvZXNuJ3QgaGFwcGVuIHRoZW4gZ2V0U2lkZUVmZmVjdHMoKSByZXR1cm5zIERlZmF1bHRUcmF2ZXJzYWxTaWRlRWZmZWN0cwotICAgICAgICB0cmF2ZXJzYWwuaGFzTmV4dCgpOwotCi0gICAgICAgIC8vIHN0YXJ0IGEgc2VwYXJhdGUgdGhyZWFkIHRvIGl0ZXJhdGUKLSAgICAgICAgZmluYWwgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHRyYXZlcnNhbDo6aXRlcmF0ZSk7Ci0gICAgICAgIHQuc3RhcnQoKTsKLQotICAgICAgICAvLyBibG9ja3MgaGVyZSB1bnRpbCB0cmF2ZXJzYWwgaXRlcmF0aW9uIGlzIGNvbXBsZXRlCi0gICAgICAgIGZpbmFsIERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzIHNlID0gKERyaXZlclJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKSB0cmF2ZXJzYWwuYXNBZG1pbigpLmdldFNpZGVFZmZlY3RzKCk7Ci0KLSAgICAgICAgLy8gR2V0IHNpZGUgZWZmZWN0cwotICAgICAgICBmaW5hbCBCdWxrU2V0IGFTaWRlRWZmZWN0cyA9IHNlLmdldCgiYSIpOwotICAgICAgICBhc3NlcnRUaGF0KGFTaWRlRWZmZWN0cy5pc0VtcHR5KCksIGlzKGZhbHNlKSk7Ci0gICAgICAgIGZpbmFsIEJ1bGtTZXQgYlNpZGVFZmZlY3RzID0gc2UuZ2V0KCJiIik7Ci0gICAgICAgIGFzc2VydFRoYXQoYlNpZGVFZmZlY3RzLmlzRW1wdHkoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICAvLyBHZXQga2V5cwotICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzaWRlRWZmZWN0S2V5cyA9IHNlLmtleXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNpZGVFZmZlY3RLZXlzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gU2hvdWxkIGdldCBsb2NhbCBrZXlzL3NpZGUgZWZmZWN0cyBhZnRlciBjbG9zZQotICAgICAgICBzZS5jbG9zZSgpOwotCi0gICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGxvY2FsU2lkZUVmZmVjdEtleXMgPSBzZS5rZXlzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBsb2NhbFNpZGVFZmZlY3RLZXlzLnNpemUoKSk7Ci0KLSAgICAgICAgZmluYWwgQnVsa1NldCBsb2NhbEFTaWRlRWZmZWN0cyA9IHNlLmdldCgiYSIpOwotICAgICAgICBhc3NlcnRUaGF0KGxvY2FsQVNpZGVFZmZlY3RzLmlzRW1wdHkoKSwgaXMoZmFsc2UpKTsKLQotICAgICAgICBmaW5hbCBCdWxrU2V0IGxvY2FsQlNpZGVFZmZlY3RzID0gc2UuZ2V0KCJiIik7Ci0gICAgICAgIGFzc2VydFRoYXQobG9jYWxCU2lkZUVmZmVjdHMuaXNFbXB0eSgpLCBpcyhmYWxzZSkpOwotICAgIH0KLQotICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkRG9Ob25CbG9ja2luZ1Byb21pc2VXaXRoUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSB0cmF2ZXJzYWwoKS53aXRoUmVtb3RlKGNvbmYpOwogICAgICAgICBnLmFkZFYoInBlcnNvbiIpLnByb3BlcnR5KCJhZ2UiLCAyMCkucHJvbWlzZShUcmF2ZXJzYWw6Oml0ZXJhdGUpLmpvaW4oKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlclNlc3Npb25JbnRlZ3JhdGVUZXN0LmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJTZXNzaW9uSW50ZWdyYXRlVGVzdC5qYXZhCmluZGV4IGRkZjM5ZDMuLjNkYzU4YWUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlclNlc3Npb25JbnRlZ3JhdGVUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluU2VydmVyU2Vzc2lvbkludGVncmF0ZVRlc3QuamF2YQpAQCAtNDksNyArNDksNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmluc3RhbmNlT2Y7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzQ29sbGVjdGlvbkNvbnRhaW5pbmcuaGFzSXRlbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXNJdGVyYWJsZUNvbnRhaW5pbmcuaGFzSXRlbTsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuU3RyaW5nU3RhcnRzV2l0aC5zdGFydHNXaXRoOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwpAQCAtNzAsOCArNzAsNyBAQAogICAgICAgICBzd2l0Y2ggKG5hbWVPZlRlc3QpIHsKICAgICAgICAgICAgIGNhc2UgInNob3VsZENsb3NlU2Vzc2lvbk9uY2VPblJlcXVlc3QiOgogICAgICAgICAgICAgY2FzZSAic2hvdWxkSGF2ZVRoZVNlc3Npb25UaW1lb3V0IjoKLSAgICAgICAgICAgIGNhc2UgInNob3VsZEJsb2NrQWRkaXRpb25hbFJlcXVlc3RzRHVyaW5nQ2xvc2UiOgotICAgICAgICAgICAgY2FzZSAic2hvdWxkQmxvY2tBZGRpdGlvbmFsUmVxdWVzdHNEdXJpbmdGb3JjZUNsb3NlIjoKKyAgICAgICAgICAgIGNhc2UgInNob3VsZENsb3NlU2Vzc2lvbk9uQ2xpZW50Q2xvc2UiOgogICAgICAgICAgICAgICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEwMSw4ICsxMDAsNyBAQAogICAgICAgICAgICAgICAgIHByb2Nlc3NvclNldHRpbmdzLmNvbmZpZy5wdXQoU2Vzc2lvbk9wUHJvY2Vzc29yLkNPTkZJR19TRVNTSU9OX1RJTUVPVVQsIDMwMDBMKTsKICAgICAgICAgICAgICAgICBzZXR0aW5ncy5wcm9jZXNzb3JzLmFkZChwcm9jZXNzb3JTZXR0aW5ncyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICJzaG91bGRCbG9ja0FkZGl0aW9uYWxSZXF1ZXN0c0R1cmluZ0Nsb3NlIjoKLSAgICAgICAgICAgIGNhc2UgInNob3VsZEJsb2NrQWRkaXRpb25hbFJlcXVlc3RzRHVyaW5nRm9yY2VDbG9zZSI6CisgICAgICAgICAgICBjYXNlICJzaG91bGRDbG9zZVNlc3Npb25PbkNsaWVudENsb3NlIjoKICAgICAgICAgICAgICAgICBjbGVhck5lbzRqKHNldHRpbmdzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgInNob3VsZEVuc3VyZVNlc3Npb25CaW5kaW5nc0FyZVRocmVhZFNhZmUiOgpAQCAtMTMyLDYgKzEzMCwzOCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkQ2xvc2VTZXNzaW9uT25DbGllbnRDbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVOZW80aklzUHJlc2VudCgpOworCisgICAgICAgIGZpbmFsIENsdXN0ZXIgY2x1c3RlcjEgPSBUZXN0Q2xpZW50RmFjdG9yeS5vcGVuKCk7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQxID0gY2x1c3RlcjEuY29ubmVjdChuYW1lLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICAgIGNsaWVudDEuc3VibWl0KCJ4ID0gMSIpLmFsbCgpLmpvaW4oKTsKKyAgICAgICAgY2xpZW50MS5zdWJtaXQoImdyYXBoLmFkZFZlcnRleCgpIikuYWxsKCkuam9pbigpOworICAgICAgICBjbGllbnQxLmNsb3NlKCk7CisgICAgICAgIGNsdXN0ZXIxLmNsb3NlKCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZWNvcmRpbmdBcHBlbmRlci5nZXRNZXNzYWdlcygpLCBoYXNJdGVtKCJJTkZPIC0gU2tpcHBlZCBhdHRlbXB0IHRvIGNsb3NlIG9wZW4gZ3JhcGggdHJhbnNhY3Rpb25zIG9uIHNob3VsZENsb3NlU2Vzc2lvbk9uQ2xpZW50Q2xvc2UgLSBjbG9zZSB3YXMgZm9yY2VkXG4iKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVjb3JkaW5nQXBwZW5kZXIuZ2V0TWVzc2FnZXMoKSwgaGFzSXRlbSgiSU5GTyAtIFNlc3Npb24gc2hvdWxkQ2xvc2VTZXNzaW9uT25DbGllbnRDbG9zZSBjbG9zZWRcbiIpKTsKKworICAgICAgICAvLyB0cnkgdG8gcmVjb25uZWN0IHRvIHRoYXQgc2Vzc2lvbiBhbmQgbWFrZSBzdXJlIG5vIHN0YXRlIGlzIHRoZXJlCisgICAgICAgIGZpbmFsIENsdXN0ZXIgY2x1c3RlclJlY29ubmVjdCA9IFRlc3RDbGllbnRGYWN0b3J5Lm9wZW4oKTsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudFJlY29ubmVjdCA9IGNsdXN0ZXJSZWNvbm5lY3QuY29ubmVjdChuYW1lLmdldE1ldGhvZE5hbWUoKSk7CisKKyAgICAgICAgLy8gc2hvdWxkIGdldCBhbiBlcnJvciBiZWNhdXNlICJ4IiBpcyBub3QgZGVmaW5lZCBhcyB0aGlzIGlzIGEgbmV3IHNlc3Npb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudFJlY29ubmVjdC5zdWJtaXQoIngiKS5hbGwoKS5qb2luKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgYmVlbiBzdWNjZXNzZnVsIGFzICd4JyB3YXMgb25seSBkZWZpbmVkIGluIHRoZSBvbGQgc2Vzc2lvbiIpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoZXgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyb290LmdldE1lc3NhZ2UoKSwgc3RhcnRzV2l0aCgiTm8gc3VjaCBwcm9wZXJ0eSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBjb21taXQgZnJvbSBjbGllbnQxIHNob3VsZCBub3QgaGF2ZSBnb25lIHRocm91Z2ggc28gdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgcHJlc2VudC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNsaWVudFJlY29ubmVjdC5zdWJtaXQoImdyYXBoLnRyYXZlcnNhbCgpLlYoKS5jb3VudCgpIikuYWxsKCkuam9pbigpLmdldCgwKS5nZXRJbnQoKSk7CisgICAgICAgIGNsdXN0ZXJSZWNvbm5lY3QuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZFVzZUdsb2JhbEZ1bmN0aW9uQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3Rvcnkub3BlbigpOwogICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KG5hbWUuZ2V0TWV0aG9kTmFtZSgpKTsKQEAgLTE2OCw4NSArMTk4LDI0IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRCbG9ja0FkZGl0aW9uYWxSZXF1ZXN0c0R1cmluZ0Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc3VtZU5lbzRqSXNQcmVzZW50KCk7Ci0KLSAgICAgICAgLy8gdGhpcyBpcyBzb3J0YSBjb2JibGVkIHRvZ2V0aGVyIGEgYml0IGdpdmVuIGxpbWl0cy9ydWxlcyBhYm91dCBob3cgeW91IGNhbiB1c2UgQ2x1c3Rlci9DbGllbnQgaW5zdGFuY2VzLgotICAgICAgICAvLyBiYXNpY2FsbHksIHdlIG5lZWQgb25lIHRvIHN1Ym1pdCB0aGUgbG9uZyBydW4gam9iIGFuZCBvbmUgdG8gZG8gdGhlIGNsb3NlIG9wZXJhdGlvbiB0aGF0IHdpbGwgY2FuY2VsIHRoZQotICAgICAgICAvLyBsb25nIHJ1biBqb2IuIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlIHRvIGRvIHRoaXMgd2l0aCBzb21lIGxvdy1sZXZlbCBtZXNzYWdlIG1hbmlwdWxhdGlvbiBidXQgdGhhdCdzCi0gICAgICAgIC8vIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKLSAgICAgICAgLy8KLSAgICAgICAgLy8gdGhpcyB0ZXN0IHdvbnQgd29yayBzbyB3ZWxsIG9uY2Ugd2UgcmVtb3ZlIHRoZSBzZW5kaW5nIG9mIHRoZSBzZXNzaW9uIGNsb3NlIG1lc3NhZ2UgZnJvbSB0aGUgZHJpdmVyIHdoaWNoCi0gICAgICAgIC8vIGdvdCBkZXByZWNhdGVkIGF0IDMuMy4xMSBhbmQgbG9jayBhIHNlc3Npb24gdG8gdGhlIGNvbm5lY3Rpb24gdGhhdCBjcmVhdGVkIGl0LiBpbiB0aGF0IGNhc2UsIHR3byBDbGllbnQKLSAgICAgICAgLy8gaW5zdGFuY2VzIHdvbid0IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGUgc2FtZSBzZXNzaW9uIHdoaWNoIGlzIHdoYXQgaXMgaGFwcGVuaW5nIGJlbG93LiBub3Qgc3VyZSB3aGF0Ci0gICAgICAgIC8vIGZvcm0gdGhpcyB0ZXN0IHNob3VsZCB0YWtlIHRoZW4gZXNwZWNpYWxseSBzaW5jZSB0cmFuc2FjdGlvbnMgd2lsbCBmb3JjZSBjbG9zZSB3aGVuIHRoZSBjaGFubmVsIGNsb3Nlcy4KLSAgICAgICAgLy8gcGVyaGFwcyBpdCBzaG91bGQganVzdCBiZSByZW1vdmVkLgorICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdEFsbG93TW9yZVRoYW5PbmVDbGllbnRQZXJTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIENsdXN0ZXIgY2x1c3RlcjEgPSBUZXN0Q2xpZW50RmFjdG9yeS5vcGVuKCk7CiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQxID0gY2x1c3RlcjEuY29ubmVjdChuYW1lLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGNsaWVudDEuc3VibWl0KCJncmFwaC5hZGRWZXJ0ZXgoKSIpLmFsbCgpLmpvaW4oKTsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyMiA9IFRlc3RDbGllbnRGYWN0b3J5Lm9wZW4oKTsKLSAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudDIgPSBjbHVzdGVyMi5jb25uZWN0KG5hbWUuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgY2xpZW50Mi5zdWJtaXQoIjErMSIpLmFsbCgpLmpvaW4oKTsKLQotICAgICAgICBmaW5hbCBSZXN1bHRTZXQgcnMgPSBjbGllbnQxLnN1Ym1pdCgiVGhyZWFkLnNsZWVwKDMwMDApOzErMSIpOwotCi0gICAgICAgIC8vIGNsb3NlIHdoaWxlIHRoZSBwcmV2aW91cyByZXF1ZXN0IGlzIHN0aWxsIGV4ZWN1dGluZwotICAgICAgICBjbGllbnQyLmNsb3NlKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJzLmFsbCgpLmpvaW4oKS5nZXQoMCkuZ2V0SW50KCkpOwotCi0gICAgICAgIGNsaWVudDEuY2xvc2UoKTsKLQotICAgICAgICBjbHVzdGVyMS5jbG9zZSgpOwotICAgICAgICBjbHVzdGVyMi5jbG9zZSgpOwotCi0gICAgICAgIC8vIHRyaWdnZXJlZCBhbiBlcnJvciBkdXJpbmcgY2xvc2UgYW5kIHNpbmNlIHdlIGRpZG4ndCBmb3JjZSBjbG9zZSwgdGhlIGF0dGVtcHQgdG8gY2xvc2UgdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgIC8vIGlzIG1hZGUKLSAgICAgICAgYXNzZXJ0VGhhdChyZWNvcmRpbmdBcHBlbmRlci5nZXRNZXNzYWdlcygpLCBoYXNJdGVtKCJJTkZPIC0gUm9sbGluZyBiYWNrIG9wZW4gdHJhbnNhY3Rpb25zIG9uIGdyYXBoIGJlZm9yZSBraWxsaW5nIHNlc3Npb246ICIgKyBuYW1lLmdldE1ldGhvZE5hbWUoKSArICJcbiIpKTsKLQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkQmxvY2tBZGRpdGlvbmFsUmVxdWVzdHNEdXJpbmdGb3JjZUNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc3VtZU5lbzRqSXNQcmVzZW50KCk7Ci0KLSAgICAgICAgLy8gdGhpcyBpcyBzb3J0YSBjb2JibGVkIHRvZ2V0aGVyIGEgYml0IGdpdmVuIGxpbWl0cy9ydWxlcyBhYm91dCBob3cgeW91IGNhbiB1c2UgQ2x1c3Rlci9DbGllbnQgaW5zdGFuY2VzLgotICAgICAgICAvLyBiYXNpY2FsbHksIHdlIG5lZWQgb25lIHRvIHN1Ym1pdCB0aGUgbG9uZyBydW4gam9iIGFuZCBvbmUgdG8gZG8gdGhlIGNsb3NlIG9wZXJhdGlvbiB0aGF0IHdpbGwgY2FuY2VsIHRoZQotICAgICAgICAvLyBsb25nIHJ1biBqb2IuIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlIHRvIGRvIHRoaXMgd2l0aCBzb21lIGxvdy1sZXZlbCBtZXNzYWdlIG1hbmlwdWxhdGlvbiBidXQgdGhhdCdzCi0gICAgICAgIC8vIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKLSAgICAgICAgLy8KLSAgICAgICAgLy8gdGhpcyB0ZXN0IHdvbnQgd29yayBzbyB3ZWxsIG9uY2Ugd2UgcmVtb3ZlIHRoZSBzZW5kaW5nIG9mIHRoZSBzZXNzaW9uIGNsb3NlIG1lc3NhZ2UgZnJvbSB0aGUgZHJpdmVyIHdoaWNoCi0gICAgICAgIC8vIGdvdCBkZXByZWNhdGVkIGF0IDMuMy4xMSBhbmQgbG9jayBhIHNlc3Npb24gdG8gdGhlIGNvbm5lY3Rpb24gdGhhdCBjcmVhdGVkIGl0LiBpbiB0aGF0IGNhc2UsIHR3byBDbGllbnQKLSAgICAgICAgLy8gaW5zdGFuY2VzIHdvbid0IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGUgc2FtZSBzZXNzaW9uIHdoaWNoIGlzIHdoYXQgaXMgaGFwcGVuaW5nIGJlbG93LiBub3Qgc3VyZSB3aGF0Ci0gICAgICAgIC8vIGZvcm0gdGhpcyB0ZXN0IHNob3VsZCB0YWtlIHRoZW4gZXNwZWNpYWxseSBzaW5jZSB0cmFuc2FjdGlvbnMgd2lsbCBmb3JjZSBjbG9zZSB3aGVuIHRoZSBjaGFubmVsIGNsb3Nlcy4KLSAgICAgICAgLy8gcGVyaGFwcyBpdCBzaG91bGQganVzdCBiZSByZW1vdmVkLgotICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIxID0gVGVzdENsaWVudEZhY3Rvcnkub3BlbigpOwotICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50MSA9IGNsdXN0ZXIxLmNvbm5lY3QobmFtZS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBjbGllbnQxLnN1Ym1pdCgiZ3JhcGguYWRkVmVydGV4KCkiKS5hbGwoKS5qb2luKCk7CisgICAgICAgIGNsaWVudDEuc3VibWl0KCIxKzEiKS5hbGwoKS5qb2luKCk7CiAgICAgICAgIGZpbmFsIENsdXN0ZXIgY2x1c3RlcjIgPSBUZXN0Q2xpZW50RmFjdG9yeS5vcGVuKCk7CiAgICAgICAgIGZpbmFsIENsaWVudC5TZXNzaW9uU2V0dGluZ3Mgc2Vzc2lvblNldHRpbmdzID0gQ2xpZW50LlNlc3Npb25TZXR0aW5ncy5idWlsZCgpCiAgICAgICAgICAgICAgICAgLnNlc3Npb25JZChuYW1lLmdldE1ldGhvZE5hbWUoKSkKICAgICAgICAgICAgICAgICAuZm9yY2VDbG9zZWQodHJ1ZSkuY3JlYXRlKCk7CiAgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQyID0gY2x1c3RlcjIuY29ubmVjdChDbGllbnQuU2V0dGluZ3MuYnVpbGQoKS51c2VTZXNzaW9uKHNlc3Npb25TZXR0aW5ncykuY3JlYXRlKCkpOwotICAgICAgICBjbGllbnQyLnN1Ym1pdCgiMSsxIikuYWxsKCkuam9pbigpOwotCi0gICAgICAgIGZpbmFsIFJlc3VsdFNldCBycyA9IGNsaWVudDEuc3VibWl0KCJUaHJlYWQuc2xlZXAoMTAwMDApOzErMSIpOwotCi0gICAgICAgIGNsaWVudDIuY2xvc2UoKTsKLQotICAgICAgICAvLyBiZWNhdXNlIHRoZSBjbG9zZSB3YXMgZm9yY2VkLCB0aGUgbWVzc2FnZSBzaG91bGQgYXBwZWFyIGltbWVkaWF0ZWx5Ci0gICAgICAgIGFzc2VydFRoYXQocmVjb3JkaW5nQXBwZW5kZXIuZ2V0TWVzc2FnZXMoKSwgaGFzSXRlbSgiSU5GTyAtIFNraXBwZWQgYXR0ZW1wdCB0byBjbG9zZSBvcGVuIGdyYXBoIHRyYW5zYWN0aW9ucyBvbiAiICsgbmFtZS5nZXRNZXRob2ROYW1lKCkgKyAiIC0gY2xvc2Ugd2FzIGZvcmNlZFxuIikpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBycy5hbGwoKS5qb2luKCk7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgY2xvc2Ugb2YgdGhlIHNlc3Npb24gb24gY2xpZW50MiBzaG91bGQgaGF2ZSBpbnRlcnJ1cHRlZCB0aGUgc2NyaXB0IHNlbnQgb24gY2xpZW50MSIpOworICAgICAgICAgICAgY2xpZW50Mi5zdWJtaXQoIjIrMiIpLmFsbCgpLmpvaW4oKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBjbGllbnQgY29ubmVjdGluZyB0byB0aGUgc2FtZSBzZXNzaW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoZXgpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChyb290LmdldE1lc3NhZ2UoKSwgc3RhcnRzV2l0aCgiRXZhbHVhdGlvbiBleGNlZWRlZCB0aGUgY29uZmlndXJlZCAnZXZhbHVhdGlvblRpbWVvdXQnIHRocmVzaG9sZCBvZiAzMDAwMCBtcyBvciBldmFsdWF0aW9uIHdhcyBvdGhlcndpc2UgY2FuY2VsbGVkIGRpcmVjdGx5IGZvciByZXF1ZXN0IikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXNzaW9uIHNob3VsZE5vdEFsbG93TW9yZVRoYW5PbmVDbGllbnRQZXJTZXNzaW9uIGlzIG5vdCBib3VuZCB0byB0aGUgY29ubmVjdGluZyBjbGllbnQiLCByb290LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBjbGllbnQxLmNsb3NlKCk7Ci0KICAgICAgICAgY2x1c3RlcjEuY2xvc2UoKTsKICAgICAgICAgY2x1c3RlcjIuY2xvc2UoKTsKICAgICB9CkBAIC0zMzEsNyArMzAwLDcgQEAKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBFeGNlcHRpb25VdGlscy5nZXRDYXVzZShleCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGNhdXNlLCBpbnN0YW5jZU9mKFJlc3BvbnNlRXhjZXB0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9TQ1JJUFRfRVZBTFVBVElPTiwgKChSZXNwb25zZUV4Y2VwdGlvbikgY2F1c2UpLmdldFJlc3BvbnNlU3RhdHVzQ29kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX0VWQUxVQVRJT04sICgoUmVzcG9uc2VFeGNlcHRpb24pIGNhdXNlKS5nZXRSZXNwb25zZVN0YXR1c0NvZGUoKSk7CiAKICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgd2UgY2FuIHN0aWxsIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHNlcnZlcgogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsaWVudC5zdWJtaXQoIjErMSIpLmFsbCgpLmpvaW4oKS5nZXQoMCkuZ2V0SW50KCkpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluU2VydmVyU3NsSW50ZWdyYXRlVGVzdC5qYXZhIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9HcmVtbGluU2VydmVyU3NsSW50ZWdyYXRlVGVzdC5qYXZhCmluZGV4IGFiNzViOGUuLmRkM2FhODAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvR3JlbWxpblNlcnZlclNzbEludGVncmF0ZVRlc3QuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0dyZW1saW5TZXJ2ZXJTc2xJbnRlZ3JhdGVUZXN0LmphdmEKQEAgLTM5LDEwICszOSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogcHVibGljIGNsYXNzIEdyZW1saW5TZXJ2ZXJTc2xJbnRlZ3JhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RHcmVtbGluU2VydmVySW50ZWdyYXRpb25UZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVNX1NFUlZFUl9LRVkgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci5rZXkucGs4IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVNX1NFUlZFUl9DUlQgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci5jcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRU1fQ0xJRU5UX0tFWSA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY2xpZW50LmtleS5wazgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRU1fQ0xJRU5UX0NSVCA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY2xpZW50LmNydCI7CiAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgc3BlY2lmaWMgR3JlbWxpbiBTZXJ2ZXIgc2V0dGluZ3MgZm9yIHNwZWNpZmljIHRlc3RzLgpAQCAtNjQsMjggKzYwLDYgQEAKICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zc2wuZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsLm92ZXJyaWRlU3NsQ29udGV4dChjcmVhdGVTZXJ2ZXJTc2xDb250ZXh0KCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAic2hvdWxkRW5hYmxlU3NsQW5kQ2xpZW50Q2VydGlmaWNhdGVBdXRoV2l0aExlZ2FjeVBlbSI6Ci0gICAgICAgICAgICBjYXNlICJzaG91bGRFbmFibGVTc2xBbmRDbGllbnRDZXJ0aWZpY2F0ZUF1dGhBbmRGYWlsV2l0aG91dENlcnRXaXRoTGVnYWN5UGVtIjoKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zc2wgPSBuZXcgU2V0dGluZ3MuU3NsU2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zc2wuZW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsLm5lZWRDbGllbnRBdXRoID0gQ2xpZW50QXV0aC5SRVFVSVJFOwotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNzbC5rZXlDZXJ0Q2hhaW5GaWxlID0gUEVNX1NFUlZFUl9DUlQ7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsLmtleUZpbGUgPSBQRU1fU0VSVkVSX0tFWTsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zc2wua2V5UGFzc3dvcmQgPSBLRVlfUEFTUzsKLSAgICAgICAgICAgICAgICAvLyBUcnVzdCB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsLnRydXN0Q2VydENoYWluRmlsZSA9IFBFTV9DTElFTlRfQ1JUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gVHJ1c3QgdGhlIGNsaWVudAotICAgICAgICAgICAgY2FzZSAic2hvdWxkRW5hYmxlU3NsQW5kQ2xpZW50Q2VydGlmaWNhdGVBdXRoQW5kRmFpbFdpdGhvdXRUcnVzdGVkQ2xpZW50Q2VydFdpdGhMZWdhY3lQZW0iOgotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNzbCA9IG5ldyBTZXR0aW5ncy5Tc2xTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNzbC5lbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zc2wubmVlZENsaWVudEF1dGggPSBDbGllbnRBdXRoLlJFUVVJUkU7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsLmtleUNlcnRDaGFpbkZpbGUgPSBQRU1fU0VSVkVSX0NSVDsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zc2wua2V5RmlsZSA9IFBFTV9TRVJWRVJfS0VZOwotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNzbC5rZXlQYXNzd29yZCA9IEtFWV9QQVNTOwotICAgICAgICAgICAgICAgIC8vIFRydXN0IE9OTFkgdGhlIHNlcnZlciBjZXJ0Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsLnRydXN0Q2VydENoYWluRmlsZSA9IFBFTV9TRVJWRVJfQ1JUOwotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAic2hvdWxkRW5hYmxlU3NsQW5kQ2xpZW50Q2VydGlmaWNhdGVBdXRoV2l0aFBrY3MxMiI6CiAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsID0gbmV3IFNldHRpbmdzLlNzbFNldHRpbmdzKCk7CiAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc3NsLmVuYWJsZWQgPSB0cnVlOwpAQCAtMjEwLDU0ICsxODQsNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkRW5hYmxlU3NsQW5kQ2xpZW50Q2VydGlmaWNhdGVBdXRoV2l0aExlZ2FjeVBlbSgpIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5lbmFibGVTc2wodHJ1ZSkKLSAgICAgICAgICAgICAgICAua2V5Q2VydENoYWluRmlsZShQRU1fQ0xJRU5UX0NSVCkua2V5RmlsZShQRU1fQ0xJRU5UX0tFWSkKLSAgICAgICAgICAgICAgICAua2V5UGFzc3dvcmQoS0VZX1BBU1MpLnRydXN0Q2VydGlmaWNhdGVDaGFpbkZpbGUoUEVNX1NFUlZFUl9DUlQpLmNyZWF0ZSgpOwotICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGNsaWVudC5zdWJtaXQoIid0ZXN0JyIpLm9uZSgpLmdldFN0cmluZygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsdXN0ZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkRW5hYmxlU3NsQW5kQ2xpZW50Q2VydGlmaWNhdGVBdXRoQW5kRmFpbFdpdGhvdXRDZXJ0V2l0aExlZ2FjeVBlbSgpIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5lbmFibGVTc2wodHJ1ZSkua2V5U3RvcmUoSktTX1NFUlZFUl9LRVkpLmtleVN0b3JlUGFzc3dvcmQoS0VZX1BBU1MpLnNzbFNraXBDZXJ0VmFsaWRhdGlvbih0cnVlKS5jcmVhdGUoKTsKLSAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsdXN0ZXIuY29ubmVjdCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGllbnQuc3VibWl0KCIndGVzdCciKS5vbmUoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBleGNlcHRpb24gYmVjYXVzZSBzc2wgY2xpZW50IGF1dGggaXMgZW5hYmxlZCBvbiB0aGUgc2VydmVyIGJ1dCBjbGllbnQgZG9lcyBub3QgaGF2ZSBhIGNlcnQiKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24geCkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoeCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHJvb3QsIGluc3RhbmNlT2YoVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRFbmFibGVTc2xBbmRDbGllbnRDZXJ0aWZpY2F0ZUF1dGhBbmRGYWlsV2l0aG91dFRydXN0ZWRDbGllbnRDZXJ0V2l0aExlZ2FjeVBlbSgpIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5lbmFibGVTc2wodHJ1ZSkKLSAgICAgICAgICAgICAgICAua2V5Q2VydENoYWluRmlsZShQRU1fQ0xJRU5UX0NSVCkua2V5RmlsZShQRU1fQ0xJRU5UX0tFWSkKLSAgICAgICAgICAgICAgICAua2V5UGFzc3dvcmQoS0VZX1BBU1MpLnRydXN0Q2VydGlmaWNhdGVDaGFpbkZpbGUoUEVNX1NFUlZFUl9DUlQpLmNyZWF0ZSgpOwotICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsaWVudC5zdWJtaXQoIid0ZXN0JyIpLm9uZSgpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IGV4Y2VwdGlvbiBiZWNhdXNlIHNzbCBjbGllbnQgYXV0aCBpcyBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgYnV0IGRvZXMgbm90IHRydXN0IGNsaWVudCdzIGNlcnQiKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24geCkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoeCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHJvb3QsIGluc3RhbmNlT2YoVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRFbmFibGVTc2xBbmRDbGllbnRDZXJ0aWZpY2F0ZUF1dGhXaXRoUGtjczEyKCkgewogICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpLmVuYWJsZVNzbCh0cnVlKS5rZXlTdG9yZShQMTJfQ0xJRU5UX0tFWSkua2V5U3RvcmVQYXNzd29yZChLRVlfUEFTUykKICAgICAgICAgICAgICAgICAua2V5U3RvcmVUeXBlKEtFWVNUT1JFX1RZUEVfUEtDUzEyKS50cnVzdFN0b3JlKFAxMl9DTElFTlRfVFJVU1QpLnRydXN0U3RvcmVQYXNzd29yZChLRVlfUEFTUykuY3JlYXRlKCk7CkBAIC0zNzcsNDIgKzMwMyw0IEBACiAgICAgICAgICAgICBjbHVzdGVyMi5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRFbmFibGVTc2xBbmRDbGllbnRDZXJ0aWZpY2F0ZUF1dGhBbmRGYWlsV2l0aEluY29ycmVjdEtleVN0b3JlVHlwZSgpIHsKLSAgICAgICAgZmluYWwgQ2x1c3RlciBjbHVzdGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKS5lbmFibGVTc2wodHJ1ZSkKLSAgICAgICAgICAgICAgICAua2V5U3RvcmUoSktTX0NMSUVOVF9LRVkpLmtleVN0b3JlUGFzc3dvcmQoS0VZX1BBU1MpLmtleVN0b3JlVHlwZShLRVlTVE9SRV9UWVBFX1BLQ1MxMikKLSAgICAgICAgICAgICAgICAudHJ1c3RTdG9yZShQMTJfQ0xJRU5UX1RSVVNUKS50cnVzdFN0b3JlUGFzc3dvcmQoS0VZX1BBU1MpLnRydXN0U3RvcmVUeXBlKFRSVVNUU1RPUkVfVFlQRV9QS0NTMTIpCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOwotICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2x1c3Rlci5jb25uZWN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyByZXMgPSBjbGllbnQuc3VibWl0KCIndGVzdCciKS5vbmUoKS5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBleGNlcHRpb24gYmVjYXVzZSBpbmNvcnJlY3Qga2V5U3RvcmVUeXBlIGlzIHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoeCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHJvb3QsIGluc3RhbmNlT2YoVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRFbmFibGVTc2xBbmRDbGllbnRDZXJ0aWZpY2F0ZUF1dGhBbmRGYWlsV2l0aEluY29ycmVjdFRydXN0U3RvcmVUeXBlKCkgewotICAgICAgICBmaW5hbCBDbHVzdGVyIGNsdXN0ZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpLmVuYWJsZVNzbCh0cnVlKQotICAgICAgICAgICAgICAgIC5rZXlTdG9yZShQMTJfQ0xJRU5UX0tFWSkua2V5U3RvcmVQYXNzd29yZChLRVlfUEFTUykua2V5U3RvcmVUeXBlKEtFWVNUT1JFX1RZUEVfUEtDUzEyKQotICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlKEpLU19DTElFTlRfVFJVU1QpLnRydXN0U3RvcmVQYXNzd29yZChLRVlfUEFTUykudHJ1c3RTdG9yZVR5cGUoVFJVU1RTVE9SRV9UWVBFX1BLQ1MxMikKLSAgICAgICAgICAgICAgICAuY3JlYXRlKCk7Ci0gICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbHVzdGVyLmNvbm5lY3QoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xpZW50LnN1Ym1pdCgiJ3Rlc3QnIikub25lKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgZXhjZXB0aW9uIGJlY2F1c2UgaW5jb3JyZWN0IHRydXN0U3RvcmVUeXBlIGlzIHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBFeGNlcHRpb25VdGlscy5nZXRSb290Q2F1c2UoeCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHJvb3QsIGluc3RhbmNlT2YoVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9LZGNGaXh0dXJlLmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0tkY0ZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzNGUyNC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0tkY0ZpeHR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmtlcmJ5LmtlcmJlcm9zLmtlcmIuS3JiRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUua2VyYnkua2VyYmVyb3Mua2VyYi5jbGllbnQuS3JiQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUua2VyYnkua2VyYmVyb3Mua2VyYi5jbGllbnQuS3JiQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUua2VyYnkua2VyYmVyb3Mua2VyYi5jbGllbnQuS3JiQ29uZmlnS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUua2VyYnkua2VyYmVyb3Mua2VyYi5zZXJ2ZXIuU2ltcGxlS2RjU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUua2VyYnkua2VyYmVyb3Mua2VyYi50eXBlLnRpY2tldC5UZ3RUaWNrZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5rZXJieS51dGlsLk5ldHdvcmtVdGlsOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LkluZXQ0QWRkcmVzczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvZGlyZWN0b3J5LWtlcmJ5L2Jsb2Iva2VyYnktYWxsLTEuMC4wLVJDMjoKLSAqICAtIG9yZy5hcGFjaGUua2VyYnkua2VyYmVyb3Mua2VyYi5zZXJ2ZXIuVGVzdEtkY1NlcnZlcgotICogIC0gb3JnLmFwYWNoZS5rZXJieS5rZXJiZXJvcy5rZXJiLnNlcnZlci5LZGNUZXN0QmFzZQotICogIC0gb3JnLmFwYWNoZS5rZXJieS5rZXJiZXJvcy5rZXJiLnNlcnZlci5Mb2dpblRlc3RCYXNlCi0gKgotICogU2VlIGFsc286IGdyZW1saW4tc2VydmVyL3NyYy9tYWluL3N0YXRpYy9OT1RJQ0UKLSAqCi0gKiBAYXV0aG9yIE1hcmMgZGUgTGlnbmllCi0gKi8KLXB1YmxpYyBjbGFzcyBLZGNGaXh0dXJlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoS2RjRml4dHVyZS5jbGFzcyk7Ci0KLSAgICBmaW5hbCBTdHJpbmcgY2xpZW50UGFzc3dvcmQgPSAiMTIzNDU2IjsKLSAgICBmaW5hbCBTdHJpbmcgY2xpZW50UGFzc3dvcmQyID0gIjEyMzQ1NjIiOwotICAgIGZpbmFsIFN0cmluZyBjbGllbnRQcmluY2lwYWxOYW1lID0gImRyYW5reWUiOwotICAgIGZpbmFsIFN0cmluZyBjbGllbnRQcmluY2lwYWxOYW1lMiA9ICJkcmFua3llMiI7Ci0gICAgZmluYWwgU3RyaW5nIHNlcnZlclByaW5jaXBhbE5hbWUgPSAidGVzdC1zZXJ2aWNlIjsKLSAgICBmaW5hbCBTdHJpbmcgdGlja2V0Q2FjaGVGaWxlTmFtZSA9ICJ0ZXN0LXRrdC5jYyI7Ci0gICAgZmluYWwgU3RyaW5nIHRpY2tldENhY2hlRmlsZU5hbWUyID0gInRlc3QtdGt0Mi5jYyI7Ci0gICAgZmluYWwgU3RyaW5nIHNlcnZpY2VLZXl0YWJGaWxlTmFtZSA9ICJ0ZXN0LXNlcnZpY2Uua2V5dGFiIjsKLQotICAgIGZpbmFsIFN0cmluZyBjbGllbnRQcmluY2lwYWw7Ci0gICAgZmluYWwgU3RyaW5nIGNsaWVudFByaW5jaXBhbDI7Ci0gICAgZmluYWwgU3RyaW5nIHNlcnZlclByaW5jaXBhbDsKLSAgICBmaW5hbCBGaWxlIHRlc3REaXI7Ci0gICAgZmluYWwgRmlsZSB0aWNrZXRDYWNoZUZpbGU7Ci0gICAgZmluYWwgRmlsZSB0aWNrZXRDYWNoZUZpbGUyOwotICAgIGZpbmFsIEZpbGUgc2VydmljZUtleXRhYkZpbGU7Ci0KLSAgICBmaW5hbCBTdHJpbmcgaG9zdG5hbWU7Ci0gICAgcHJpdmF0ZSBTaW1wbGVLZGNTZXJ2ZXIga2RjU2VydmVyOwotCi0gICAgcHVibGljIEtkY0ZpeHR1cmUoZmluYWwgU3RyaW5nIGF1dGhDb25maWdOYW1lKSB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsIGF1dGhDb25maWdOYW1lKTsKLSAgICAgICAgaG9zdG5hbWUgPSBmaW5kSG9zdG5hbWUoKTsKLSAgICAgICAgc2VydmVyUHJpbmNpcGFsID0gc2VydmVyUHJpbmNpcGFsTmFtZSArICIvIiArIGhvc3RuYW1lICsgIkAiICsgS2RjRml4dHVyZS5UZXN0S2RjU2VydmVyLktEQ19SRUFMTTsKLSAgICAgICAgY2xpZW50UHJpbmNpcGFsID0gY2xpZW50UHJpbmNpcGFsTmFtZSArICJAIiArIEtkY0ZpeHR1cmUuVGVzdEtkY1NlcnZlci5LRENfUkVBTE07Ci0gICAgICAgIGNsaWVudFByaW5jaXBhbDIgPSBjbGllbnRQcmluY2lwYWxOYW1lMiArICJAIiArIEtkY0ZpeHR1cmUuVGVzdEtkY1NlcnZlci5LRENfUkVBTE07Ci0gICAgICAgIHRlc3REaXIgPSBjcmVhdGVUZXN0RGlyKCk7Ci0gICAgICAgIHRpY2tldENhY2hlRmlsZSA9IG5ldyBGaWxlKHRlc3REaXIsIHRpY2tldENhY2hlRmlsZU5hbWUpOwotICAgICAgICB0aWNrZXRDYWNoZUZpbGUyID0gbmV3IEZpbGUodGVzdERpciwgdGlja2V0Q2FjaGVGaWxlTmFtZTIpOwotICAgICAgICBzZXJ2aWNlS2V5dGFiRmlsZSA9IG5ldyBGaWxlKHRlc3REaXIsIHNlcnZpY2VLZXl0YWJGaWxlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmluZEhvc3RuYW1lKCkgewotICAgICAgICAvLyBIb3N0bmFtZSBzZXR0aW5nIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgZ3JlbWxpbi1jb25zb2xlIHNldHMgZ3JlbWxpbi1zZXJ2ZXIncyBob3N0bmFtZQotICAgICAgICAvLyBhbmQgZGVyaXZlcyBncmVtbGluLXNlcnZlcidzIHByaW5jaXBhbCBuYW1lLiBBbHNvLCB0aGUgaG9zdG5hbWUgbmVlZHMgdG8gYmUgbG93ZXJjYXNlIGZvciB1c2UKLSAgICAgICAgLy8gaW4gcHJpbmNpcGFsIG5hbWVzLgotICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSAiIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhvc3RuYW1lID0gSW5ldDRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldENhbm9uaWNhbEhvc3ROYW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiSG9zdG5hbWUgbm90IGZvdW5kOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBob3N0bmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlVGVzdERpcigpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGJhc2VkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiKTsKLSAgICAgICAgZmluYWwgRmlsZSB0YXJnZXRkaXIgPSBuZXcgRmlsZShiYXNlZGlyLCAidGFyZ2V0Iik7Ci0gICAgICAgIGZpbmFsIEZpbGUgdGVzdERpciA9IG5ldyBGaWxlKHRhcmdldGRpciwgImtkYyIpOwotICAgICAgICB0ZXN0RGlyLm1rZGlycygpOwotICAgICAgICByZXR1cm4gdGVzdERpcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRlc3RLZGNTZXJ2ZXIgZXh0ZW5kcyBTaW1wbGVLZGNTZXJ2ZXIgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRENfUkVBTE0gPSAiVEVTVC5DT00iOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUTkFNRSA9ICJsb2NhbGhvc3QiOwotCi0gICAgICAgIFRlc3RLZGNTZXJ2ZXIoKSB0aHJvd3MgS3JiRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNldEtkY1JlYWxtKEtEQ19SRUFMTSk7Ci0gICAgICAgICAgICBzZXRLZGNIb3N0KEhPU1ROQU1FKTsKLSAgICAgICAgICAgIHNldEFsbG93VGNwKHRydWUpOwotICAgICAgICAgICAgc2V0QWxsb3dVZHAoZmFsc2UpOyAgICAvLyBUaGVyZSBhcmUgc3RpbGwgdWRwIGlzc3VlcyBpbiBBcGFjaGUgRGlyZWN0b3J5LUtlcmJ5IDEuMC4wLVJDMgotICAgICAgICAgICAgc2V0S2RjVGNwUG9ydChOZXR3b3JrVXRpbC5nZXRTZXJ2ZXJQb3J0KCkpOwotCi0gICAgICAgICAgICBmaW5hbCBLcmJDbGllbnQga3JiQ2xudCA9IGdldEtyYkNsaWVudCgpOwotICAgICAgICAgICAgZmluYWwgS3JiQ29uZmlnIGtyYkNvbmZpZyA9IGtyYkNsbnQuZ2V0S3JiQ29uZmlnKCk7Ci0gICAgICAgICAgICBrcmJDb25maWcuc2V0U3RyaW5nKEtyYkNvbmZpZ0tleS5QRVJNSVRURURfRU5DVFlQRVMsCi0gICAgICAgICAgICAgICAgICAgICJhZXMxMjgtY3RzLWhtYWMtc2hhMS05NiBkZXMtY2JjLWNyYyBkZXMtY2JjLW1kNSBkZXMzLWNiYy1zaGExIik7Ci0gICAgICAgICAgICBrcmJDbG50LnNldFRpbWVvdXQoMTAgKiAxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFVwS2RjU2VydmVyKCk7Ci0gICAgICAgIHNldFVwUHJpbmNpcGFscygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRVcEtkY1NlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBrZGNTZXJ2ZXIgPSBuZXcgVGVzdEtkY1NlcnZlcigpOwotICAgICAgICBrZGNTZXJ2ZXIuc2V0V29ya0Rpcih0ZXN0RGlyKTsKLSAgICAgICAga2RjU2VydmVyLmluaXQoKTsKLSAgICAgICAga2RjU2VydmVyLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFVwUHJpbmNpcGFscygpIHRocm93cyBLcmJFeGNlcHRpb24gewotICAgICAgICBrZGNTZXJ2ZXIuY3JlYXRlUHJpbmNpcGFscyhzZXJ2ZXJQcmluY2lwYWwpOwotICAgICAgICBrZGNTZXJ2ZXIuZXhwb3J0UHJpbmNpcGFsKHNlcnZlclByaW5jaXBhbCwgc2VydmljZUtleXRhYkZpbGUpOwotCi0gICAgICAgIGtkY1NlcnZlci5jcmVhdGVQcmluY2lwYWwoY2xpZW50UHJpbmNpcGFsLCBjbGllbnRQYXNzd29yZCk7Ci0gICAgICAgIGZpbmFsIFRndFRpY2tldCB0Z3QgPSBrZGNTZXJ2ZXIuZ2V0S3JiQ2xpZW50KCkucmVxdWVzdFRndChjbGllbnRQcmluY2lwYWwsIGNsaWVudFBhc3N3b3JkKTsKLSAgICAgICAga2RjU2VydmVyLmdldEtyYkNsaWVudCgpLnN0b3JlVGlja2V0KHRndCwgdGlja2V0Q2FjaGVGaWxlKTsKLQotICAgICAgICBrZGNTZXJ2ZXIuY3JlYXRlUHJpbmNpcGFsKGNsaWVudFByaW5jaXBhbDIsIGNsaWVudFBhc3N3b3JkMik7Ci0gICAgICAgIGZpbmFsIFRndFRpY2tldCB0Z3QyID0ga2RjU2VydmVyLmdldEtyYkNsaWVudCgpLnJlcXVlc3RUZ3QoY2xpZW50UHJpbmNpcGFsMiwgY2xpZW50UGFzc3dvcmQyKTsKLSAgICAgICAga2RjU2VydmVyLmdldEtyYkNsaWVudCgpLnN0b3JlVGlja2V0KHRndDIsIHRpY2tldENhY2hlRmlsZTIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGV0ZVByaW5jaXBhbHMoKTsKLSAgICAgICAga2RjU2VydmVyLnN0b3AoKTsKLSAgICAgICAgdGlja2V0Q2FjaGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICB0aWNrZXRDYWNoZUZpbGUyLmRlbGV0ZSgpOwotICAgICAgICBzZXJ2aWNlS2V5dGFiRmlsZS5kZWxldGUoKTsKLSAgICAgICAgdGVzdERpci5kZWxldGUoKTsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlUHJpbmNpcGFscygpIHRocm93cyBLcmJFeGNlcHRpb24gewotICAgICAgICBrZGNTZXJ2ZXIuZ2V0S2FkbWluKCkuZGVsZXRlQnVpbHRpblByaW5jaXBhbHMoKTsKLSAgICAgICAga2RjU2VydmVyLmRlbGV0ZVByaW5jaXBhbHMoc2VydmVyUHJpbmNpcGFsKTsKLSAgICAgICAga2RjU2VydmVyLmRlbGV0ZVByaW5jaXBhbChjbGllbnRQcmluY2lwYWwpOwotICAgICAgICBrZGNTZXJ2ZXIuZGVsZXRlUHJpbmNpcGFsKGNsaWVudFByaW5jaXBhbDIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVByaW5jaXBhbChmaW5hbCBTdHJpbmcgcHJpbmNpcGFsKSB0aHJvd3MgS3JiRXhjZXB0aW9uIHsKLSAgICAgICAga2RjU2VydmVyLmNyZWF0ZVByaW5jaXBhbChwcmluY2lwYWwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvUmVzcG9uc2VIYW5kbGVyQ29udGV4dFRlc3QuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvUmVzcG9uc2VIYW5kbGVyQ29udGV4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MmMyMS4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL1Jlc3BvbnNlSGFuZGxlckNvbnRleHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyOwotCi1pbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVzcG9uc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVzcG9uc2VTdGF0dXNDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmhhbmRsZXIuRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLkxvZzRqUmVjb3JkaW5nQXBwZW5kZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIFJlc3BvbnNlSGFuZGxlckNvbnRleHRUZXN0IHsKLQotICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcih2YWx1ZSA9IDApCi0gICAgcHVibGljIEJpRnVuY3Rpb248Q29udGV4dCwgUmVzcG9uc2VTdGF0dXNDb2RlLCBWb2lkPiB3cml0ZUludm9rZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHggPSBNb2NraXRvLm1vY2soQ2hhbm5lbEhhbmRsZXJDb250ZXh0LmNsYXNzKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QgPSBSZXF1ZXN0TWVzc2FnZS5idWlsZCgidGVzdCIpLmNyZWF0ZSgpOwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbnRleHQocmVxdWVzdCwgY3R4LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICBwcml2YXRlIGZpbmFsIExvZzRqUmVjb3JkaW5nQXBwZW5kZXIgcmVjb3JkaW5nQXBwZW5kZXIgPSBuZXcgTG9nNGpSZWNvcmRpbmdBcHBlbmRlcigpOwotCi0gICAgcHJpdmF0ZSBMZXZlbCBvcmlnaW5hbExvZ0xldmVsOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxPYmplY3RbXT4gZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10gewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ldyBCaUZ1bmN0aW9uPENvbnRleHQsIFJlc3BvbnNlU3RhdHVzQ29kZSwgVm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBhcHBseShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFJlc3BvbnNlU3RhdHVzQ29kZSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQW5kRmx1c2goY29kZSwgInRlc3RNZXNzYWdlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ3cml0ZUFuZEZsdXNoKFJlc3BvbnNlU3RhdHVzQ29kZSwgT2JqZWN0KSI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCB7Ci0gICAgICAgICAgICAgICAgbmV3IEJpRnVuY3Rpb248Q29udGV4dCwgUmVzcG9uc2VTdGF0dXNDb2RlLCBWb2lkPigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIGFwcGx5KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgUmVzcG9uc2VTdGF0dXNDb2RlIGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBbmRGbHVzaChSZXNwb25zZU1lc3NhZ2UuYnVpbGQoVVVJRC5yYW5kb21VVUlEKCkpLmNvZGUoY29kZSkuY3JlYXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAid3JpdGVBbmRGbHVzaChSZXNwb25zZU1lc3NhZ2UpIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBhZGRSZWNvcmRpbmdBcHBlbmRlcigpIHsKLSAgICAgICAgZmluYWwgTG9nZ2VyIHJvb3RMb2dnZXIgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOwotICAgICAgICByb290TG9nZ2VyLmFkZEFwcGVuZGVyKHJlY29yZGluZ0FwcGVuZGVyKTsKLSAgICAgICAgb3JpZ2luYWxMb2dMZXZlbCA9IHJvb3RMb2dnZXIuZ2V0TGV2ZWwoKTsKLSAgICAgICAgcm9vdExvZ2dlci5zZXRMZXZlbChMZXZlbC5BTEwpOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlY29yZGluZ0FwcGVuZGVyKCkgewotICAgICAgICBmaW5hbCBMb2dnZXIgcm9vdExvZ2dlciA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7Ci0gICAgICAgIHJvb3RMb2dnZXIuc2V0TGV2ZWwob3JpZ2luYWxMb2dMZXZlbCk7Ci0gICAgICAgIHJvb3RMb2dnZXIucmVtb3ZlQXBwZW5kZXIocmVjb3JkaW5nQXBwZW5kZXIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkQWxsb3dNdWx0aXBsZU5vbkZpbmFsUmVzcG9uc2VzKCkgewotICAgICAgICB3cml0ZUludm9rZXIuYXBwbHkoY29udGV4dCwgUmVzcG9uc2VTdGF0dXNDb2RlLkFVVEhFTlRJQ0FURSk7Ci0gICAgICAgIE1vY2tpdG8udmVyaWZ5KGN0eCwgTW9ja2l0by50aW1lcygxKSkud3JpdGVBbmRGbHVzaChNb2NraXRvLmFueSgpKTsKLQotICAgICAgICB3cml0ZUludm9rZXIuYXBwbHkoY29udGV4dCwgUmVzcG9uc2VTdGF0dXNDb2RlLlBBUlRJQUxfQ09OVEVOVCk7Ci0gICAgICAgIE1vY2tpdG8udmVyaWZ5KGN0eCwgTW9ja2l0by50aW1lcygyKSkud3JpdGVBbmRGbHVzaChNb2NraXRvLmFueSgpKTsKLQotICAgICAgICB3cml0ZUludm9rZXIuYXBwbHkoY29udGV4dCwgUmVzcG9uc2VTdGF0dXNDb2RlLlBBUlRJQUxfQ09OVEVOVCk7Ci0gICAgICAgIE1vY2tpdG8udmVyaWZ5KGN0eCwgTW9ja2l0by50aW1lcygzKSkud3JpdGVBbmRGbHVzaChNb2NraXRvLmFueSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZEFsbG93QXRNb3N0T25lRmluYWxSZXNwb25zZSgpIHsKLSAgICAgICAgd3JpdGVJbnZva2VyLmFwcGx5KGNvbnRleHQsIFJlc3BvbnNlU3RhdHVzQ29kZS5BVVRIRU5USUNBVEUpOwotICAgICAgICBNb2NraXRvLnZlcmlmeShjdHgsIE1vY2tpdG8udGltZXMoMSkpLndyaXRlQW5kRmx1c2goTW9ja2l0by5hbnkoKSk7Ci0KLSAgICAgICAgd3JpdGVJbnZva2VyLmFwcGx5KGNvbnRleHQsIFJlc3BvbnNlU3RhdHVzQ29kZS5TVUNDRVNTKTsKLSAgICAgICAgTW9ja2l0by52ZXJpZnkoY3R4LCBNb2NraXRvLnRpbWVzKDIpKS53cml0ZUFuZEZsdXNoKE1vY2tpdG8uYW55KCkpOwotCi0gICAgICAgIHdyaXRlSW52b2tlci5hcHBseShjb250ZXh0LCBSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX1RJTUVPVVQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlY29yZGluZ0FwcGVuZGVyLmxvZ0NvbnRhaW5zQW55KCIuKiIgKyByZXF1ZXN0LmdldFJlcXVlc3RJZCgpICsgIi4qIikpOwotICAgICAgICBhc3NlcnRUcnVlKHJlY29yZGluZ0FwcGVuZGVyLmxvZ0NvbnRhaW5zQW55KCIuKiIgKyBSZXNwb25zZVN0YXR1c0NvZGUuU0VSVkVSX0VSUk9SX1RJTUVPVVQgKyAiLioiKSk7Ci0KLSAgICAgICAgLy8gZW5zdXJlIHRoZXJlIHdlcmUgbm8gb3RoZXIgd3JpdGVzIHRvIHRoZSBjaGFubmVsCi0gICAgICAgIE1vY2tpdG8udmVyaWZ5KGN0eCwgTW9ja2l0by50aW1lcygyKSkud3JpdGVBbmRGbHVzaChNb2NraXRvLmFueSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdEFsbG93Tm9uRmluYWxNZXNzYWdlc0FmdGVyRmluYWxSZXNwb25zZSgpIHsKLSAgICAgICAgd3JpdGVJbnZva2VyLmFwcGx5KGNvbnRleHQsIFJlc3BvbnNlU3RhdHVzQ29kZS5TRVJWRVJfRVJST1JfVElNRU9VVCk7Ci0gICAgICAgIE1vY2tpdG8udmVyaWZ5KGN0eCwgTW9ja2l0by50aW1lcygxKSkud3JpdGVBbmRGbHVzaChNb2NraXRvLmFueSgpKTsKLQotICAgICAgICB3cml0ZUludm9rZXIuYXBwbHkoY29udGV4dCwgUmVzcG9uc2VTdGF0dXNDb2RlLlBBUlRJQUxfQ09OVEVOVCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVjb3JkaW5nQXBwZW5kZXIubG9nQ29udGFpbnNBbnkoIi4qIiArIHJlcXVlc3QuZ2V0UmVxdWVzdElkKCkgKyAiLioiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVjb3JkaW5nQXBwZW5kZXIubG9nQ29udGFpbnNBbnkoIi4qIiArIFJlc3BvbnNlU3RhdHVzQ29kZS5QQVJUSUFMX0NPTlRFTlQgKyAiLioiKSk7Ci0KLSAgICAgICAgLy8gZW5zdXJlIHRoZXJlIHdlcmUgbm8gb3RoZXIgd3JpdGVzIHRvIHRoZSBjaGFubmVsCi0gICAgICAgIE1vY2tpdG8udmVyaWZ5KGN0eCwgTW9ja2l0by50aW1lcygxKSkud3JpdGVBbmRGbHVzaChNb2NraXRvLmFueSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlbGVhc2VJZ25vcmVkRnJhbWVzKCkgewotICAgICAgICB3cml0ZUludm9rZXIuYXBwbHkoY29udGV4dCwgUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9USU1FT1VUKTsKLSAgICAgICAgTW9ja2l0by52ZXJpZnkoY3R4LCBNb2NraXRvLnRpbWVzKDEpKS53cml0ZUFuZEZsdXNoKE1vY2tpdG8uYW55KCkpOwotCi0gICAgICAgIEZyYW1lIGZyYW1lID0gTW9ja2l0by5tb2NrKEZyYW1lLmNsYXNzKTsKLSAgICAgICAgY29udGV4dC53cml0ZUFuZEZsdXNoKFJlc3BvbnNlU3RhdHVzQ29kZS5TVUNDRVNTLCBmcmFtZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWNvcmRpbmdBcHBlbmRlci5sb2dDb250YWluc0FueSgiLioiICsgcmVxdWVzdC5nZXRSZXF1ZXN0SWQoKSArICIuKiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWNvcmRpbmdBcHBlbmRlci5sb2dDb250YWluc0FueSgiLioiICsgUmVzcG9uc2VTdGF0dXNDb2RlLlNVQ0NFU1MgKyAiLioiKSk7Ci0KLSAgICAgICAgLy8gZW5zdXJlIHRoZXJlIHdlcmUgbm8gb3RoZXIgd3JpdGVzIHRvIHRoZSBjaGFubmVsCi0gICAgICAgIE1vY2tpdG8udmVyaWZ5KGN0eCwgTW9ja2l0by50aW1lcygxKSkud3JpdGVBbmRGbHVzaChNb2NraXRvLmFueSgpKTsKLQotICAgICAgICAvLyBlbnN1cmUgdGhlIGZyYW1lIHdhcyByZWxlYXNlZAotICAgICAgICBNb2NraXRvLnZlcmlmeShmcmFtZSwgTW9ja2l0by50aW1lcygxKSkudHJ5UmVsZWFzZSgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL1Rlc3RDbGllbnRGYWN0b3J5LmphdmEgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL1Rlc3RDbGllbnRGYWN0b3J5LmphdmEKaW5kZXggMGViMTQ2Ny4uZjc2MDQ0MiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9UZXN0Q2xpZW50RmFjdG9yeS5qYXZhCisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvVGVzdENsaWVudEZhY3RvcnkuamF2YQpAQCAtMTksNyArMTksNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNsdXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuc2ltcGxlLk5pb0NsaWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5zaW1wbGUuV2ViU29ja2V0Q2xpZW50OwogCiBpbXBvcnQgamF2YS5uZXQuVVJJOwpAQCAtMzEsNyArMzAsNiBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVCA9IDQ1OTQwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIFdFQlNPQ0tFVF9VUkkgPSBVUkkuY3JlYXRlKCJ3czovL2xvY2FsaG9zdDoiICsgUE9SVCArICIvZ3JlbWxpbiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIE5JT19VUkkgPSBVUkkuY3JlYXRlKCJnczovL2xvY2FsaG9zdDoiICsgUE9SVCk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUCA9ICJodHRwOi8vbG9jYWxob3N0OiIgKyBQT1JUOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1BBVEggPSAiY29uZi9yZW1vdGUtb2JqZWN0cy55YW1sIjsKIApAQCAtNDcsMTAgKzQ1LDYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBXZWJTb2NrZXRDbGllbnQoV0VCU09DS0VUX1VSSSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBOaW9DbGllbnQgY3JlYXRlTmlvQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE5pb0NsaWVudChOSU9fVVJJKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVUkxTdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBjcmVhdGVVUkxTdHJpbmcoIiIpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvY2hhbm5lbC9BYnN0cmFjdEdyZW1saW5TZXJ2ZXJDaGFubmVsaXplckludGVncmF0ZVRlc3QuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvY2hhbm5lbC9BYnN0cmFjdEdyZW1saW5TZXJ2ZXJDaGFubmVsaXplckludGVncmF0ZVRlc3QuamF2YQppbmRleCBhN2VhNDg4Li4zOGYyYzlhIDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2NoYW5uZWwvQWJzdHJhY3RHcmVtbGluU2VydmVyQ2hhbm5lbGl6ZXJJbnRlZ3JhdGVUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9jaGFubmVsL0Fic3RyYWN0R3JlbWxpblNlcnZlckNoYW5uZWxpemVySW50ZWdyYXRlVGVzdC5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQXV0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQ2xpZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLkNsdXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuQ2hhbm5lbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuQWJzdHJhY3RHcmVtbGluU2VydmVySW50ZWdyYXRpb25UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLlNldHRpbmdzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLlRlc3RDbGllbnRGYWN0b3J5OwpAQCAtNjIsOCArNjEsNiBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTUyA9ICJ3c3MiOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0FORF9IVFRQID0gIndzQW5kSHR0cCI7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NTX0FORF9IVFRQUyA9ICJ3c3NBbmRIdHRwcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklPID0gIm5pbyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklPX1NFQ1VSRSA9ICJuaW9TZWN1cmUiOwogCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm90b2NvbCgpOwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2VjdXJlUHJvdG9jb2woKTsKQEAgLTE4MSwxMCArMTc4LDcgQEAKICAgICAgICAgcHJpdmF0ZSBDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBDbGllbnQgPSBudWxsOwogICAgICAgICBwcml2YXRlIENsdXN0ZXIgd3NDbHVzdGVyID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBDbHVzdGVyLkJ1aWxkZXIgd3NCdWlsZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBDbHVzdGVyIG5pb0NsdXN0ZXIgPSBudWxsOwotICAgICAgICBwcml2YXRlIENsdXN0ZXIuQnVpbGRlciBuaW9CdWlsZGVyID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBDbGllbnQgd3NDbGllbnQgPSBudWxsOwotICAgICAgICBwcml2YXRlIENsaWVudC5DbHVzdGVyZWRDbGllbnQgbmlvQ2xpZW50ID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNlY3VyZSA9IGZhbHNlOwogCiAKQEAgLTIxMywxMyArMjA3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgc2VjdXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgdGhpcy53c0J1aWxkZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE5JTzoKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5uaW9CdWlsZGVyID0gVGVzdENsaWVudEZhY3RvcnkuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBOSU9fU0VDVVJFOgotICAgICAgICAgICAgICAgICAgICB0aGlzLm5pb0J1aWxkZXIgPSBUZXN0Q2xpZW50RmFjdG9yeS5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICBzZWN1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNTIsOSArMjM5LDYgQEAKICAgICAgICAgICAgIGlmICh3c0NsdXN0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHdzQ2x1c3Rlci5jbG9zZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5pb0NsdXN0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5pb0NsdXN0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRBbmRBc3NlcnRVbmF1dGhvcml6ZWQoZmluYWwgU3RyaW5nIGdyZW1saW4sIGZpbmFsIFN0cmluZyB1c2VybmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI3MywxNSArMjU3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVc2VybmFtZSBhbmQvb3IgcGFzc3dvcmQgYXJlIGluY29ycmVjdCIsIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuaW9CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXROaW9DbGllbnQodXNlcm5hbWUsIHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBuaW9DbGllbnQuc3VibWl0KGdyZW1saW4pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVc2VybmFtZSBhbmQvb3IgcGFzc3dvcmQgYXJlIGluY29ycmVjdCIsIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2VuZEFuZEFzc2VydChmaW5hbCBTdHJpbmcgZ3JlbWxpbiwgZmluYWwgT2JqZWN0IHJlc3VsdCwgZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjk5LDI0ICsyNzQsNiBAQAogICAgICAgICAgICAgICAgIHNldFdzQ2xpZW50KHVzZXJuYW1lLCBwYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgd3NDbGllbnQuc3VibWl0KGdyZW1saW4pLmFsbCgpLmdldCgpLmdldCgwKS5nZXRJbnQoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmlvQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBuaW9DbGllbnQuc3VibWl0KGdyZW1saW4pLmFsbCgpLmdldCgpLmdldCgwKS5nZXRJbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0TmlvQ2xpZW50KGZpbmFsIFN0cmluZyB1c2VybmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgICAgICBuaW9CdWlsZGVyLmNoYW5uZWxpemVyKENoYW5uZWxpemVyLk5pb0NoYW5uZWxpemVyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQXV0aFByb3BlcnRpZXMgYXV0aFByb3BzID0gbmV3IEF1dGhQcm9wZXJ0aWVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKFByb3BlcnR5LlVTRVJOQU1FLCB1c2VybmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKFByb3BlcnR5LlBBU1NXT1JELCBwYXNzd29yZCk7Ci0KLSAgICAgICAgICAgICAgICBuaW9DbHVzdGVyID0gbmlvQnVpbGRlci5lbmFibGVTc2woc2VjdXJlKS5zc2xTa2lwQ2VydFZhbGlkYXRpb24odHJ1ZSkuYXV0aFByb3BlcnRpZXMoYXV0aFByb3BzKS5jcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBuaW9DbGllbnQgPSBuaW9DbHVzdGVyLmNvbm5lY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmlvQ2x1c3RlciA9IG5pb0J1aWxkZXIuZW5hYmxlU3NsKHNlY3VyZSkuY3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgbmlvQ2xpZW50ID0gbmlvQ2x1c3Rlci5jb25uZWN0KCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgc2V0V3NDbGllbnQoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQpIHsKZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvY2hhbm5lbC9OaW9DaGFubmVsaXplckludGVncmF0ZVRlc3QuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvY2hhbm5lbC9OaW9DaGFubmVsaXplckludGVncmF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4OGI0MC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL2NoYW5uZWwvTmlvQ2hhbm5lbGl6ZXJJbnRlZ3JhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuY2hhbm5lbDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuYXV0aC5TaW1wbGVBdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLlNldHRpbmdzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIE5pb0NoYW5uZWxpemVySW50ZWdyYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0R3JlbWxpblNlcnZlckNoYW5uZWxpemVySW50ZWdyYXRlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotICAgICAgICByZXR1cm4gTklPOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VjdXJlUHJvdG9jb2woKSB7Ci0gICAgICAgIHJldHVybiBOSU9fU0VDVVJFOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbm5lbGl6ZXIoKSB7Ci0gICAgICAgIHJldHVybiBOaW9DaGFubmVsaXplci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldHRpbmdzLkF1dGhlbnRpY2F0aW9uU2V0dGluZ3MgZ2V0QXV0aFNldHRpbmdzKCkgewotICAgICAgICBmaW5hbCBTZXR0aW5ncy5BdXRoZW50aWNhdGlvblNldHRpbmdzIGF1dGhTZXR0aW5ncyA9IG5ldyBTZXR0aW5ncy5BdXRoZW50aWNhdGlvblNldHRpbmdzKCk7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBhdXRoQ29uZmlnID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBhdXRoU2V0dGluZ3MuYXV0aGVudGljYXRvciA9IFNpbXBsZUF1dGhlbnRpY2F0b3IuY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBhdXRoQ29uZmlnLnB1dChTaW1wbGVBdXRoZW50aWNhdG9yLkNPTkZJR19DUkVERU5USUFMU19EQiwgImNvbmYvdGlua2VyZ3JhcGgtY3JlZGVudGlhbHMucHJvcGVydGllcyIpOwotICAgICAgICBhdXRoU2V0dGluZ3MuY29uZmlnID0gYXV0aENvbmZpZzsKLQotICAgICAgICByZXR1cm4gYXV0aFNldHRpbmdzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9BYnN0cmFjdEV2YWxPcFByb2Nlc3NvclRlc3QuamF2YSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zZXJ2ZXIvb3AvQWJzdHJhY3RFdmFsT3BQcm9jZXNzb3JUZXN0LmphdmEKaW5kZXggNDg1YTc0ZC4uYTgwMDVlOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9vcC9BYnN0cmFjdEV2YWxPcFByb2Nlc3NvclRlc3QuamF2YQorKysgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL29wL0Fic3RyYWN0RXZhbE9wUHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLm9wOwogCiBpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIuVG9rZW5zOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uZHJpdmVyLm1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXNwb25zZU1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXNwb25zZVN0YXR1c0NvZGU7CkBAIC00NCw3ICs0NSw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBldmFsT3BJbnRlcm5hbFNob3VsZEhhbmRsZUFsbEV2YWx1YXRpb25FeGNlcHRpb25zKCkgdGhyb3dzIE9wUHJvY2Vzc29yRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQWJzdHJhY3RFdmFsT3BQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFN0YW5kYXJkT3BQcm9jZXNzb3IoKTsKLSAgICAgICAgZmluYWwgUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCA9IFJlcXVlc3RNZXNzYWdlLmJ1aWxkKCJ0ZXN0IikuY3JlYXRlKCk7CisgICAgICAgIGZpbmFsIFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QgPSBSZXF1ZXN0TWVzc2FnZS5idWlsZCgidGVzdCIpLgorICAgICAgICAgICAgICAgIGFkZEFyZyhUb2tlbnMuQVJHU19MQU5HVUFHRSwgImdyZW1saW4tZ3Jvb3Z5IikuCisgICAgICAgICAgICAgICAgYWRkQXJnKFRva2Vucy5BUkdTX0dSRU1MSU4sICIxKzEiKS5jcmVhdGUoKTsKICAgICAgICAgZmluYWwgU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgU2V0dGluZ3MoKTsKICAgICAgICAgZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCA9IE1vY2tpdG8ubW9jayhDaGFubmVsSGFuZGxlckNvbnRleHQuY2xhc3MpOwogICAgICAgICBmaW5hbCBBcmd1bWVudENhcHRvcjxSZXNwb25zZU1lc3NhZ2U+IHJlc3BvbnNlQ2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoUmVzcG9uc2VNZXNzYWdlLmNsYXNzKTsKQEAgLTYwLDcgKzYzLDcgQEAKICAgICAgICAgcHJvY2Vzc29yLmV2YWxPcEludGVybmFsKGNvbnRleHRzcHksIGNvbnRleHRzcHk6OmdldEdyZW1saW5FeGVjdXRvciwgU2ltcGxlQmluZGluZ3M6Om5ldyk7CiAKICAgICAgICAgTW9ja2l0by52ZXJpZnkoY29udGV4dHNweSwgTW9ja2l0by50aW1lcygxKSkud3JpdGVBbmRGbHVzaChyZXNwb25zZUNhcHRvci5jYXB0dXJlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9TQ1JJUFRfRVZBTFVBVElPTiwgcmVzcG9uc2VDYXB0b3IuZ2V0VmFsdWUoKS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2VTdGF0dXNDb2RlLlNFUlZFUl9FUlJPUl9FVkFMVUFUSU9OLCByZXNwb25zZUNhcHRvci5nZXRWYWx1ZSgpLmdldFN0YXR1cygpLmdldENvZGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhyZXF1ZXN0LmdldFJlcXVlc3RJZCgpLCByZXNwb25zZUNhcHRvci5nZXRWYWx1ZSgpLmdldFJlcXVlc3RJZCgpKTsKICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZUNhcHRvci5nZXRWYWx1ZSgpLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKCJ0ZXN0LWV4Y2VwdGlvbiIpKTsKICAgICB9CmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvY2xpZW50LmNydCBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9jbGllbnQuY3J0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTczMzViLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9jbGllbnQuY3J0CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRGFqQ0NBbElDQ1FDRzBRR2o3SmdMdlRBTkJna3Foa2lHOXcwQkFRc0ZBREIyTVFzd0NRWURWUVFHRXdKVgotVXpFTE1Ba0dBMVVFQ0F3Q1RrTXhFREFPQmdOVkJBY01CMUpoYkdWcFoyZ3hFekFSQmdOVkJBb01Da05zYVdWdQotZENCQmNIQXhEekFOQmdOVkJBTU1CbU5zYVdWdWRERWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVFozSmxiV3hwYmkxMQotYzJWeVFHTnNhV1Z1ZERBZ0Z3MHhOekF4TWpNeE9EUXpNak5hR0E4eU1URTJNVEl6TURFNE5ETXlNMW93ZGpFTAotTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNURNUkF3RGdZRFZRUUhEQWRTWVd4bGFXZG9NUk13RVFZRAotVlFRS0RBcERiR2xsYm5RZ1FYQndNUTh3RFFZRFZRUUREQVpqYkdsbGJuUXhJakFnQmdrcWhraUc5dzBCQ1FFVwotRTJkeVpXMXNhVzR0ZFhObGNrQmpiR2xsYm5Rd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSwotQW9JQkFRRFU3VTV0Tk4rMEhDS1pYMzFaS01ad0FVSTdxR0NwWVhkMDV6NVNLUldlc05zckVlQ0xudTFEZ1loTAotaitoU2kyTEkrUndURjQ1REg4ekVQSXpRNkhFTXp1Q2QydXk3YmREclh2NkgvdEZVeDlJdzBlYTVvWEdYMXFOYQotdHpqUFRTbXcyMlZYYlNvK0I1RUcwY29DNW9EeTlTcFliMkh4ZURtZWdJMk9aTDZST0ZQS2JDVVR6eUpmcVRweQotMW1kZ25uS1RWdVFkdFd2ai9zWERBWnpScXRGSHdCa0hlektDT0M0eUxOaTUrcEkwMSswVjdGYnR5Q3FIN2lQUwotVlM5VktzTHVoUGt6QWtSaC94OUN4YVNyd2ljeXp5QjNLeWZnN2tqbXRkclVPcmZneGR3K01NUG9nM0pyR29McgotdGZ2YzlMVWgwSW1wTFBuZ3lXaHdjNWlOR3dtTEFnTUJBQUV3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUVpMAotSVZVSWJEdWlyTml2SlhYWFQ1ZUZVZ2ZBeDVpUGpiUjFYQmpDdUhPMDYxZDBCOGl0VTdjaWRLczB5NW1Eb2F1eQotdnV5d05CaWg2RkFzSG9ZTHJxSTFndDY1ZnliR3hxM3dsaG5xZExIN0dEZUh3NjVlMlBCMngrTTROdFFsa1BUcQotZFVnVXRRekFvOEhjNEROUjVCcnZDdExqcVQ3S25xOFFIdEdMeXM4ZW9EdXIwOTg5NCs2V2VVanJnVVRwODhKbAotdXFyWnFSSHZkTVc3c2dlNzNjcFUxZHNESlcwckpxQ0xaK3FBMlYrWlJSQ1FZMW9IdUhlSzZEa29rYWJhcTNycgotV3JweGZwcElQQ3VzSng0bm5Jd3U0ZDBnWndBS3dhYk9TOGxKUGpWMGZyUmtBMEJ1QUVwTUliT3daMTBUdzdaTQotMkh6YW1BT2lpa3M0TkZEU3M5ND0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9jbGllbnQua2V5LnBrOCBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9jbGllbnQua2V5LnBrOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzY2NlMy4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvY2xpZW50LmtleS5wazgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS0tLS0tQkVHSU4gRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUU2VEFiQmdrcWhraUc5dzBCQlFNd0RnUUl1SDNyVlhIbmlhRUNBZ2dBQklJRXlEekhXbnkvZnR0bk42emUKLVEvaU5FMXo3MkhCZzJhblRLM2dIZHU4VzNGOVc2QlNMaHVLYVV1bXhjeFg2SWZrWm14aW5xd1V4U05yUkJzd3IKLXM3MUVaN1FtWDJlYWVpV3hsbzZ6UDBJODk4ZnpxdlNCV2s2TmhudFYxU1ZHKysvQ01lSU1aQVJzODVPeGNOR04KLWZLRVh0QlVmNWpsbytoeTliVmdRUk8yTTF2SHplay9kZU9IeWoxZVh3RWkyT3hjdzFseTNvOWxSYXlJRkpGb3UKLTBvbHA1OGg4cEQ1cU9zU2ZJck5HNmJIQmcwMGVQMUlMRTFGVVBDZE9mRHJRRWppS0tWcWxsQ1hkc1V6L0tqQlkKLTBpR1lNdzNhVDJMRUxuaWJUeTBhbEZzd0dhREJScWx6R1NJR3JlamRHVE9CajdObWVpVzJ5T1krYVVqQ2tkWHcKLWxsODYyb0l0bEpaTy9CMTZFR2dJK2N6ZFhaZ2NMNVlSR1ZPdTZsb09sR3hVNjBZNjgxQWNqbjl3ZGx4eE9xWGEKLXRlN2toTEdYNnFtM2NlTUoyRFFiTU84SlM2VUJzR2pacXEvaWN0d2ZHeE5EaVRlaVdtb3lyUXZPM3FrYXFzRXQKLWlMQkpkU3NvZ3p4eCtoZmoreGlCUm9yZjlHdmtrNmhEbnpldVpsOVZvYWs1cVk3UnJjbXhEOGVjZGgzZzJmYU8KLVZGdHhUQXhtSEpha2dHRjdmWjdqUW94Wkp6elJuK3JqSWhBVGFFSDEvTU1NRTc3Wis4cmtFNzRveEZPcml6RFUKLUViNEFNVVYveGdyQXRRTEdwSUZBTEw3b1BrMnIxZXhGZ3l3TDQwcTUvQmNYQ3g2NWVsaVh0eW9CSWM1WCt0OTAKLWZUQjhsQTNLNW1UMk1YendNeU1QdjJuOGQ4VGEyT2ppc1JIalN1ZTZBcU5xaWZCdW5pVmZTcEhQOU9VbHNLYUwKLXUzZU44bVN1UERobG83UkdHOCtCN21TcUdEak9SUi8rQkp2d2dGcmVJeXVyT0wyMmc4ODd1UHdqelBYczZsbGwKLTNWRmNsc3JmRXFOTVA2a0JzWGxITkF4alQxMFdvV3JGK09OUEV5ZzlQcnpUR3J5VFJxVytwdHpCcXRpUXJWYWcKLS9LTWVlM3NkZzZpOUdOK0VHYzQzRE5Kenh4bEZYdlQ5a0J2T2s2NnRPUEVFNTk2M2szWmlranVBWDd4QlZPdk0KLUFscXpISFc3MjdmSFhxWXAweWFiV1RwcjcyUnVVR1FPcVBaaU1zV2Q2eDY1SEwySTBXSFA5UFhUZjF2TW1uajMKLU5naU4xcGFBVGw1TDhTOUp0OFdMOGlMc2tWdDJmK0NBS0p1UWZhbVk1Rmc1NG0vY0p6TkhWOG5BTVRUbCswRU4KLTl2VWh2bjY3MndaZDlKZkI0UE10ckloWUZOSkVsSm1tZEF3akZyb3A2Z29YQS9VR2dmM000UU5pUWV0Rkd4V1AKLWFKMHRNU2RBL2F4OW5HQTVMVTZpQ3dQZTUxRXhyUUpBVkZ3K29FM0k4K0oxb3oxZlFPbDh6SWd5T0Z3RytiSngKLS9ZL0p5cmFFc3NaNVJMdGFHZ2NtOXZabThXbzhhNVRRQ2JxaG9ZOHg3TXd5RjcvVnBiUlozYkdFVUZuV2QveUYKLTF0Q1BlWitxNUhONzlQM3FmWnpBY0ZBVTN6M0hhd1hEd1EzWE8zUGxpeDA0VmpyK1FGRU5lSnhoTCszRlh0THgKLTRuRitZOUZxNkk1eDhZUUxyUFlrSXlSejh4V3hWQlFGWlRlTmhXeDVuWVdOY0RYZ3ovUzh2M2lwWStFUEVqOVEKLXVPUVdOZFNKOVhPUitKdS9LU1AwMTUxZ3VMa1V3cEhCQ2kvQ0ZZNFRnRDZpRmdsVHlMdVpwVzJiYmltMW1tREkKLUxTREh3ckVSUVdObWNOem5LNFBJdzIyN3c2RVpxVUVJMGpqa0FOaFhRRzZkejFWa2FUSVpBb0VWV0hoRk5pOFMKLWdTUGtoc1dOODIyUXp4WlFiKzc0Sm9VRkJUaWZQNTBnaWFDZDZwMkhLdzhVMjBGQVB5c2VWSVkzSXNZYXR1TFUKLThWaGZlQlExR0xPT3k4LzVtUnlqTCtHam4vT2ZOUHdwczl1dU9vZ3gvakdmMEpodGpBRVkyV05vRUVCOURrVXYKLUFpalQwY2sxK0RNM2J5NE1sQT09Ci0tLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci5jcnQgYi9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvc2VydmVyLmNydApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3N2UzNC4uMDAwMDAwMAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvc2VydmVyLmNydAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSURyakNDQXBZQ0NRQ2c4aHhqSW5UY1F6QU5CZ2txaGtpRzl3MEJBUXNGQURDQmx6RUxNQWtHQTFVRUJoTUMKLVZWTXhDekFKQmdOVkJBZ01Ba05CTVJRd0VnWURWUVFIREF0VFlXNTBZU0JEYkdGeVlURVpNQmNHQTFVRUNnd1EKLVFYQmhZMmhsSUZScGJtdGxjbEJ2Y0RFUU1BNEdBMVVFQ3d3SFIzSmxiV3hwYmpFU01CQUdBMVVFQXd3SmJHOWoKLVlXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZ6Y0cxaGJHeGxkSFJsUUdGd1lXTm9aUzV2Y21jd0lCY04KLU1UY3dNVEl6TVRnME1URXdXaGdQTWpFeE5qRXlNekF4T0RReE1UQmFNSUdYTVFzd0NRWURWUVFHRXdKVlV6RUwKLU1Ba0dBMVVFQ0F3Q1EwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVJrd0Z3WURWUVFLREJCQmNHRmoKLWFHVWdWR2x1YTJWeVVHOXdNUkF3RGdZRFZRUUxEQWRIY21WdGJHbHVNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHYKLWMzUXhKREFpQmdrcWhraUc5dzBCQ1FFV0ZYTndiV0ZzYkdWMGRHVkFZWEJoWTJobExtOXlaekNDQVNJd0RRWUoKLUtvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUs1bCs1RERyU0dxMW4xdllJTWJiOTVidVdsbzR1NXMKLVY4d0hObWVGQ3VxTnZHZnhlcm1IUzg4U1N5NnF2ZFNYSVNmZStrajlKa2ZuMVBqeDRjendjbkYvcTRBdTNHYzYKLVQ5TWlBS0pVZmI0K013UEtFUmFjRm9iazZMVHJlS3B6dlh5bUFoaE0xa3R2dkE3L29wWituRU5ERW9JSksvS1MKLUNZOXZSV2VIcUkxUStSZjVOcnF3OGV5U3EvWmhQRGxwcHN1NXNRcjFnaFNzdXpYaHBZTmhxOFZCTXN5c0wyWmkKLVZGNURGTXFnOXloQmt4cnFvNzBXL3BqbzRrUUovaUYvNGQvM0hIaWNTQ1ZxMy9OQ2tXTVZnMEhlT1oxZVZhWi8KLUQ2RVh2OGNZd3lhUm1mN1NsZEU3UnRkYkFVME0rWTBMbXVvaTJldmxzME9pcWY4dXhFRFhlTFVDQXdFQUFUQU4KLUJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUpGQUFVeFllVWJmNnRBR0VLQ1hJU3RlZDEwVHliUFcvcUN4T1hFUE4KLVRUTyt4dm56a3NiY2J6T2MyWDBOK3lZSUt0a2ZpdVdnRDlVSjRRbkxTZUVLbW91TWJrVGswVG9ZSmo3U3J2aUkKLWYrOVIxSWlaTWl3eituMGlnRVRrRUdPSzBRbDI2WjRnM2tjMUl1ZVNEMDdRT0xBU1R2Vkx0RXlveWE3TEQ0UzYKLWprMUxuYnBiSFZtZ0hZNGttdHNnNmxWUTF6a3Fyc0RRZzlnb2g4ZEk1QWxOQ3VkcGQ4ekx4enNQYm0rUTIrREMKLVdkNEEybEtkaDNyYlkyTFlwYlZoQmo5YzZFMGxhYXFneUdDN3MzN1hmbXlCcDR3WWxYLzMwcDZScENSMnJjUlcKLVNLaDVOWE41Mlh4M1d1aVA0MndtOVpDL2RlOGdhT0RyVzhuNDR4bEVhTVBKM0E9PQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci5rZXkucGs4IGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci5rZXkucGs4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM2NzIwLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9zZXJ2ZXIua2V5LnBrOAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQotTUlJRTZUQWJCZ2txaGtpRzl3MEJCUU13RGdRSUppMk0zZFBjeCtjQ0FnZ0FCSUlFeUcvMFB3VGFxbTNla0drbgotOGRhSGpmY3F4Q3B2d09rdTBwQ0NnVjdBTXNyc2o0VHZNT0hPa0lkK3hLVnM0QWxYVjJnclBmVFFvTXJJRkZwMAotMjZoenBaT0hFakFlOVhidHpWV2dwaHdMVmVXT3I1dWdvdnlYUHhkQ3FNQnJuMjUxeTlZZzZjc2g1cFByc0hFcAotUkxUWlBRUHZFVkloQTB0UmtQUGFnNUJTbGovL25IN1BuWFlSbTRWU1JnN1dRUzE1aWVIc0MxeERNOXpZbmkvYgotZmZVKyt0d09HdkNkdnRHZC9scWpKajNkUG9tS3luYjZZNGNFYzczdlE2Y1FqZVhOMVcxTmlsNFFzRFo1M0gzVQotS3ZvV3VFVllEZjFXREZ5U2dITUZnZVBIWE1NV0E4WmtnUzZyT3JWMVREbm9aSWhHNUJTZTdhSk5KUWRWVk11YgotTkF4WkI0QzF1bklJQ3VBdHNQOUlFQWhldmJmTkd5U2kwamJybnVuMHBURDIyUTk1SFpWeWNsMVlXYW1ycjFIbAotMTdUbUhRVDd6aDRHTGxYVkkzTC9GZXZvc3didVI3bWlzeXFFM2tldE5weGRMY0hLczgyTVZMQ3diTHp1cW02MAotdHBTbS9qcmV4aE5FcktVMjhrZFB6V0N3cnVFSGRybE91TVNTOE4yWWdTWnhISWpFSWQ4cFpFRDhkc25QdnFoZQotQ0FFYTNGNjhKczlzbmdlTXZUaFlpcnByMHdPc1NHbUdDRHJYVG1RdlR3K3E4QytESkxXcGpmcEtaQTRnNjI0ZgotRTNDVW9qd09hUHJtYUVhMjVlWW0wb1lEc3RZOFFuY0c3bkJBdWxqZVhXQllmeEFSWWNMSS9iTEMvTS9xK1VlUwotZ3pqUWdvYWNINHIyWTdyd0VBMGFlWUMrOVRXbjVyUEhQV2VnZGMwMUEyZTdPbFlLcmx1OUMxYUtaci8vR3lCTQotbEVWUmMwdThSTCtSVmhtcDdmdFJ5QVRERzlrSlIrekRUMjZoZXdhRWE1YXRuUEtMamYrMzdodTdhLzZHSSsyWAotZHBXVHptdldhbDRlRWtGdUJnMmVrbDFsQ3N1dUNVQkRXeVlybGhzV1BZVE9TS0ovUFR1THE3SFZxZEdCOWtFdwotU2F2blhWNUxQT2FZNG5BekpUZFJrOURIZHhTd1Nyalo1cnZNTUQxQ0Fib2IvR0E5dDhhWWFHY0FXdFR3TUZzNAotc3BzNDBtbWFiM1gwTEx2VGJsSHRtUkNIV3N3Y0FDYkgyREM2SCswYXdzYVpOSTgwR3hTU3V0S04rMnZIM04wQwotNmZMd1AxVmFZbTBxUEEzcEkxdnA5WHU1SS8vNkh6dDNhVC9SKzZLaFMrQ0gzcWJKaUhOemcxeXdkTnFnRDNQcAotYkpORWlES1dkTGQ2NWJ2Y2xWVnlXSG92V0l2dkVseTFUV1VzcDRZYmRyVDVhc0wvVlY4MmZ2bzR3Q3R0T3E5NgotbXNrOU9MNXZRQURKMzJEN3ZubllhZGlUMnRwSk1qTlN1ZzdKS0h1dEovY0ptbThxa3FOd0ZtL0JIK3cydDdraAotZWxiRzBmMlA3RnBQWFZNQ0pQSGhtSS8rT0JFQ3FCSEFBV2dSUm45MUdxZUdnWStYeTA1b3JMMlIvcWVOZEJiVAotcW1yeHFtN0xlc1BnbzBJcVU4MnF1VGtpQkVSYVhNdThxVVlhWVBHVkpJc2tRdVdxZC9hQXJoYUZtcVpoSzNiegotbGVwSk1EQWFlYUJULzNVTElDSGRoc1NWQWhsNml3aWQ0MG93OHgxY1JGb1BFbGpaOXQ2ZkVSTjFoMnB0TnlaVAotTFJKNERVWHk0UldUSGwzK0FWeXp3Y2dNcHhreFJUemRqZ3V6QWpjZU9IRU1tN1VOQ3ZTVmhGSFZCa0c2a1hYdwotOTQwaVl2aGtSbm42SFJjUGJQNXhlSnA2R1g4Um9BbDQyZ2lSTzZPR25raGtlcE91QWNGS0pDQzJONU9nZEttcQotbWxWR0VLbmRyaXd5enlpUE44bm9FSmtzZW5MMWlNU0E3SFNuTTM0dUNKb0VldFRCUnV2OCs3MjFiVGR6OGR5MAotcy9HZ2hzWXp0dWdMamhvNHlpdm4yZmN4dzRnTUZpU2lsaXlyZmJvY0puSEF1YkRNWndFdTBmcGZZKzBmQmk5KwotZS9PZGd3OGFUbE1VS1NvK1VBPT0KLS0tLS0tRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9zY3JpcHRzL3Rlc3Qtc2VydmVyLXN0YXJ0Lmdyb292eSBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3NjcmlwdHMvdGVzdC1zZXJ2ZXItc3RhcnQuZ3Jvb3Z5CmluZGV4IGU3MjFhZmYuLjMyNDQ5MmUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3NjcmlwdHMvdGVzdC1zZXJ2ZXItc3RhcnQuZ3Jvb3Z5CisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3NjcmlwdHMvdGVzdC1zZXJ2ZXItc3RhcnQuZ3Jvb3Z5CkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLkdyZW1saW5TZXJ2ZXIKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5LZGNGaXh0dXJlCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zZXJ2ZXIuU2V0dGluZ3MKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI1LDggKzI2LDggQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBuZWVkIHRvIGJlIGFwcHJvcHJpYXRlbHkgcmVwbGljYXRlZCB0bwogLy8KLS8vIC0gZG9ja2VyL2dyZW1saW4tc2VydmVyL2dyZW1saW4tc2VydmVyLWludGVncmF0aW9uLnlhbWwKLS8vIC0gZG9ja2VyL2dyZW1saW4tc2VydmVyL2dyZW1saW4tc2VydmVyLWludGVncmF0aW9uLXNlY3VyZS55YW1sCisvLyAtIGRvY2tlci9ncmVtbGluLXNlcnZlci8qCisvLyAtIGRvY2tlci9ncmVtbGluLXNlcnZlci5zaAogLy8KIC8vIFdpdGhvdXQgc3VjaCBjaGFuZ2VzLCB0aGUgdGVzdCBkb2NrZXIgc2VydmVyIGNhbid0IGJlIHN0YXJ0ZWQgZm9yIGluZGVwZW5kZW50CiAvLyB0ZXN0aW5nIHdpdGggR3JlbWxpbiBMYW5ndWFnZSBWYXJpYW50cy4KQEAgLTQzLDE3ICs0NCwxNCBAQAogc2V0dGluZ3MuZ3JhcGhzLmdyYXRlZnVsID0gZ3JlbWxpblNlcnZlckRpciArICIvc3JjL3Rlc3Qvc2NyaXB0cy90aW5rZXJncmFwaC1lbXB0eS5wcm9wZXJ0aWVzIgogc2V0dGluZ3MuZ3JhcGhzLnNpbmsgPSBncmVtbGluU2VydmVyRGlyICsgIi9zcmMvdGVzdC9zY3JpcHRzL3RpbmtlcmdyYXBoLWVtcHR5LnByb3BlcnRpZXMiCiBzZXR0aW5ncy5zY3JpcHRFbmdpbmVzWyJncmVtbGluLWdyb292eSJdLnBsdWdpbnNbIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLlNjcmlwdEZpbGVHcmVtbGluUGx1Z2luIl0uZmlsZXMgPSBbZ3JlbWxpblNlcnZlckRpciArICIvc3JjL3Rlc3Qvc2NyaXB0cy9nZW5lcmF0ZS1hbGwuZ3Jvb3Z5Il0KLWlmIChCb29sZWFuLnBhcnNlQm9vbGVhbihweXRob24pKSB7Ci0gICAgc2V0dGluZ3Muc2NyaXB0RW5naW5lc1siZ3JlbWxpbi1weXRob24iXSA9IG5ldyBTZXR0aW5ncy5TY3JpcHRFbmdpbmVTZXR0aW5ncygpCi0gICAgc2V0dGluZ3Muc2NyaXB0RW5naW5lc1siZ3JlbWxpbi1qeXRob24iXSA9IG5ldyBTZXR0aW5ncy5TY3JpcHRFbmdpbmVTZXR0aW5ncygpCi19CiBzZXR0aW5ncy5wb3J0ID0gNDU5NDAKIAogZGVmIHNlcnZlciA9IG5ldyBHcmVtbGluU2VydmVyKHNldHRpbmdzKQogc2VydmVyLnN0YXJ0KCkuam9pbigpCiAKIHByb2plY3Quc2V0Q29udGV4dFZhbHVlKCJncmVtbGluLnNlcnZlciIsIHNlcnZlcikKLWxvZy5pbmZvKCJHcmVtbGluIFNlcnZlciB3aXRoIG5vIGF1dGhlbnRpY2F0aW9uIHN0YXJ0ZWQgb24gcG9ydCA0NTk0MCIpCitsb2cuaW5mbygiR3JlbWxpbiBTZXJ2ZXIgd2l0aG91dCBhdXRoZW50aWNhdGlvbiBzdGFydGVkIG9uIHBvcnQgNDU5NDAiKQorCiAKIGRlZiBzZWN1cmVQcm9wc0ZpbGUgPSBuZXcgRmlsZSgiJHtwcm9qZWN0QmFzZURpcn0vdGFyZ2V0L3RpbmtlcmdyYXBoLWNyZWRlbnRpYWxzLnByb3BlcnRpZXMiKQogaWYgKCFzZWN1cmVQcm9wc0ZpbGUuZXhpc3RzKCkpIHsKQEAgLTcyLDEwICs3MCw2IEBACiBzZXR0aW5nc1NlY3VyZS5ncmFwaHMuZ3JhdGVmdWwgPSBncmVtbGluU2VydmVyRGlyICsgIi9zcmMvdGVzdC9zY3JpcHRzL3RpbmtlcmdyYXBoLWVtcHR5LnByb3BlcnRpZXMiCiBzZXR0aW5nc1NlY3VyZS5ncmFwaHMuc2luayA9IGdyZW1saW5TZXJ2ZXJEaXIgKyAiL3NyYy90ZXN0L3NjcmlwdHMvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllcyIKIHNldHRpbmdzU2VjdXJlLnNjcmlwdEVuZ2luZXNbImdyZW1saW4tZ3Jvb3Z5Il0ucGx1Z2luc1sib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5qc3IyMjMuU2NyaXB0RmlsZUdyZW1saW5QbHVnaW4iXS5maWxlcyA9IFtncmVtbGluU2VydmVyRGlyICsgIi9zcmMvdGVzdC9zY3JpcHRzL2dlbmVyYXRlLWFsbC5ncm9vdnkiXQotaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHB5dGhvbikpIHsKLSAgICBzZXR0aW5nc1NlY3VyZS5zY3JpcHRFbmdpbmVzWyJncmVtbGluLXB5dGhvbiJdID0gbmV3IFNldHRpbmdzLlNjcmlwdEVuZ2luZVNldHRpbmdzKCkKLSAgICBzZXR0aW5nc1NlY3VyZS5zY3JpcHRFbmdpbmVzWyJncmVtbGluLWp5dGhvbiJdID0gbmV3IFNldHRpbmdzLlNjcmlwdEVuZ2luZVNldHRpbmdzKCkKLX0KIHNldHRpbmdzU2VjdXJlLnBvcnQgPSA0NTk0MQogc2V0dGluZ3NTZWN1cmUuYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRvciA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNlcnZlci5hdXRoLlNpbXBsZUF1dGhlbnRpY2F0b3IiCiBzZXR0aW5nc1NlY3VyZS5hdXRoZW50aWNhdGlvbi5jb25maWcgPSBbY3JlZGVudGlhbHNEYjogcHJvamVjdEJhc2VEaXIgKyAiL3RhcmdldC90aW5rZXJncmFwaC1jcmVkZW50aWFscy5wcm9wZXJ0aWVzIl0KQEAgLTg0LDQgKzc4LDMxIEBACiBzZXJ2ZXJTZWN1cmUuc3RhcnQoKS5qb2luKCkKIAogcHJvamVjdC5zZXRDb250ZXh0VmFsdWUoImdyZW1saW4uc2VydmVyLnNlY3VyZSIsIHNlcnZlclNlY3VyZSkKLWxvZy5pbmZvKCJHcmVtbGluIFNlcnZlciB3aXRoIGF1dGhlbnRpY2F0aW9uIHN0YXJ0ZWQgb24gcG9ydCA0NTk0MSIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbG9nLmluZm8oIkdyZW1saW4gU2VydmVyIHdpdGggcGFzc3dvcmQgYXV0aGVudGljYXRpb24gc3RhcnRlZCBvbiBwb3J0IDQ1OTQxIikKKworCitkZWYga2RjU2VydmVyID0gbmV3IEtkY0ZpeHR1cmUocHJvamVjdEJhc2VEaXIpCitrZGNTZXJ2ZXIuc2V0VXAoKQorCitwcm9qZWN0LnNldENvbnRleHRWYWx1ZSgiZ3JlbWxpbi5zZXJ2ZXIua2Rjc2VydmVyIiwga2RjU2VydmVyKQorbG9nLmluZm8oIktEQyBzdGFydGVkIHdpdGggY29uZmlndXJhdGlvbiAke3Byb2plY3RCYXNlRGlyfS90YXJnZXQva2RjL2tyYjUuY29uZiIpCisKK2RlZiBzZXR0aW5nc0tyYjUgPSBTZXR0aW5ncy5yZWFkKCIke3NldHRpbmdzRmlsZX0iKQorc2V0dGluZ3NLcmI1LmdyYXBocy5ncmFwaCA9IGdyZW1saW5TZXJ2ZXJEaXIgKyAiL3NyYy90ZXN0L3NjcmlwdHMvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllcyIKK3NldHRpbmdzS3JiNS5ncmFwaHMuY2xhc3NpYyA9IGdyZW1saW5TZXJ2ZXJEaXIgKyAiL3NyYy90ZXN0L3NjcmlwdHMvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllcyIKK3NldHRpbmdzS3JiNS5ncmFwaHMubW9kZXJuID0gZ3JlbWxpblNlcnZlckRpciArICIvc3JjL3Rlc3Qvc2NyaXB0cy90aW5rZXJncmFwaC1lbXB0eS5wcm9wZXJ0aWVzIgorc2V0dGluZ3NLcmI1LmdyYXBocy5jcmV3ID0gZ3JlbWxpblNlcnZlckRpciArICIvc3JjL3Rlc3Qvc2NyaXB0cy90aW5rZXJncmFwaC1lbXB0eS5wcm9wZXJ0aWVzIgorc2V0dGluZ3NLcmI1LmdyYXBocy5ncmF0ZWZ1bCA9IGdyZW1saW5TZXJ2ZXJEaXIgKyAiL3NyYy90ZXN0L3NjcmlwdHMvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllcyIKK3NldHRpbmdzS3JiNS5ncmFwaHMuc2luayA9IGdyZW1saW5TZXJ2ZXJEaXIgKyAiL3NyYy90ZXN0L3NjcmlwdHMvdGlua2VyZ3JhcGgtZW1wdHkucHJvcGVydGllcyIKK3NldHRpbmdzS3JiNS5zY3JpcHRFbmdpbmVzWyJncmVtbGluLWdyb292eSJdLnBsdWdpbnNbIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uanNyMjIzLlNjcmlwdEZpbGVHcmVtbGluUGx1Z2luIl0uZmlsZXMgPSBbZ3JlbWxpblNlcnZlckRpciArICIvc3JjL3Rlc3Qvc2NyaXB0cy9nZW5lcmF0ZS1hbGwuZ3Jvb3Z5Il0KK3NldHRpbmdzS3JiNS5wb3J0ID0gNDU5NDIKK3NldHRpbmdzS3JiNS5hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdG9yID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyLmF1dGguS3JiNUF1dGhlbnRpY2F0b3IiCitzZXR0aW5nc0tyYjUuYXV0aGVudGljYXRpb24uY29uZmlnID0gWworICAgICAgICAicHJpbmNpcGFsIjoga2RjU2VydmVyLnNlcnZlclByaW5jaXBhbCwKKyAgICAgICAgImtleXRhYiI6IGtkY1NlcnZlci5zZXJ2aWNlS2V5dGFiRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKV0KKworZGVmIHNlcnZlcktyYjUgPSBuZXcgR3JlbWxpblNlcnZlcihzZXR0aW5nc0tyYjUpCitzZXJ2ZXJLcmI1LnN0YXJ0KCkuam9pbigpCisKK3Byb2plY3Quc2V0Q29udGV4dFZhbHVlKCJncmVtbGluLnNlcnZlci5rcmI1Iiwgc2VydmVyS3JiNSkKK2xvZy5pbmZvKCJHcmVtbGluIFNlcnZlciB3aXRoIGtlcmJlcm9zIGF1dGhlbnRpY2F0aW9uIHN0YXJ0ZWQgb24gcG9ydCA0NTk0MiIpCmRpZmYgLS1naXQgYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9zY3JpcHRzL3Rlc3Qtc2VydmVyLXN0b3AuZ3Jvb3Z5IGIvZ3JlbWxpbi1zZXJ2ZXIvc3JjL3Rlc3Qvc2NyaXB0cy90ZXN0LXNlcnZlci1zdG9wLmdyb292eQppbmRleCA1OTVkOWJkLi5kOWZjNjI5IDEwMDY0NAotLS0gYS9ncmVtbGluLXNlcnZlci9zcmMvdGVzdC9zY3JpcHRzL3Rlc3Qtc2VydmVyLXN0b3AuZ3Jvb3Z5CisrKyBiL2dyZW1saW4tc2VydmVyL3NyYy90ZXN0L3NjcmlwdHMvdGVzdC1zZXJ2ZXItc3RvcC5ncm9vdnkKQEAgLTI5LDQgKzI5LDEyIEBACiBsb2cuaW5mbygiU2h1dHRpbmcgZG93biAkc2VydmVyU2VjdXJlIikKIHNlcnZlclNlY3VyZS5zdG9wKCkuam9pbigpCiAKK2RlZiBrZGNTZXJ2ZXIgPSBwcm9qZWN0LmdldENvbnRleHRWYWx1ZSgiZ3JlbWxpbi5zZXJ2ZXIua2Rjc2VydmVyIikKK2xvZy5pbmZvKCJTaHV0dGluZyBkb3duICRrZGNTZXJ2ZXIiKQora2RjU2VydmVyLmNsb3NlKCkKKworZGVmIHNlcnZlcktyYjUgPSBwcm9qZWN0LmdldENvbnRleHRWYWx1ZSgiZ3JlbWxpbi5zZXJ2ZXIua3JiNSIpCitsb2cuaW5mbygiU2h1dHRpbmcgZG93biAkc2VydmVyS3JiNSIpCitzZXJ2ZXJLcmI1LnN0b3AoKS5qb2luKCkKKwogbG9nLmluZm8oIkFsbCBHcmVtbGluIFNlcnZlciBpbnN0YW5jZXMgYXJlIHNodXRkb3duIGZvciAke2V4ZWN1dGlvbk5hbWV9IikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXNoYWRlZC9wb20ueG1sIGIvZ3JlbWxpbi1zaGFkZWQvcG9tLnhtbAppbmRleCA5NDJkMDM3Li44ZDBmODQ3IDEwMDY0NAotLS0gYS9ncmVtbGluLXNoYWRlZC9wb20ueG1sCisrKyBiL2dyZW1saW4tc2hhZGVkL3BvbS54bWwKQEAgLTIwLDcgKzIwLDcgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VycG9wPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi1zaGFkZWQ8L2FydGlmYWN0SWQ+CiAgICAgPG5hbWU+QXBhY2hlIFRpbmtlclBvcCA6OiBHcmVtbGluIFNoYWRlZDwvbmFtZT4KZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9icmFuY2gvQnJhbmNoLmZlYXR1cmUgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvYnJhbmNoL0JyYW5jaC5mZWF0dXJlCmluZGV4IGUxNjBmYzguLmExNjFiYTcgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9icmFuY2gvQnJhbmNoLmZlYXR1cmUKKysrIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL2JyYW5jaC9CcmFuY2guZmVhdHVyZQpAQCAtNDIsMTMgKzQyLDE1IEBACiAKICAgU2NlbmFyaW86IGdfVl9icmFuY2hYbGFiZWxfaXNYcGVyc29uWF9jb3VudFhfb3B0aW9uWDFfX2FnZVhfb3B0aW9uWDBfX2xhbmdYX29wdGlvblgwX19uYW1lWAogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKKyAgICBBbmQgdXNpbmcgdGhlIHBhcmFtZXRlciBvbmUgZGVmaW5lZCBhcyAiZFsxXS5sIgorICAgIEFuZCB1c2luZyB0aGUgcGFyYW1ldGVyIHplcm8gZGVmaW5lZCBhcyAiZFswXS5sIgogICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCiAgICAgICAiIiIKICAgICAgIGcuVigpLgogICAgICAgICBicmFuY2goX18ubGFiZWwoKS5pcygicGVyc29uIikuY291bnQoKSkuCi0gICAgICAgICAgb3B0aW9uKDFMLCBfXy52YWx1ZXMoImFnZSIpKS4KLSAgICAgICAgICBvcHRpb24oMEwsIF9fLnZhbHVlcygibGFuZyIpKS4KLSAgICAgICAgICBvcHRpb24oMEwsIF9fLnZhbHVlcygibmFtZSIpKQorICAgICAgICAgIG9wdGlvbihvbmUsIF9fLnZhbHVlcygiYWdlIikpLgorICAgICAgICAgIG9wdGlvbih6ZXJvLCBfXy52YWx1ZXMoImxhbmciKSkuCisgICAgICAgICAgb3B0aW9uKHplcm8sIF9fLnZhbHVlcygibmFtZSIpKQogICAgICAgIiIiCiAgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CiAgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKQEAgLTY0LDEzICs2NiwxNSBAQAogCiAgIFNjZW5hcmlvOiBnX1ZfYnJhbmNoWGxhYmVsX2lzWHBlcnNvblhfY291bnRYX29wdGlvblgxX19hZ2VYX29wdGlvblgwX19sYW5nWF9vcHRpb25YMF9fbmFtZVhfb3B0aW9uWGFueV9fbGFiZWxYCiAgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAorICAgIEFuZCB1c2luZyB0aGUgcGFyYW1ldGVyIG9uZSBkZWZpbmVkIGFzICJkWzFdLmwiCisgICAgQW5kIHVzaW5nIHRoZSBwYXJhbWV0ZXIgemVybyBkZWZpbmVkIGFzICJkWzBdLmwiCiAgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKICAgICAgICIiIgogICAgICAgZy5WKCkuCiAgICAgICAgIGJyYW5jaChfXy5sYWJlbCgpLmlzKCJwZXJzb24iKS5jb3VudCgpKS4KLSAgICAgICAgICBvcHRpb24oMUwsIF9fLnZhbHVlcygiYWdlIikpLgotICAgICAgICAgIG9wdGlvbigwTCwgX18udmFsdWVzKCJsYW5nIikpLgotICAgICAgICAgIG9wdGlvbigwTCwgX18udmFsdWVzKCJuYW1lIikpLgorICAgICAgICAgIG9wdGlvbihvbmUsIF9fLnZhbHVlcygiYWdlIikpLgorICAgICAgICAgIG9wdGlvbih6ZXJvLCBfXy52YWx1ZXMoImxhbmciKSkuCisgICAgICAgICAgb3B0aW9uKHplcm8sIF9fLnZhbHVlcygibmFtZSIpKS4KICAgICAgICAgICBvcHRpb24oUGljay5hbnksIF9fLmxhYmVsKCkpCiAgICAgICAiIiIKICAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9icmFuY2gvQ2hvb3NlLmZlYXR1cmUgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvYnJhbmNoL0Nob29zZS5mZWF0dXJlCmluZGV4IDdiYjhjMDMuLjk5ZmY0YzQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9icmFuY2gvQ2hvb3NlLmZlYXR1cmUKKysrIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL2JyYW5jaC9DaG9vc2UuZmVhdHVyZQpAQCAtMTksMTEgKzE5LDEzIEBACiAKICAgU2NlbmFyaW86IGdfVl9jaG9vc2VYb3V0X2NvdW50WF9vcHRpb25YMkxfbmFtZVhfb3B0aW9uWDNMX2FnZVgKICAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCisgICAgQW5kIHVzaW5nIHRoZSBwYXJhbWV0ZXIgdHdvIGRlZmluZWQgYXMgImRbMl0ubCIKKyAgICBBbmQgdXNpbmcgdGhlIHBhcmFtZXRlciB0aHJlZSBkZWZpbmVkIGFzICJkWzNdLmwiCiAgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKICAgICAgICIiIgogICAgICAgZy5WKCkuY2hvb3NlKF9fLm91dCgpLmNvdW50KCkpLgotICAgICAgICBvcHRpb24oMkwsIF9fLnZhbHVlcygibmFtZSIpKS4KLSAgICAgICAgb3B0aW9uKDNMLCBfXy52YWx1ZXMoImFnZSIpKQorICAgICAgICBvcHRpb24odHdvLCBfXy52YWx1ZXMoIm5hbWUiKSkuCisgICAgICAgIG9wdGlvbih0aHJlZSwgX18udmFsdWVzKCJhZ2UiKSkKICAgICAgICIiIgogICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAogICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvZmlsdGVyL0RlZHVwLmZlYXR1cmUgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvZmlsdGVyL0RlZHVwLmZlYXR1cmUKaW5kZXggNTAxZDAyYi4uZjUzM2E5YyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL2ZpbHRlci9EZWR1cC5mZWF0dXJlCisrKyBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9maWx0ZXIvRGVkdXAuZmVhdHVyZQpAQCAtMjM1LDMgKzIzNSwzNSBAQAogICAgICAgfCByZXN1bHQgfAogICAgICAgfCBkWzBdLmwgfAogCisgIFNjZW5hcmlvOiBnX1ZfYm90aEVfcHJvcGVydGllc19kZWR1cF9jb3VudAorICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKKyAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgorICAgICAgIiIiCisgICAgICBnLlYoKS5ib3RoRSgpLnByb3BlcnRpZXMoKS5kZWR1cCgpLmNvdW50KCkKKyAgICAgICIiIgorICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAorICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCisgICAgICB8IHJlc3VsdCB8CisgICAgICB8IGRbNF0ubCB8CisKKyAgU2NlbmFyaW86IGdfVl9ib3RoX3Byb3BlcnRpZXNfZGVkdXBfY291bnQKKyAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCisgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKKyAgICAgICIiIgorICAgICAgZy5WKCkuYm90aCgpLnByb3BlcnRpZXMoKS5kZWR1cCgpLmNvdW50KCkKKyAgICAgICIiIgorICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAorICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCisgICAgICB8IHJlc3VsdCB8CisgICAgICB8IGRbMTJdLmwgfAorCisgIFNjZW5hcmlvOiBnX1ZfYm90aF9wcm9wZXJ0aWVzX3Byb3BlcnRpZXNfZGVkdXBfY291bnQKKyAgICBHaXZlbiB0aGUgY3JldyBncmFwaAorICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCisgICAgICAiIiIKKyAgICAgIGcuVigpLmJvdGgoKS5wcm9wZXJ0aWVzKCkucHJvcGVydGllcygpLmRlZHVwKCkuY291bnQoKQorICAgICAgIiIiCisgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CisgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKKyAgICAgIHwgcmVzdWx0IHwKKyAgICAgIHwgZFsyMV0ubCB8ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL2ZpbHRlci9Jcy5mZWF0dXJlIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL2ZpbHRlci9Jcy5mZWF0dXJlCmluZGV4IDRlZWMyNzQuLjcwYzdhOWEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9maWx0ZXIvSXMuZmVhdHVyZQorKysgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvZmlsdGVyL0lzLmZlYXR1cmUKQEAgLTY1LDkgKzY1LDEwIEBACiAKICAgU2NlbmFyaW86IGdfVl93aGVyZVhpblhjcmVhdGVkWF9jb3VudF9pc1hndGVfMlhYX3ZhbHVlc1huYW1lWAogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKKyAgICBBbmQgdXNpbmcgdGhlIHBhcmFtZXRlciB0d28gZGVmaW5lZCBhcyAiZFsyXS5sIgogICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCiAgICAgICAiIiIKLSAgICAgIGcuVigpLndoZXJlKF9fLmluKCJjcmVhdGVkIikuY291bnQoKS5pcyhQLmd0ZSgybCkpKS52YWx1ZXMoIm5hbWUiKQorICAgICAgZy5WKCkud2hlcmUoX18uaW4oImNyZWF0ZWQiKS5jb3VudCgpLmlzKFAuZ3RlKHR3bykpKS52YWx1ZXMoIm5hbWUiKQogICAgICAgIiIiCiAgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CiAgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9maWx0ZXIvT3IuZmVhdHVyZSBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9maWx0ZXIvT3IuZmVhdHVyZQppbmRleCA3ZjQ3ODJkLi40MzdiY2QxIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvZmlsdGVyL09yLmZlYXR1cmUKKysrIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL2ZpbHRlci9Pci5mZWF0dXJlCkBAIC0xOSw5ICsxOSwxMCBAQAogCiAgIFNjZW5hcmlvOiBnX1Zfb3JYaGFzWGFnZV9ndF8yN1hfX291dEVfY291bnRfZ3RlXzJYX25hbWUKICAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCisgICAgQW5kIHVzaW5nIHRoZSBwYXJhbWV0ZXIgdHdvIGRlZmluZWQgYXMgImRbMl0ubCIKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgogICAgICAgIiIiCi0gICAgICBnLlYoKS5vcihfXy5oYXMoImFnZSIsIFAuZ3QoMjcpKSwgX18ub3V0RSgpLmNvdW50KCkuaXMoUC5ndGUoMmwpKSkudmFsdWVzKCJuYW1lIikKKyAgICAgIGcuVigpLm9yKF9fLmhhcygiYWdlIiwgUC5ndCgyNykpLCBfXy5vdXRFKCkuY291bnQoKS5pcyhQLmd0ZSh0d28pKSkudmFsdWVzKCJuYW1lIikKICAgICAgICIiIgogICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAogICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL0FkZEVkZ2UuZmVhdHVyZSBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvQWRkRWRnZS5mZWF0dXJlCmluZGV4IDdmNGIwYWEuLjhlMDNhYzMgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvQWRkRWRnZS5mZWF0dXJlCisrKyBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvQWRkRWRnZS5mZWF0dXJlCkBAIC03Miw2ICs3MiwzMSBAQAogICAgIEFuZCB0aGUgZ3JhcGggc2hvdWxkIHJldHVybiA0IGZvciBjb3VudCBvZiAiZy5WKHYxSWQpLmJvdGhFKCkiCiAgICAgQW5kIHRoZSBncmFwaCBzaG91bGQgcmV0dXJuIDEgZm9yIGNvdW50IG9mICJnLlYodjFJZCkuaW5FKCkuaGFzKFwid2VpZ2h0XCIsIDIuMCkiCiAKKyAgU2NlbmFyaW86IGdfVl9vdXRFX3Byb3BlcnR5WHdlaWdodF9udWxsWAorICAgIEdpdmVuIHRoZSBlbXB0eSBncmFwaAorICAgIEFuZCB0aGUgZ3JhcGggaW5pdGlhbGl6ZXIgb2YKKyAgICAgICIiIgorICAgICAgZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eShULmlkLCAxKS5wcm9wZXJ0eSgibmFtZSIsICJtYXJrbyIpLnByb3BlcnR5KCJhZ2UiLCAyOSkuYXMoIm1hcmtvIikuCisgICAgICAgIGFkZFYoInBlcnNvbiIpLnByb3BlcnR5KFQuaWQsIDIpLnByb3BlcnR5KCJuYW1lIiwgInZhZGFzIikucHJvcGVydHkoImFnZSIsIDI3KS5hcygidmFkYXMiKS4KKyAgICAgICAgYWRkVigic29mdHdhcmUiKS5wcm9wZXJ0eShULmlkLCAzKS5wcm9wZXJ0eSgibmFtZSIsICJsb3AiKS5wcm9wZXJ0eSgibGFuZyIsICJqYXZhIikuYXMoImxvcCIpLgorICAgICAgICBhZGRWKCJwZXJzb24iKS5wcm9wZXJ0eShULmlkLCA0KS5wcm9wZXJ0eSgibmFtZSIsImpvc2giKS5wcm9wZXJ0eSgiYWdlIiwgMzIpLmFzKCJqb3NoIikuCisgICAgICAgIGFkZFYoInNvZnR3YXJlIikucHJvcGVydHkoVC5pZCwgNSkucHJvcGVydHkoIm5hbWUiLCAicmlwcGxlIikucHJvcGVydHkoImxhbmciLCAiamF2YSIpLmFzKCJyaXBwbGUiKS4KKyAgICAgICAgYWRkVigicGVyc29uIikucHJvcGVydHkoVC5pZCwgNikucHJvcGVydHkoIm5hbWUiLCAicGV0ZXIiKS5wcm9wZXJ0eSgiYWdlIiwgMzUpLmFzKCdwZXRlcicpLgorICAgICAgICBhZGRFKCJrbm93cyIpLmZyb20oIm1hcmtvIikudG8oInZhZGFzIikucHJvcGVydHkoVC5pZCwgNykucHJvcGVydHkoIndlaWdodCIsIDAuNSkuCisgICAgICAgIGFkZEUoImtub3dzIikuZnJvbSgibWFya28iKS50bygiam9zaCIpLnByb3BlcnR5KFQuaWQsIDgpLnByb3BlcnR5KCJ3ZWlnaHQiLCAxLjApLgorICAgICAgICBhZGRFKCJjcmVhdGVkIikuZnJvbSgibWFya28iKS50bygibG9wIikucHJvcGVydHkoVC5pZCwgOSkucHJvcGVydHkoIndlaWdodCIsIDAuNCkuCisgICAgICAgIGFkZEUoImNyZWF0ZWQiKS5mcm9tKCJqb3NoIikudG8oInJpcHBsZSIpLnByb3BlcnR5KFQuaWQsIDEwKS5wcm9wZXJ0eSgid2VpZ2h0IiwgMS4wKS4KKyAgICAgICAgYWRkRSgiY3JlYXRlZCIpLmZyb20oImpvc2giKS50bygibG9wIikucHJvcGVydHkoVC5pZCwgMTEpLnByb3BlcnR5KCJ3ZWlnaHQiLCAwLjQpLgorICAgICAgICBhZGRFKCJjcmVhdGVkIikuZnJvbSgicGV0ZXIiKS50bygibG9wIikucHJvcGVydHkoVC5pZCwgMTIpLnByb3BlcnR5KCJ3ZWlnaHQiLCAwLjIpCisgICAgICAiIiIKKyAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgorICAgICAgIiIiCisgICAgICBnLlYoKS5vdXRFKCkucHJvcGVydHkoIndlaWdodCIsIG51bGwpCisgICAgICAiIiIKKyAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKKyAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGhhdmUgYSBjb3VudCBvZiA2CisgICAgQW5kIHRoZSBncmFwaCBzaG91bGQgcmV0dXJuIDAgZm9yIGNvdW50IG9mICJnLkUoKS5wcm9wZXJ0aWVzKFwid2VpZ2h0XCIpIgorCiAgIFNjZW5hcmlvOiBnX1ZfYWdncmVnYXRlWHhYX2FzWGFYX3NlbGVjdFh4WF91bmZvbGRfYWRkRVhleGlzdHNXaXRoWF90b1hhWF9wcm9wZXJ0eVh0aW1lX25vd1gKICAgICBHaXZlbiB0aGUgZW1wdHkgZ3JhcGgKICAgICBBbmQgdGhlIGdyYXBoIGluaXRpYWxpemVyIG9mCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL0FkZFZlcnRleC5mZWF0dXJlIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9BZGRWZXJ0ZXguZmVhdHVyZQppbmRleCBhNjBmZWZiLi45NDNiMzAzIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL0FkZFZlcnRleC5mZWF0dXJlCisrKyBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvQWRkVmVydGV4LmZlYXR1cmUKQEAgLTkzLDYgKzkzLDMxIEBACiAgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBoYXZlIGEgY291bnQgb2YgMQogICAgIEFuZCB0aGUgZ3JhcGggc2hvdWxkIHJldHVybiAxIGZvciBjb3VudCBvZiAiZy5WKCkuaGFzKFwicGVyc29uXCIsXCJuYW1lXCIsXCJzdGVwaGVuXCIpIgogCisgIFNjZW5hcmlvOiBnX1ZfaGFzTGFiZWxYcGVyc29uWF9wcm9wZXJ0eVhuYW1lX251bGxYCisgICAgR2l2ZW4gdGhlIGVtcHR5IGdyYXBoCisgICAgQW5kIHRoZSBncmFwaCBpbml0aWFsaXplciBvZgorICAgICAgIiIiCisgICAgICBnLmFkZFYoInBlcnNvbiIpLnByb3BlcnR5KFQuaWQsIDEpLnByb3BlcnR5KCJuYW1lIiwgIm1hcmtvIikucHJvcGVydHkoImFnZSIsIDI5KS5hcygibWFya28iKS4KKyAgICAgICAgYWRkVigicGVyc29uIikucHJvcGVydHkoVC5pZCwgMikucHJvcGVydHkoIm5hbWUiLCAidmFkYXMiKS5wcm9wZXJ0eSgiYWdlIiwgMjcpLmFzKCJ2YWRhcyIpLgorICAgICAgICBhZGRWKCJzb2Z0d2FyZSIpLnByb3BlcnR5KFQuaWQsIDMpLnByb3BlcnR5KCJuYW1lIiwgImxvcCIpLnByb3BlcnR5KCJsYW5nIiwgImphdmEiKS5hcygibG9wIikuCisgICAgICAgIGFkZFYoInBlcnNvbiIpLnByb3BlcnR5KFQuaWQsIDQpLnByb3BlcnR5KCJuYW1lIiwiam9zaCIpLnByb3BlcnR5KCJhZ2UiLCAzMikuYXMoImpvc2giKS4KKyAgICAgICAgYWRkVigic29mdHdhcmUiKS5wcm9wZXJ0eShULmlkLCA1KS5wcm9wZXJ0eSgibmFtZSIsICJyaXBwbGUiKS5wcm9wZXJ0eSgibGFuZyIsICJqYXZhIikuYXMoInJpcHBsZSIpLgorICAgICAgICBhZGRWKCJwZXJzb24iKS5wcm9wZXJ0eShULmlkLCA2KS5wcm9wZXJ0eSgibmFtZSIsICJwZXRlciIpLnByb3BlcnR5KCJhZ2UiLCAzNSkuYXMoJ3BldGVyJykuCisgICAgICAgIGFkZEUoImtub3dzIikuZnJvbSgibWFya28iKS50bygidmFkYXMiKS5wcm9wZXJ0eShULmlkLCA3KS5wcm9wZXJ0eSgid2VpZ2h0IiwgMC41KS4KKyAgICAgICAgYWRkRSgia25vd3MiKS5mcm9tKCJtYXJrbyIpLnRvKCJqb3NoIikucHJvcGVydHkoVC5pZCwgOCkucHJvcGVydHkoIndlaWdodCIsIDEuMCkuCisgICAgICAgIGFkZEUoImNyZWF0ZWQiKS5mcm9tKCJtYXJrbyIpLnRvKCJsb3AiKS5wcm9wZXJ0eShULmlkLCA5KS5wcm9wZXJ0eSgid2VpZ2h0IiwgMC40KS4KKyAgICAgICAgYWRkRSgiY3JlYXRlZCIpLmZyb20oImpvc2giKS50bygicmlwcGxlIikucHJvcGVydHkoVC5pZCwgMTApLnByb3BlcnR5KCJ3ZWlnaHQiLCAxLjApLgorICAgICAgICBhZGRFKCJjcmVhdGVkIikuZnJvbSgiam9zaCIpLnRvKCJsb3AiKS5wcm9wZXJ0eShULmlkLCAxMSkucHJvcGVydHkoIndlaWdodCIsIDAuNCkuCisgICAgICAgIGFkZEUoImNyZWF0ZWQiKS5mcm9tKCJwZXRlciIpLnRvKCJsb3AiKS5wcm9wZXJ0eShULmlkLCAxMikucHJvcGVydHkoIndlaWdodCIsIDAuMikKKyAgICAgICIiIgorICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCisgICAgICAiIiIKKyAgICAgIGcuVigpLmhhc0xhYmVsKCJwZXJzb24iKS5wcm9wZXJ0eSgibmFtZSIsIG51bGwpCisgICAgICAiIiIKKyAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKKyAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGhhdmUgYSBjb3VudCBvZiA0CisgICAgQW5kIHRoZSBncmFwaCBzaG91bGQgcmV0dXJuIDIgZm9yIGNvdW50IG9mICJnLlYoKS5wcm9wZXJ0aWVzKFwibmFtZVwiKSIKKwogICBTY2VuYXJpbzogZ19hZGRWWHBlcnNvblhfcHJvcGVydHlYc2luZ2xlX25hbWVfc3RlcGhlblhfcHJvcGVydHlYc2luZ2xlX25hbWVfc3RlcGhlbm1YCiAgICAgR2l2ZW4gdGhlIGVtcHR5IGdyYXBoCiAgICAgQW5kIHRoZSBncmFwaCBpbml0aWFsaXplciBvZgpAQCAtMzg3LDMgKzQxMiwyMiBAQAogICAgICAgfCByZXN1bHQgfAogICAgICAgfCBuYW1lIHwKIAorICBTY2VuYXJpbzogZ19hZGRWWG51bGxYX3Byb3BlcnR5WGlkX251bGxYCisgICAgR2l2ZW4gdGhlIGVtcHR5IGdyYXBoCisgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKKyAgICAgICIiIgorICAgICAgZy5hZGRWKG51bGwpLnByb3BlcnR5KFQuaWQsIG51bGwpCisgICAgICAiIiIKKyAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKKyAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGhhdmUgYSBjb3VudCBvZiAxCisgICAgQW5kIHRoZSBncmFwaCBzaG91bGQgcmV0dXJuIDEgZm9yIGNvdW50IG9mICJnLlYoKS5oYXNMYWJlbChcInZlcnRleFwiKSIKKworICBTY2VuYXJpbzogZ19hZGRWX3Byb3BlcnR5WGxhYmVsX3BlcnNvblgKKyAgICBHaXZlbiB0aGUgZW1wdHkgZ3JhcGgKKyAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgorICAgICAgIiIiCisgICAgICBnLmFkZFYoKS5wcm9wZXJ0eShULmxhYmVsLCAicGVyc29uIikKKyAgICAgICIiIgorICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAorICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgaGF2ZSBhIGNvdW50IG9mIDEKKyAgICBBbmQgdGhlIGdyYXBoIHNob3VsZCByZXR1cm4gMSBmb3IgY291bnQgb2YgImcuVigpLmhhc0xhYmVsKFwicGVyc29uXCIpIgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9Db25zdGFudC5mZWF0dXJlIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9Db25zdGFudC5mZWF0dXJlCmluZGV4IDlhZDhkMTMuLmVkMjViMjUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvQ29uc3RhbnQuZmVhdHVyZQorKysgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL0NvbnN0YW50LmZlYXR1cmUKQEAgLTE5LDcgKzE5LDYgQEAKIAogICBTY2VuYXJpbzogZ19WX2NvbnN0YW50WDEyM1gKICAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCi0gICAgQW5kIHVzaW5nIHRoZSBwYXJhbWV0ZXIgdjFJZCBkZWZpbmVkIGFzICJ2W21hcmtvXS5pZCIKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgogICAgICAgIiIiCiAgICAgICBnLlYoKS5jb25zdGFudCgxMjMpCkBAIC0zNCw2ICszMywyMiBAQAogICAgICAgfCBkWzEyM10uaSB8CiAgICAgICB8IGRbMTIzXS5pIHwKIAorICBTY2VuYXJpbzogZ19WX2NvbnN0YW50WG51bGxYCisgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAorICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCisgICAgICAiIiIKKyAgICAgIGcuVigpLmNvbnN0YW50KG51bGwpCisgICAgICAiIiIKKyAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKKyAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlIHVub3JkZXJlZAorICAgICAgfCByZXN1bHQgfAorICAgICAgfCBudWxsIHwKKyAgICAgIHwgbnVsbCB8CisgICAgICB8IG51bGwgfAorICAgICAgfCBudWxsIHwKKyAgICAgIHwgbnVsbCB8CisgICAgICB8IG51bGwgfAorCiAgIFNjZW5hcmlvOiBnX1ZfY2hvb3NlWGhhc0xhYmVsWHBlcnNvblhfdmFsdWVzWG5hbWVYX2NvbnN0YW50WGluaHVtYW5YWAogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9NYXAuZmVhdHVyZSBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvTWFwLmZlYXR1cmUKaW5kZXggOGQxMDI5Zi4uNWY0MDRlYSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9NYXAuZmVhdHVyZQorKysgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL01hcC5mZWF0dXJlCkBAIC0xMDYsMyArMTA2LDE5IEBACiAgICAgICB8IHZbam9zaF0gfAogICAgICAgfCB2W3JpcHBsZV0gfAogICAgICAgfCB2W3BldGVyXSAgfAorCisgIFNjZW5hcmlvOiBnX1ZfbWFwWGNvbnN0YW50WG51bGxYWAorICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKKyAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgorICAgICAgIiIiCisgICAgICBnLlYoKS5tYXAoX18uY29uc3RhbnQobnVsbCkpCisgICAgICAiIiIKKyAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKKyAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlIHVub3JkZXJlZAorICAgICAgfCByZXN1bHQgfAorICAgICAgfCBudWxsIHwKKyAgICAgIHwgbnVsbCB8CisgICAgICB8IG51bGwgfAorICAgICAgfCBudWxsIHwKKyAgICAgIHwgbnVsbCB8CisgICAgICB8IG51bGwgfApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvT3JkZXIuZmVhdHVyZSBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvT3JkZXIuZmVhdHVyZQppbmRleCA2YTA2ODkwLi4zYTExOGY2IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL09yZGVyLmZlYXR1cmUKKysrIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9PcmRlci5mZWF0dXJlCkBAIC01MSwyMiArNTEsNiBAQAogICAgICAgfCBqb3NoICAgfAogICAgICAgfCBsb3AgICAgfAogCi0gIFNjZW5hcmlvOiBnX1Zfb3JkZXJfYnlYbmFtZV9pbmNyWF9uYW1lCi0gICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAotICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCi0gICAgICAiIiIKLSAgICAgIGcuVigpLm9yZGVyKCkuYnkoIm5hbWUiLCBPcmRlci5pbmNyKS52YWx1ZXMoIm5hbWUiKQotICAgICAgIiIiCi0gICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0Ci0gICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSBvcmRlcmVkCi0gICAgICB8IHJlc3VsdCB8Ci0gICAgICB8IGpvc2ggfAotICAgICAgfCBsb3AgIHwKLSAgICAgIHwgbWFya28gfAotICAgICAgfCBwZXRlciB8Ci0gICAgICB8IHJpcHBsZSB8Ci0gICAgICB8IHZhZGFzICB8Ci0KICAgU2NlbmFyaW86IGdfVl9vcmRlcl9ieVhuYW1lX2FzY1hfbmFtZQogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgpAQCAtOTksMjIgKzgzLDYgQEAKICAgICAgIHwgcmlwcGxlIHwKICAgICAgIHwgdmFkYXMgIHwKIAotICBTY2VuYXJpbzogZ19WX291dEVfb3JkZXJfYnlYd2VpZ2h0X2RlY3JYX3dlaWdodAotICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKLSAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgotICAgICAgIiIiCi0gICAgICBnLlYoKS5vdXRFKCkub3JkZXIoKS5ieSgid2VpZ2h0IiwgT3JkZXIuZGVjcikudmFsdWVzKCJ3ZWlnaHQiKQotICAgICAgIiIiCi0gICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0Ci0gICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSBvcmRlcmVkCi0gICAgICB8IHJlc3VsdCB8Ci0gICAgICB8IGRbMS4wXS5kIHwKLSAgICAgIHwgZFsxLjBdLmQgfAotICAgICAgfCBkWzAuNV0uZCB8Ci0gICAgICB8IGRbMC40XS5kIHwKLSAgICAgIHwgZFswLjRdLmQgfAotICAgICAgfCBkWzAuMl0uZCB8Ci0KICAgU2NlbmFyaW86IGdfVl9vdXRFX29yZGVyX2J5WHdlaWdodF9kZXNjWF93ZWlnaHQKICAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCiAgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvUGFnZVJhbmsuZmVhdHVyZSBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvUGFnZVJhbmsuZmVhdHVyZQppbmRleCBmYTVhYWY2Li40NzlhMzA5IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL1BhZ2VSYW5rLmZlYXR1cmUKKysrIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9QYWdlUmFuay5mZWF0dXJlCkBAIC0zNCwxMSArMzQsMTEgQEAKICAgICAgIHwgdltwZXRlcl0gfAogICAgIEFuZCB0aGUgZ3JhcGggc2hvdWxkIHJldHVybiA2IGZvciBjb3VudCBvZiAiZy53aXRoQ29tcHV0ZXIoKS5WKCkucGFnZVJhbmsoKS5oYXMoXCJncmVtbGluLnBhZ2VSYW5rVmVydGV4UHJvZ3JhbS5wYWdlUmFua1wiKSIKIAotICBTY2VuYXJpbzogZ19WX291dFhjcmVhdGVkWF9wYWdlUmFua19ieVhib3RoRVhfYnlYcHJvamVjdFJhbmtYX3RpbWVzWDBYX3ZhbHVlTWFwWG5hbWVfcHJvamVjdFJhbmtYCisgIFNjZW5hcmlvOiBnX1Zfb3V0WGNyZWF0ZWRYX3BhZ2VSYW5rX3dpdGhYZWRnZXNfYm90aEVYX3dpdGhYcHJvcGVydHlOYW1lX3Byb2plY3RSYW5rWF93aXRoWHRpbWVzXzBYX3ZhbHVlTWFwWG5hbWVfcHJvamVjdFJhbmtYCiAgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAogICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCiAgICAgICAiIiIKLSAgICAgIGcud2l0aENvbXB1dGVyKCkuVigpLm91dCgiY3JlYXRlZCIpLnBhZ2VSYW5rKCkuYnkoX18uYm90aEUoKSkuYnkoInByb2plY3RSYW5rIikudGltZXMoMCkudmFsdWVNYXAoIm5hbWUiLCAicHJvamVjdFJhbmsiKQorICAgICAgZy53aXRoQ29tcHV0ZXIoKS5WKCkub3V0KCJjcmVhdGVkIikucGFnZVJhbmsoKS53aXRoKCJ+dGlua2VycG9wLnBhZ2VSYW5rLmVkZ2VzIixfXy5ib3RoRSgpKS53aXRoKCJ+dGlua2VycG9wLnBhZ2VSYW5rLnByb3BlcnR5TmFtZSIsInByb2plY3RSYW5rIikud2l0aCgifnRpbmtlcnBvcC5wYWdlUmFuay50aW1lcyIsMCkudmFsdWVNYXAoIm5hbWUiLCAicHJvamVjdFJhbmsiKQogICAgICAgIiIiCiAgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CiAgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKQEAgLTQ4LDExICs0OCwxMSBAQAogICAgICAgfCBtW3sibmFtZSI6IFsibG9wIl0sICJwcm9qZWN0UmFuayI6IFszLjBdfV0gfAogICAgICAgfCBtW3sibmFtZSI6IFsicmlwcGxlIl0sICJwcm9qZWN0UmFuayI6IFsxLjBdfV0gfAogCi0gIFNjZW5hcmlvOiBnX1ZfcGFnZVJhbmtfb3JkZXJfYnlYcGFnZVJhbmtfZGVjclhfYnlYbmFtZVhfbmFtZQorICBTY2VuYXJpbzogZ19WX3BhZ2VSYW5rX29yZGVyX2J5WHBhZ2VSYW5rX2Rlc2NYX2J5WG5hbWVYX25hbWUKICAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCiAgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKICAgICAgICIiIgotICAgICAgZy53aXRoQ29tcHV0ZXIoKS5WKCkucGFnZVJhbmsoKS5vcmRlcigpLmJ5KCJncmVtbGluLnBhZ2VSYW5rVmVydGV4UHJvZ3JhbS5wYWdlUmFuayIsIE9yZGVyLmRlY3IpLmJ5KCJuYW1lIikudmFsdWVzKCJuYW1lIikKKyAgICAgIGcud2l0aENvbXB1dGVyKCkuVigpLnBhZ2VSYW5rKCkub3JkZXIoKS5ieSgiZ3JlbWxpbi5wYWdlUmFua1ZlcnRleFByb2dyYW0ucGFnZVJhbmsiLCBPcmRlci5kZXNjKS5ieSgibmFtZSIpLnZhbHVlcygibmFtZSIpCiAgICAgICAiIiIKICAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKICAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlIG9yZGVyZWQKQEAgLTY0LDExICs2NCwxMSBAQAogICAgICAgfCBtYXJrbyAgfAogICAgICAgfCBwZXRlciAgfAogCi0gIFNjZW5hcmlvOiBnX1ZfcGFnZVJhbmtfb3JkZXJfYnlYcGFnZVJhbmtfZGVjclhfbmFtZV9saW1pdFgyWAorICBTY2VuYXJpbzogZ19WX3BhZ2VSYW5rX29yZGVyX2J5WHBhZ2VSYW5rX2Rlc2NYX25hbWVfbGltaXRYMlgKICAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCiAgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKICAgICAgICIiIgotICAgICAgZy53aXRoQ29tcHV0ZXIoKS5WKCkucGFnZVJhbmsoKS5vcmRlcigpLmJ5KCJncmVtbGluLnBhZ2VSYW5rVmVydGV4UHJvZ3JhbS5wYWdlUmFuayIsIE9yZGVyLmRlY3IpLnZhbHVlcygibmFtZSIpLmxpbWl0KDIpCisgICAgICBnLndpdGhDb21wdXRlcigpLlYoKS5wYWdlUmFuaygpLm9yZGVyKCkuYnkoImdyZW1saW4ucGFnZVJhbmtWZXJ0ZXhQcm9ncmFtLnBhZ2VSYW5rIiwgT3JkZXIuZGVzYykudmFsdWVzKCJuYW1lIikubGltaXQoMikKICAgICAgICIiIgogICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAogICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgb3JkZXJlZApAQCAtNzYsMTEgKzc2LDExIEBACiAgICAgICB8IGxvcCAgICB8CiAgICAgICB8IHJpcHBsZSB8CiAKLSAgU2NlbmFyaW86IGdfVl9wYWdlUmFua19ieVhvdXRFWGtub3dzWFhfYnlYZnJpZW5kUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYZnJpZW5kUmFua1hfbWF0aFgKKyAgU2NlbmFyaW86IGdfVl9wYWdlUmFua193aXRoWGVkZ2VzX291dEVYa25vd3NYWF93aXRoWHByb3BlcnR5TmFtZV9mcmllbmRSYW5rWF9wcm9qZWN0X2J5WG5hbWVYX2J5WHZhbHVlc1hmcmllbmRSYW5rWF9tYXRoWAogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgogICAgICAgIiIiCi0gICAgICBnLndpdGhDb21wdXRlcigpLlYoKS5wYWdlUmFuaygpLmJ5KF9fLm91dEUoImtub3dzIikpLmJ5KCJmcmllbmRSYW5rIikucHJvamVjdCgibmFtZSIsICJmcmllbmRSYW5rIikuYnkoIm5hbWUiKS5ieShfXy52YWx1ZXMoImZyaWVuZFJhbmsiKS5tYXRoKCJjZWlsKF8gKiAxMDApIikpCisgICAgICBnLndpdGhDb21wdXRlcigpLlYoKS5wYWdlUmFuaygpLndpdGgoIn50aW5rZXJwb3AucGFnZVJhbmsuZWRnZXMiLF9fLm91dEUoImtub3dzIikpLndpdGgoIn50aW5rZXJwb3AucGFnZVJhbmsucHJvcGVydHlOYW1lIiwiZnJpZW5kUmFuayIpLnByb2plY3QoIm5hbWUiLCAiZnJpZW5kUmFuayIpLmJ5KCJuYW1lIikuYnkoX18udmFsdWVzKCJmcmllbmRSYW5rIikubWF0aCgiY2VpbChfICogMTAwKSIpKQogICAgICAgIiIiCiAgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CiAgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKQEAgLTkyLDExICs5MiwxMSBAQAogICAgICAgfCBtW3sibmFtZSI6ICJyaXBwbGUiLCAiZnJpZW5kUmFuayI6IDE1LjB9XSB8CiAgICAgICB8IG1beyJuYW1lIjogInBldGVyIiwgImZyaWVuZFJhbmsiOiAxNS4wfV0gfAogCi0gIFNjZW5hcmlvOiBnX1ZfaGFzTGFiZWxYcGVyc29uWF9wYWdlUmFua19ieVhwYWdlUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYcGFnZVJhbmtYX21hdGhYCisgIFNjZW5hcmlvOiBnX1ZfaGFzTGFiZWxYcGVyc29uWF9wYWdlUmFua193aXRoWHByb3BlcnR5TmFtZV9rcGFnZVJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWHBhZ2VSYW5rWF9tYXRoWAogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgogICAgICAgIiIiCi0gICAgICBnLndpdGhDb21wdXRlcigpLlYoKS5oYXNMYWJlbCgicGVyc29uIikucGFnZVJhbmsoKS5ieSgicGFnZVJhbmsiKS5wcm9qZWN0KCJuYW1lIiwgInBhZ2VSYW5rIikuYnkoIm5hbWUiKS5ieShfXy52YWx1ZXMoInBhZ2VSYW5rIikubWF0aCgiY2VpbChfICogMTAwKSIpKQorICAgICAgZy53aXRoQ29tcHV0ZXIoKS5WKCkuaGFzTGFiZWwoInBlcnNvbiIpLnBhZ2VSYW5rKCkud2l0aCgifnRpbmtlcnBvcC5wYWdlUmFuay5wcm9wZXJ0eU5hbWUiLCJwYWdlUmFuayIpLnByb2plY3QoIm5hbWUiLCAicGFnZVJhbmsiKS5ieSgibmFtZSIpLmJ5KF9fLnZhbHVlcygicGFnZVJhbmsiKS5tYXRoKCJjZWlsKF8gKiAxMDApIikpCiAgICAgICAiIiIKICAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKICAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlIHVub3JkZXJlZApAQCAtMTA2LDExICsxMDYsMTEgQEAKICAgICAgIHwgbVt7Im5hbWUiOiAiam9zaCIsICJwYWdlUmFuayI6IDU5LjB9XSB8CiAgICAgICB8IG1beyJuYW1lIjogInBldGVyIiwgInBhZ2VSYW5rIjogNDYuMH1dIHwKIAotICBTY2VuYXJpbzogZ19WX3BhZ2VSYW5rX2J5WHBhZ2VSYW5rWF9hc1hhWF9vdXRYa25vd3NYX3BhZ2VSYW5rX2FzWGJYX3NlbGVjdFhhX2JYX2J5X2J5WG1hdGhYCisgIFNjZW5hcmlvOiBnX1ZfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcGFnZVJhbmtYX2FzWGFYX291dFhrbm93c1hfcGFnZVJhbmtfYXNYYlhfc2VsZWN0WGFfYlhfYnlfYnlYbWF0aFgKICAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCiAgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKICAgICAgICIiIgotICAgICAgZy53aXRoQ29tcHV0ZXIoKS5WKCkucGFnZVJhbmsoKS5ieSgicGFnZVJhbmsiKS5hcygiYSIpLm91dCgia25vd3MiKS52YWx1ZXMoInBhZ2VSYW5rIikuYXMoImIiKS5zZWxlY3QoImEiLCAiYiIpLmJ5KCkuYnkoX18ubWF0aCgiY2VpbChfICogMTAwKSIpKQorICAgICAgZy53aXRoQ29tcHV0ZXIoKS5WKCkucGFnZVJhbmsoKS53aXRoKCJ+dGlua2VycG9wLnBhZ2VSYW5rLnByb3BlcnR5TmFtZSIsInBhZ2VSYW5rIikuYXMoImEiKS5vdXQoImtub3dzIikudmFsdWVzKCJwYWdlUmFuayIpLmFzKCJiIikuc2VsZWN0KCJhIiwgImIiKS5ieSgpLmJ5KF9fLm1hdGgoImNlaWwoXyAqIDEwMCkiKSkKICAgICAgICIiIgogICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAogICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCkBAIC0xMTgsMTEgKzExOCwxMSBAQAogICAgICAgfCBtW3siYSI6ICJ2W21hcmtvXSIsICJiIjogMTUuMH1dIHwKICAgICAgIHwgbVt7ImEiOiAidlttYXJrb10iLCAiYiI6IDE1LjB9XSB8CiAKLSAgU2NlbmFyaW86IGdfVl9oYXNMYWJlbFhzb2Z0d2FyZVhfaGFzWG5hbWVfcmlwcGxlWF9wYWdlUmFua1gxWF9ieVhpbkVYY3JlYXRlZFhYX3RpbWVzWDFYX2J5WHByaW9yc1hfaW5YY3JlYXRlZFhfdW5pb25YYm90aF9faWRlbnRpdHlYX3ZhbHVlTWFwWG5hbWVfcHJpb3JzWAorICBTY2VuYXJpbzogZ19WX2hhc0xhYmVsWHNvZnR3YXJlWF9oYXNYbmFtZV9yaXBwbGVYX3BhZ2VSYW5rWDFYX3dpdGhYZWRnZXNfaW5FWGNyZWF0ZWRYX3dpdGhYdGltZXNfMVhfd2l0aFhwcm9wZXJ0eU5hbWVfcHJpb3JzWF9pblhjcmVhdGVkWF91bmlvblhib3RoX19pZGVudGl0eVhfdmFsdWVNYXBYbmFtZV9wcmlvcnNYCiAgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAogICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCiAgICAgICAiIiIKLSAgICAgIGcud2l0aENvbXB1dGVyKCkuVigpLmhhc0xhYmVsKCJzb2Z0d2FyZSIpLmhhcygibmFtZSIsICJyaXBwbGUiKS5wYWdlUmFuaygxLjApLmJ5KF9fLmluRSgiY3JlYXRlZCIpKS50aW1lcygxKS5ieSgicHJpb3JzIikuaW4oImNyZWF0ZWQiKS51bmlvbihfXy5ib3RoKCksIF9fLmlkZW50aXR5KCkpLnZhbHVlTWFwKCJuYW1lIiwgInByaW9ycyIpCisgICAgICBnLndpdGhDb21wdXRlcigpLlYoKS5oYXNMYWJlbCgic29mdHdhcmUiKS5oYXMoIm5hbWUiLCAicmlwcGxlIikucGFnZVJhbmsoMS4wKS53aXRoKCJ+dGlua2VycG9wLnBhZ2VSYW5rLmVkZ2VzIixfXy5pbkUoImNyZWF0ZWQiKSkud2l0aCgifnRpbmtlcnBvcC5wYWdlUmFuay50aW1lcyIsMSkud2l0aCgifnRpbmtlcnBvcC5wYWdlUmFuay5wcm9wZXJ0eU5hbWUiLCJwcmlvcnMiKS5pbigiY3JlYXRlZCIpLnVuaW9uKF9fLmJvdGgoKSwgX18uaWRlbnRpdHkoKSkudmFsdWVNYXAoIm5hbWUiLCAicHJpb3JzIikKICAgICAgICIiIgogICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAogICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCkBAIC0xMzIsMTcgKzEzMiwxMSBAQAogICAgICAgfCBtW3sibmFtZSI6IFsibG9wIl0sICJwcmlvcnMiOiBbMC4wXX1dIHwKICAgICAgIHwgbVt7Im5hbWUiOiBbInJpcHBsZSJdLCAicHJpb3JzIjogWzAuMF19XSB8CiAKLSAgU2NlbmFyaW86IGdfVl9vdXRYY3JlYXRlZFhfZ3JvdXBYbVhfYnlYbGFiZWxYX3BhZ2VSYW5rWDFYX2J5WHBhZ2VSYW5rWF9ieVhpbkVYX3RpbWVzWDFYX2luWGNyZWF0ZWRYX2dyb3VwWG1YX2J5WHBhZ2VSYW5rWF9jYXBYbVgKKyAgU2NlbmFyaW86IGdfVl9vdXRYY3JlYXRlZFhfZ3JvdXBYbVhfYnlYbGFiZWxYX3BhZ2VSYW5rWDFYX3dpdGhYcHJvcGVydHlOYW1lX3BhZ2VSYW5rWF93aXRoWGVkZ2VzX2luRVhfd2l0aFh0aW1lc18xWF9pblhjcmVhdGVkWF9ncm91cFhtWF9ieVhwYWdlUmFua1hfY2FwWG1YCiAgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAogICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCiAgICAgICAiIiIKLSAgICAgIGcud2l0aENvbXB1dGVyKCkuVigpLm91dCgiY3JlYXRlZCIpLmdyb3VwKCJtIikuYnkoVC5sYWJlbCkucGFnZVJhbmsoMS4wKS5ieSgicGFnZVJhbmsiKS5ieShfXy5pbkUoKSkudGltZXMoMSkuaW4oImNyZWF0ZWQiKS5ncm91cCgibSIpLmJ5KCJwYWdlUmFuayIpLmNhcCgibSIpCisgICAgICBnLndpdGhDb21wdXRlcigpLlYoKS5vdXQoImNyZWF0ZWQiKS5ncm91cCgibSIpLmJ5KFQubGFiZWwpLnBhZ2VSYW5rKDEuMCkud2l0aCgifnRpbmtlcnBvcC5wYWdlUmFuay5wcm9wZXJ0eU5hbWUiLCAicGFnZVJhbmsiKS53aXRoKCJ+dGlua2VycG9wLnBhZ2VSYW5rLmVkZ2VzIixfXy5pbkUoKSkud2l0aCgifnRpbmtlcnBvcC5wYWdlUmFuay50aW1lcyIsIDEpLmluKCJjcmVhdGVkIikuZ3JvdXAoIm0iKS5ieSgicGFnZVJhbmsiKS5jYXAoIm0iKQogICAgICAgIiIiCiAgICAgV2hlbiBpdGVyYXRlZCBuZXh0Ci0gICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBoYXZlIGEgY291bnQgb2YgMwotCi0gICAgIyBUT0RPOiB3b3VsZCByZWFsbHkgbGlrZSB0byBoYXZlIGEgZnVsbCBhc3NlcnRpb24gaGVyZSwgYnV0IHdpdGhDb21wdXRlcigpIG1ha2VzIHN0dWZmIG5vdCBhbHdheXMgcmV0dXJuIGluIG9yZGVyLgotICAgICMgb3JkZXIgY291bGQgYmUgZm9yY2VkLCBidXQgdGhhdCBqdXN0IGJ1bGtzIHVwIHRoZSB0ZXN0LiB3ZSBjb3VsZCB3cml0ZSBiZXR0ZXIgYXNzZXJ0aW9uIGxvZ2ljIGJ1dCB0aGF0IG1ha2VzIGl0Ci0gICAgIyBoYXJkZXIgZm9yIEdMVnMgdG8gYmUgdGVzdGVkLiAgCi0gICAgIyAgfCByZXN1bHQgfAotICAgICMgIHwgbVt7ImRbMS4wXS5kIjoibFt2W21hcmtvXSx2W21hcmtvXSx2W21hcmtvXSx2W3BldGVyXSx2W3BldGVyXSx2W3BldGVyXV0iLCJkWzIuMF0uZCI6Imxbdltqb3NoXSx2W2pvc2hdLHZbam9zaF0sdltqb3NoXV0iLCJzb2Z0d2FyZSI6Imxbdltsb3BdLHZbbG9wXSx2W2xvcF0sdltyaXBwbGVdXSJ9XSB8CisgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBoYXZlIGEgY291bnQgb2YgMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvUGVlclByZXNzdXJlLmZlYXR1cmUgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL1BlZXJQcmVzc3VyZS5mZWF0dXJlCmluZGV4IDgxY2E2ZjguLjRiNzMzMDAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvUGVlclByZXNzdXJlLmZlYXR1cmUKKysrIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9QZWVyUHJlc3N1cmUuZmVhdHVyZQpAQCAtMzQsMzQgKzM0LDE4IEBACiAgICAgICB8IHZbcGV0ZXJdIHwKICAgICBBbmQgdGhlIGdyYXBoIHNob3VsZCByZXR1cm4gNiBmb3IgY291bnQgb2YgImcud2l0aENvbXB1dGVyKCkuVigpLnBlZXJQcmVzc3VyZSgpLmhhcyhcImdyZW1saW4ucGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbS5jbHVzdGVyXCIpIgogCi0gIFNjZW5hcmlvOiBnX1ZfcGVlclByZXNzdXJlX2J5WGNsdXN0ZXJYX2J5WG91dEVYa25vd3NYWF9wYWdlUmFua1gxWF9ieVhyYW5rWF9ieVhvdXRFWGtub3dzWFhfdGltZXNYMlhfZ3JvdXBfYnlYY2x1c3RlclhfYnlYcmFua19zdW1YX2xpbWl0WDEwMFgKKyAgU2NlbmFyaW86IGdfVl9wZWVyUHJlc3N1cmVfd2l0aFhwcm9wZXJ0eU5hbWVfY2x1c3Rlclhfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfcGFnZVJhbmtYMVhfYnlYcmFua1hfd2l0aFhlZGdlc19vdXRFWGtub3dzWF93aXRoWHRpbWVzXzJYX2dyb3VwX2J5WGNsdXN0ZXJYX2J5WHJhbmtfc3VtWF9saW1pdFgxMDBYCiAgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAogICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCiAgICAgICAiIiIKLSAgICAgIGcud2l0aENvbXB1dGVyKCkuVigpLnBlZXJQcmVzc3VyZSgpLmJ5KCJjbHVzdGVyIikuYnkoX18ub3V0RSgia25vd3MiKSkucGFnZVJhbmsoMS4wKS5ieSgicmFuayIpLmJ5KF9fLm91dEUoImtub3dzIikpLnRpbWVzKDEpLmdyb3VwKCkuYnkoImNsdXN0ZXIiKS5ieShfXy52YWx1ZXMoInJhbmsiKS5zdW0oKSkubGltaXQoMTAwKQorICAgICAgZy53aXRoQ29tcHV0ZXIoKS5WKCkucGVlclByZXNzdXJlKCkud2l0aCgifnRpbmtlcnBvcC5wZWVyUHJlc3N1cmUucHJvcGVydHlOYW1lIiwiY2x1c3RlciIpLndpdGgoIn50aW5rZXJwb3AucGVlclByZXNzdXJlLmVkZ2VzIixfXy5vdXRFKCJrbm93cyIpKS5wYWdlUmFuaygxLjApLndpdGgoIn50aW5rZXJwb3AucGFnZVJhbmsucHJvcGVydHlOYW1lIiwgInJhbmsiKS53aXRoKCJ+dGlua2VycG9wLnBhZ2VSYW5rLmVkZ2VzIiwgX18ub3V0RSgia25vd3MiKSkud2l0aCgifnRpbmtlcnBvcC5wYWdlUmFuay50aW1lcyIsIDEpLmdyb3VwKCkuYnkoImNsdXN0ZXIiKS5ieShfXy52YWx1ZXMoInJhbmsiKS5zdW0oKSkubGltaXQoMTAwKQogICAgICAgIiIiCiAgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CiAgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKICAgICAgIHwgcmVzdWx0IHwKICAgICAgIHwgbVt7ImRbMV0uaSI6ImRbMC41ODMzMzMzMzMzMzMzMzMzXS5kIiwiZFszXS5pIjoiZFswLjEzODg4ODg4ODg4ODg4ODldLmQiLCJkWzVdLmkiOiJkWzAuMTM4ODg4ODg4ODg4ODg4OV0uZCIsImRbNl0uaSI6ImRbMC4xMzg4ODg4ODg4ODg4ODg5XS5kIn1dIHwKIAotICBTY2VuYXJpbzogZ19WX2hhc1huYW1lX3JpcHBsZVhfaW5YY3JlYXRlZFhfcGVlclByZXNzdXJlX2J5WG91dEVYX2J5WGNsdXN0ZXJYX3JlcGVhdFh1bmlvblhpZGVudGl0eV9fYm90aFhfdGltZXNYMlhfZGVkdXBfdmFsdWVNYXBYbmFtZV9jbHVzdGVyWAotICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKLSAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgotICAgICAgIiIiCi0gICAgICBnLndpdGhDb21wdXRlcigpLlYoKS5oYXMoIm5hbWUiLCAicmlwcGxlIikuaW4oImNyZWF0ZWQiKS5wZWVyUHJlc3N1cmUoKS5ieShfXy5vdXRFKCkpLmJ5KCJjbHVzdGVyIikucmVwZWF0KF9fLnVuaW9uKF9fLmlkZW50aXR5KCksIF9fLmJvdGgoKSkpLnRpbWVzKDIpLmRlZHVwKCkudmFsdWVNYXAoIm5hbWUiLCAiY2x1c3RlciIpCi0gICAgICAiIiIKLSAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKLSAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlIHVub3JkZXJlZAotICAgICAgfCByZXN1bHQgfAotICAgICAgfCBtW3sibmFtZSI6IFsibWFya28iXSwgImNsdXN0ZXIiOiBbMV19XSB8Ci0gICAgICB8IG1beyJuYW1lIjogWyJ2YWRhcyJdLCAiY2x1c3RlciI6IFsyXX1dIHwKLSAgICAgIHwgbVt7Im5hbWUiOiBbImxvcCJdLCAiY2x1c3RlciI6IFs0XX1dIHwKLSAgICAgIHwgbVt7Im5hbWUiOiBbImpvc2giXSwgImNsdXN0ZXIiOiBbNF19XSB8Ci0gICAgICB8IG1beyJuYW1lIjogWyJyaXBwbGUiXSwgImNsdXN0ZXIiOiBbNF19XSB8Ci0gICAgICB8IG1beyJuYW1lIjogWyJwZXRlciJdLCAiY2x1c3RlciI6IFs2XX1dIHwKLQotICBTY2VuYXJpbzogZ19WX2hhc1huYW1lX3JpcHBsZVhfaW5YY3JlYXRlZFhfcGVlclByZXNzdXJlX3dpdGhYRURHRVNfb3V0RVhfd2l0aFhQUk9QRVJUWV9OQU1FX2NsdXN0ZXJYX3JlcGVhdFh1bmlvblhpZGVudGl0eV9fYm90aFhfdGltZXNYMlhfZGVkdXBfdmFsdWVNYXBYbmFtZV9jbHVzdGVyWAorICBTY2VuYXJpbzogZ19WX2hhc1huYW1lX3JpcHBsZVhfaW5YY3JlYXRlZFhfcGVlclByZXNzdXJlX3dpdGhYZWRnZXNfb3V0RVhfd2l0aHlYcHJvcGVydHlOYW1lX2NsdXN0ZXJYX3JlcGVhdFh1bmlvblhpZGVudGl0eV9fYm90aFhfdGltZXNYMlhfZGVkdXBfdmFsdWVNYXBYbmFtZV9jbHVzdGVyWAogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgogICAgICAgIiIiCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL1NlbGVjdC5mZWF0dXJlIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL21hcC9TZWxlY3QuZmVhdHVyZQppbmRleCBiZTFhODk5Li44Yzc1OWQ2IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvbWFwL1NlbGVjdC5mZWF0dXJlCisrKyBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9tYXAvU2VsZWN0LmZlYXR1cmUKQEAgLTE4NSw5ICsxODUsMTAgQEAKIAogICBTY2VuYXJpbzogZ19WX2Nob29zZVhvdXRFX2NvdW50X2lzWDBYX19hc1hhWF9fYXNYYlhYX2Nob29zZVhzZWxlY3RYYVhfX3NlbGVjdFhhWF9fc2VsZWN0WGJYWAogICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKKyAgICBBbmQgdXNpbmcgdGhlIHBhcmFtZXRlciB6ZXJvIGRlZmluZWQgYXMgImRbMF0ubCIKICAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgogICAgICAgIiIiCi0gICAgICBnLlYoKS5jaG9vc2UoX18ub3V0RSgpLmNvdW50KCkuaXMoMEwpLAorICAgICAgZy5WKCkuY2hvb3NlKF9fLm91dEUoKS5jb3VudCgpLmlzKHplcm8pLAogICAgICAgICAgICAgICAgICAgIF9fLmFzKCJhIiksCiAgICAgICAgICAgICAgICAgICAgX18uYXMoImIiKSkuCiAgICAgICAgICAgICBjaG9vc2UoX18uc2VsZWN0KCJhIiksCkBAIC03NDMsMyArNzQ0LDI3IEBACiAgICAgICB8IHNbYSxiXSB8CiAgICAgICB8IHNbY10gICB8CiAgICAgQW5kIHRoZSBncmFwaCBzaG91bGQgcmV0dXJuIDYgZm9yIGNvdW50IG9mICJnLlYoKS5hcyhcImFcIiwgXCJiXCIpLm91dCgpLmFzKFwiY1wiKS5wYXRoKCkuc2VsZWN0KENvbHVtbi5rZXlzKSIKKworICBTY2VuYXJpbzogZ19FWDExWF9wcm9wZXJ0aWVzWHdlaWdodFhfYXNYYVhfc2VsZWN0WGFYX2J5WGtleVgKKyAgICBHaXZlbiB0aGUgbW9kZXJuIGdyYXBoCisgICAgQW5kIHVzaW5nIHRoZSBwYXJhbWV0ZXIgZTExSWQgZGVmaW5lZCBhcyAiZVtqb3NoLWNyZWF0ZWQtPmxvcF0uaWQiCisgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKKyAgICAgICIiIgorICAgICAgZy5FKGUxMUlkKS5wcm9wZXJ0aWVzKCJ3ZWlnaHQiKS5hcygiYSIpLnNlbGVjdCgiYSIpLmJ5KFQua2V5KQorICAgICAgIiIiCisgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CisgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKKyAgICAgIHwgcmVzdWx0IHwKKyAgICAgIHwgd2VpZ2h0IHwKKworICBTY2VuYXJpbzogZ19FWDExWF9wcm9wZXJ0aWVzWHdlaWdodFhfYXNYYVhfc2VsZWN0WGFYX2J5WHZhbHVlWAorICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKKyAgICBBbmQgdXNpbmcgdGhlIHBhcmFtZXRlciBlMTFJZCBkZWZpbmVkIGFzICJlW2pvc2gtY3JlYXRlZC0+bG9wXS5pZCIKKyAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgorICAgICAgIiIiCisgICAgICBnLkUoZTExSWQpLnByb3BlcnRpZXMoIndlaWdodCIpLmFzKCJhIikuc2VsZWN0KCJhIikuYnkoVC52YWx1ZSkKKyAgICAgICIiIgorICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAorICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCisgICAgICB8IHJlc3VsdCB8CisgICAgICB8IGRbMC40XS5kIHwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvc2lkZUVmZmVjdC9Hcm91cC5mZWF0dXJlIGIvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL3NpZGVFZmZlY3QvR3JvdXAuZmVhdHVyZQppbmRleCBlNjliNDQ3Li5hNGE1NTAwIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvc2lkZUVmZmVjdC9Hcm91cC5mZWF0dXJlCisrKyBiL2dyZW1saW4tdGVzdC9mZWF0dXJlcy9zaWRlRWZmZWN0L0dyb3VwLmZlYXR1cmUKQEAgLTI4LDYgKzI4LDE3IEBACiAgICAgICB8IHJlc3VsdCB8CiAgICAgICB8IG1beyJyaXBwbGUiOiJsW3ZbcmlwcGxlXV0iLCAicGV0ZXIiOiJsW3ZbcGV0ZXJdXSIsICJ2YWRhcyI6Imxbdlt2YWRhc11dIiwgImpvc2giOiAibFt2W2pvc2hdXSIsICJsb3AiOiJsW3ZbbG9wXV0iLCAibWFya28iOiJsW3ZbbWFya29dXSJ9XSB8CiAKKyAgU2NlbmFyaW86IGdfVl9ncm91cF9ieVhhZ2VYCisgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAorICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCisgICAgICAiIiIKKyAgICAgIGcuVigpLmdyb3VwKCkuYnkoImFnZSIpCisgICAgICAiIiIKKyAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKKyAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlIHVub3JkZXJlZAorICAgICAgfCByZXN1bHQgfAorICAgICAgfCBtW3sibnVsbCI6Imxbdltsb3BdLHZbcmlwcGxlXV0iLCAiZFszNV0uaSI6ImxbdltwZXRlcl1dIiwgImRbMjddLmkiOiJsW3ZbdmFkYXNdXSIsICJkWzMyXS5pIjogImxbdltqb3NoXV0iLCAiZFsyOV0uaSI6ImxbdlttYXJrb11dIn1dIHwKKwogICBTY2VuYXJpbzogZ19WX2dyb3VwX2J5WG5hbWVYX2J5CiAgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAogICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCkBAIC0yNjIsMyArMjczLDI1IEBACiAgICAgICB8IHJlc3VsdCB8CiAgICAgICB8IG1beyJyaXBwbGUiOiJkWzMyXS5sIiwgImxvcCI6ImRbOTZdLmwifV0gfAogCisKKyAgU2NlbmFyaW86IGdfVl9ncm91cF9ieVhsYWJlbFhfYnlYbGFiZWxfY291bnRYCisgICAgR2l2ZW4gdGhlIG1vZGVybiBncmFwaAorICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCisgICAgICAiIiIKKyAgICAgIGcuVigpLmdyb3VwKCkuYnkoX18ubGFiZWwoKSkuYnkoX18ubGFiZWwoKS5jb3VudCgpKQorICAgICAgIiIiCisgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CisgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKKyAgICAgIHwgcmVzdWx0IHwKKyAgICAgIHwgbVt7InNvZnR3YXJlIjoiZFsyXS5sIiwgInBlcnNvbiI6ImRbNF0ubCJ9XSB8CisKKyAgU2NlbmFyaW86IGdfVl9ncm91cFhtWF9ieVhsYWJlbFhfYnlYbGFiZWxfY291bnRYX2NhcFhtWAorICAgIEdpdmVuIHRoZSBtb2Rlcm4gZ3JhcGgKKyAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgorICAgICAgIiIiCisgICAgICBnLlYoKS5ncm91cCgibSIpLmJ5KF9fLmxhYmVsKCkpLmJ5KF9fLmxhYmVsKCkuY291bnQoKSkuY2FwKCJtIikKKyAgICAgICIiIgorICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAorICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCisgICAgICB8IHJlc3VsdCB8CisgICAgICB8IG1beyJzb2Z0d2FyZSI6ImRbMl0ubCIsICJwZXJzb24iOiJkWzRdLmwifV0gfApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L2ZlYXR1cmVzL3NpZGVFZmZlY3QvSW5qZWN0LmZlYXR1cmUgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvc2lkZUVmZmVjdC9JbmplY3QuZmVhdHVyZQppbmRleCA3NDA5MjhkLi4yMGQ2YmQyIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3QvZmVhdHVyZXMvc2lkZUVmZmVjdC9JbmplY3QuZmVhdHVyZQorKysgYi9ncmVtbGluLXRlc3QvZmVhdHVyZXMvc2lkZUVmZmVjdC9JbmplY3QuZmVhdHVyZQpAQCAtNjYsMyArNjYsNDIgQEAKICAgICAgIHwgbG9wICAgfAogICAgICAgfCB2YWRhcyB8CiAgICAgICB8IGpvc2ggIHwKKworICBTY2VuYXJpbzogZ19pbmplY3RYbnVsbF8xXzNfbnVsbFgKKyAgICBHaXZlbiB0aGUgZW1wdHkgZ3JhcGgKKyAgICBBbmQgdGhlIHRyYXZlcnNhbCBvZgorICAgICAgIiIiCisgICAgICBnLmluamVjdChudWxsLCAxLCAzLCBudWxsKQorICAgICAgIiIiCisgICAgV2hlbiBpdGVyYXRlZCB0byBsaXN0CisgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSB1bm9yZGVyZWQKKyAgICAgIHwgcmVzdWx0IHwKKyAgICAgIHwgbnVsbCB8CisgICAgICB8IGRbMV0uaSB8CisgICAgICB8IGRbM10uaSB8CisgICAgICB8IG51bGwgfAorCisgIFNjZW5hcmlvOiBnX2luamVjdFgxMF8yMF9udWxsXzIwXzEwXzEwWF9ncm91cENvdW50WHhYX2RlZHVwX2FzWHlYX3Byb2plY3RYYV9iWF9ieV9ieVhzZWxlY3RYeFhfc2VsZWN0WHNlbGVjdFh5WFhYCisgICAgR2l2ZW4gdGhlIGVtcHR5IGdyYXBoCisgICAgQW5kIHRoZSB0cmF2ZXJzYWwgb2YKKyAgICAgICIiIgorICAgICAgZy5pbmplY3QoMTAsMjAsbnVsbCwyMCwxMCwxMCkuZ3JvdXBDb3VudCgieCIpLmRlZHVwKCkuYXMoInkiKS5wcm9qZWN0KCJhIiwiYiIpLmJ5KCkuYnkoX18uc2VsZWN0KCJ4Iikuc2VsZWN0KF9fLnNlbGVjdCgieSIpKSkKKyAgICAgICIiIgorICAgIFdoZW4gaXRlcmF0ZWQgdG8gbGlzdAorICAgIFRoZW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgdW5vcmRlcmVkCisgICAgICB8IHJlc3VsdCB8CisgICAgICB8IG1beyJhIjoiZFsxMF0uaSIsICJiIjoiZFszXS5sIn1dIHwKKyAgICAgIHwgbVt7ImEiOiJkWzIwXS5pIiwgImIiOiJkWzJdLmwifV0gfAorICAgICAgfCBtW3siYSI6bnVsbCwgImIiOiJkWzFdLmwifV0gfAorCisgIFNjZW5hcmlvOiBnX2luamVjdFhuYW1lX21hcmtvX2FnZV9udWxsWF9zZWxlY3RYbmFtZV9hZ2VYCisgICAgR2l2ZW4gdGhlIGVtcHR5IGdyYXBoCisgICAgQW5kIHVzaW5nIHRoZSBwYXJhbWV0ZXIgbSBkZWZpbmVkIGFzICJtW3tcIm5hbWVcIjpcIm1hcmtvXCIsIFwiYWdlXCI6bnVsbH1dIgorICAgIEFuZCB0aGUgdHJhdmVyc2FsIG9mCisgICAgICAiIiIKKyAgICAgIGcuaW5qZWN0KG0pLnNlbGVjdCgibmFtZSIsImFnZSIpCisgICAgICAiIiIKKyAgICBXaGVuIGl0ZXJhdGVkIHRvIGxpc3QKKyAgICBUaGVuIHRoZSByZXN1bHQgc2hvdWxkIGJlIHVub3JkZXJlZAorICAgICAgfCByZXN1bHQgfAorICAgICAgfCBtW3sibmFtZSI6Im1hcmtvIiwgImFnZSI6bnVsbH1dIHwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3QvcG9tLnhtbCBiL2dyZW1saW4tdGVzdC9wb20ueG1sCmluZGV4IDNkNzM3YmMuLmQ5ZWZiY2EgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9wb20ueG1sCisrKyBiL2dyZW1saW4tdGVzdC9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnRpbmtlcnBvcDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tdGVzdDwvYXJ0aWZhY3RJZD4KICAgICA8bmFtZT5BcGFjaGUgVGlua2VyUG9wIDo6IEdyZW1saW4gVGVzdDwvbmFtZT4KQEAgLTQ1LDEzICs0NSwxOCBAQAogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtYWxsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3Q8L2FydGlmYWN0SWQ+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgogICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5rZXJieTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmtlcmItc2ltcGxla2RjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICA8L2RlcGVuZGVuY2llcz4KICAgICA8YnVpbGQ+CiAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQ8L2RpcmVjdG9yeT4KQEAgLTc3LDYgKzgyLDI0IEBACiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8IS0tTmVlZGVkIGZvciBkb2NrZXIvZ3JlbWxpbi1zZXJ2ZXIuc2gtLT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgorICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8L3BsdWdpbnM+CiAgICAgPC9idWlsZD4KIApAQCAtOTYsNyArMTE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXRlc3QucHJvcGVydGllc30gLURidWlsZC5kaXI9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gLURpcy50ZXN0aW5nPXRydWUgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXRlc3QucHJvcGVydGllc30gLURidWlsZC5kaXI9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gLURpcy50ZXN0aW5nPXRydWUgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZSAke3N1cmVzYWZlQXJnc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FyZ0xpbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5UcmF2ZXJzYWxJbnRlcnJ1cHRpb25UZXN0LmphdmE8L2V4Y2x1ZGU+CmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL0Fic3RyYWN0RmlsZUdyYXBoUHJvdmlkZXIuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vQWJzdHJhY3RGaWxlR3JhcGhQcm92aWRlci5qYXZhCmluZGV4IDE4ZTlhMGQuLmNlZGJmMzggMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vQWJzdHJhY3RGaWxlR3JhcGhQcm92aWRlci5qYXZhCisrKyBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vQWJzdHJhY3RGaWxlR3JhcGhQcm92aWRlci5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uU3RvcmFnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncmFwaHNvbi5HcmFwaFNPTlJlc291cmNlQWNjZXNzOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9BYnN0cmFjdEdyYXBoUHJvdmlkZXIuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vQWJzdHJhY3RHcmFwaFByb3ZpZGVyLmphdmEKaW5kZXggM2VjMmFiMS4uY2MyZGY0MSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9BYnN0cmFjdEdyYXBoUHJvdmlkZXIuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL0Fic3RyYWN0R3JhcGhQcm92aWRlci5qYXZhCkBAIC0yMyw4ICsyMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uSW9SZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncnlvLkdyeW9JbzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5ncnlvLkdyeW9SZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5HcmFwaEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uZ3J5by5HcnlvUmVzb3VyY2VBY2Nlc3M7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vQWJzdHJhY3RHcmVtbGluVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9BYnN0cmFjdEdyZW1saW5UZXN0LmphdmEKaW5kZXggZjA2OWExMi4uY2NiOGFkMyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9BYnN0cmFjdEdyZW1saW5UZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9BYnN0cmFjdEdyZW1saW5UZXN0LmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWw7CmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL0dyYXBoTWFuYWdlci5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9HcmFwaE1hbmFnZXIuamF2YQppbmRleCA3NTA2MjI2Li5hMGViOWY2IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL0dyYXBoTWFuYWdlci5qYXZhCisrKyBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vR3JhcGhNYW5hZ2VyLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbEVuZ2luZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWd5OwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9HcmFwaFByb3ZpZGVyLmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL0dyYXBoUHJvdmlkZXIuamF2YQppbmRleCBlZmUyNzBhLi5kYTgxZTE1IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL0dyYXBoUHJvdmlkZXIuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL0dyYXBoUHJvdmlkZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW47CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5HcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsU3RyYXRlZ3k7CkBAIC0xMTYsOCArMTE2LDcgQEAKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEdyYXBofSBpbnN0YW5jZSB1c2luZyB0aGUgZGVmYXVsdAotICAgICAqIHtAY29kZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9ufSBmcm9tCi0gICAgICoge0BsaW5rICNzdGFuZGFyZEdyYXBoQ29uZmlndXJhdGlvbihDbGFzcywgU3RyaW5nLCBMb2FkR3JhcGhXaXRoLkdyYXBoRGF0YSl9LgorICAgICAqIHtAY29kZSBDb25maWd1cmF0aW9ufSBmcm9tIHtAbGluayAjc3RhbmRhcmRHcmFwaENvbmZpZ3VyYXRpb24oQ2xhc3MsIFN0cmluZywgTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEpfS4KICAgICAgKi8KICAgICBkZWZhdWx0IHB1YmxpYyBHcmFwaCBzdGFuZGFyZFRlc3RHcmFwaChmaW5hbCBDbGFzczw/PiB0ZXN0LCBmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUsIGZpbmFsIExvYWRHcmFwaFdpdGguR3JhcGhEYXRhIGxvYWRHcmFwaFdpdGgpIHsKICAgICAgICAgcmV0dXJuIEdyYXBoRmFjdG9yeS5vcGVuKHN0YW5kYXJkR3JhcGhDb25maWd1cmF0aW9uKHRlc3QsIHRlc3RNZXRob2ROYW1lLCBsb2FkR3JhcGhXaXRoKSk7CkBAIC0xNDYsMTEgKzE0NSwxMSBAQAogICAgIC8qKgogICAgICAqIElmIHBvc3NpYmxlICh1c3VhbGx5IHdpdGggcGVyc2lzdGVkIGdyYXBoKSBjbGVhciB0aGUgc3BhY2Ugb24gZGlzayBnaXZlbiB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdvdWxkIGJlIHVzZWQKICAgICAgKiB0byBjb25zdHJ1Y3QgdGhlIGdyYXBoLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNhbGxzCi0gICAgICoge0BsaW5rICNjbGVhcihHcmFwaCwgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbil9IHdpdGgKKyAgICAgKiB7QGxpbmsgI2NsZWFyKEdyYXBoLCBDb25maWd1cmF0aW9uKX0gd2l0aAogICAgICAqIGEgbnVsbCBncmFwaCBhcmd1bWVudC4KICAgICAgKiA8cC8+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VwdCBhbiBhcmd1bWVudCBvZiBudWxsIGZvciB0aGUge0Bjb2RlIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb259Ci0gICAgICogYXMgd2VsbCwgYW5kIGEgcHJvcGVyIGhhbmRsaW5nIGlzIG5lZWRlZC4gT3RoZXJ3aXNlLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIG1heSBiZSB0aHJvd24uCisgICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VwdCBhbiBhcmd1bWVudCBvZiBudWxsIGZvciB0aGUge0Bjb2RlIENvbmZpZ3VyYXRpb259IGFzIHdlbGwsIGFuZCBhCisgICAgICogcHJvcGVyIGhhbmRsaW5nIGlzIG5lZWRlZC4gT3RoZXJ3aXNlLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIG1heSBiZSB0aHJvd24uCiAgICAgICovCiAgICAgcHVibGljIGRlZmF1bHQgdm9pZCBjbGVhcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjbGVhcihudWxsLCBjb25maWd1cmF0aW9uKTsKQEAgLTE2Niw4ICsxNjUsOCBAQAogICAgICAqIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBpcyBhIGNsZWFyIGdpdmVuIHRoZSBjb25maWd1cmF0aW9uLiAgVGhlIG1ldGhvZCB3aWxsIHR5cGljYWxseSBiZSBjYWxsZWQgdGhpcyB3YXkKICAgICAgKiBhcyBjbGVhbiB1cCB0YXNrIG9uIHNldHVwIHRvIGVuc3VyZSB0aGF0IGEgcGVyc2lzdGVkIGdyYXBoIGhhcyBhIGNsZWFyIHNwYWNlIHRvIGNyZWF0ZSBhIHRlc3QgZ3JhcGguCiAgICAgICogPHAvPgotICAgICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgYmUgYWJsZSB0byBhY2NlcHQgYW4gYXJndW1lbnQgb2YgbnVsbCBmb3IgdGhlIHtAY29kZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9ufQotICAgICAqIGFzIHdlbGwsIGFuZCBhIHByb3BlciBoYW5kbGluZyBpcyBuZWVkZWQuIE90aGVyd2lzZSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duLgorICAgICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgYmUgYWJsZSB0byBhY2NlcHQgYW4gYXJndW1lbnQgb2YgbnVsbCBmb3IgdGhlIHtAY29kZSBDb25maWd1cmF0aW9ufSBhcyB3ZWxsLCBhbmQgYQorICAgICAqIHByb3BlciBoYW5kbGluZyBpcyBuZWVkZWQuIE90aGVyd2lzZSwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duLgogICAgICAqIDxwLz4KICAgICAgKiBDYWxscyB0byB0aGlzIG1ldGhvZCBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgZm9yIGEgc3BlY2lmaWMgdGVzdC4gRGV2ZWxvcCB0aGlzIG1ldGhvZCB0byBiZSBpZGVtcG90ZW50LgogICAgICAqLwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9hbGdvcml0aG0vZ2VuZXJhdG9yL0NvbW11bml0eUdlbmVyYXRvclRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vYWxnb3JpdGhtL2dlbmVyYXRvci9Db21tdW5pdHlHZW5lcmF0b3JUZXN0LmphdmEKaW5kZXggZjhlNWNhZC4uMmJhNTg3NCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9hbGdvcml0aG0vZ2VuZXJhdG9yL0NvbW11bml0eUdlbmVyYXRvclRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2FsZ29yaXRobS9nZW5lcmF0b3IvQ29tbXVuaXR5R2VuZXJhdG9yVGVzdC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5hbGdvcml0aG0uZ2VuZXJhdG9yOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkFic3RyYWN0R3JlbWxpblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5GZWF0dXJlUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5GZWF0dXJlUmVxdWlyZW1lbnRTZXQ7CmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2FsZ29yaXRobS9nZW5lcmF0b3IvRGlzdHJpYnV0aW9uR2VuZXJhdG9yVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9hbGdvcml0aG0vZ2VuZXJhdG9yL0Rpc3RyaWJ1dGlvbkdlbmVyYXRvclRlc3QuamF2YQppbmRleCA4YTI4NDJmLi4zNzZlOGJiIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2FsZ29yaXRobS9nZW5lcmF0b3IvRGlzdHJpYnV0aW9uR2VuZXJhdG9yVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vYWxnb3JpdGhtL2dlbmVyYXRvci9EaXN0cmlidXRpb25HZW5lcmF0b3JUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmFsZ29yaXRobS5nZW5lcmF0b3I7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uQWJzdHJhY3RHcmVtbGluVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkZlYXR1cmVSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkZlYXR1cmVSZXF1aXJlbWVudFNldDsKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vanNyMjIzL0dyZW1saW5FbmFibGVkU2NyaXB0RW5naW5lVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9qc3IyMjMvR3JlbWxpbkVuYWJsZWRTY3JpcHRFbmdpbmVUZXN0LmphdmEKaW5kZXggN2QxZTBhNy4uMWZmNzFkNCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9qc3IyMjMvR3JlbWxpbkVuYWJsZWRTY3JpcHRFbmdpbmVUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9qc3IyMjMvR3JlbWxpbkVuYWJsZWRTY3JpcHRFbmdpbmVUZXN0LmphdmEKQEAgLTM4LDcgKzM4LDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmpzcjIyMy5HcmVtbGluU2NyaXB0RW5naW5lU3VpdGUuRU5HSU5FX1RPX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLkFueU9mLmFueU9mOwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVGhhdDsKQEAgLTE2MywxMiArMTYyLDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBHcmFwaFRyYXZlcnNhbDxWZXJ0ZXgsIExvbmc+IGdldFRyYXZlcnNhbFdpdGhMYW1iZGEoZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZykgewotICAgICAgICBhc3N1bWVUaGF0KCJUaGlzIHRlc3QgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgU2NyaXB0RW5naW5lOiAiICsgRU5HSU5FX1RPX1RFU1QsIEVOR0lORV9UT19URVNULAotICAgICAgICAgICAgICAgIGFueU9mKGlzKCJncmVtbGluLXB5dGhvbiIpLCBpcygiZ3JlbWxpbi1qeXRob24iKSwgaXMoImdyZW1saW4tZ3Jvb3Z5IikpKTsKKyAgICAgICAgYXNzdW1lVGhhdCgiVGhpcyB0ZXN0IGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIFNjcmlwdEVuZ2luZTogIiArIEVOR0lORV9UT19URVNULCBFTkdJTkVfVE9fVEVTVCwgaXMoImdyZW1saW4tZ3Jvb3Z5IikpOwogICAgICAgICBpZiAoRU5HSU5FX1RPX1RFU1QuZXF1YWxzKCJncmVtbGluLWdyb292eSIpKQogICAgICAgICAgICAgcmV0dXJuIGcuVigpLm91dCgiY3JlYXRlZCIpLm1hcChMYW1iZGEuZnVuY3Rpb24oInt4IC0+IHguZ2V0KCkudmFsdWVzKCduYW1lJyl9IikpLmNvdW50KCk7Ci0gICAgICAgIGVsc2UgaWYgKEVOR0lORV9UT19URVNULmVxdWFscygiZ3JlbWxpbi1weXRob24iKSB8fCBFTkdJTkVfVE9fVEVTVC5lcXVhbHMoImdyZW1saW4tanl0aG9uIikpCi0gICAgICAgICAgICByZXR1cm4gZy5WKCkub3V0KCJjcmVhdGVkIikubWFwKExhbWJkYS5mdW5jdGlvbigieCA6IHguZ2V0KCkudmFsdWVzKCduYW1lJykiKSkuY291bnQoKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSAiICsgRU5HSU5FX1RPX1RFU1QgKyAiIFNjcmlwdEVuZ2luZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdGVzdCIpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9BYnN0cmFjdEdyZW1saW5Qcm9jZXNzVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL0Fic3RyYWN0R3JlbWxpblByb2Nlc3NUZXN0LmphdmEKaW5kZXggMGEyYTQwNS4uMDkwNDRkZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL0Fic3RyYWN0R3JlbWxpblByb2Nlc3NUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL0Fic3RyYWN0R3JlbWxpblByb2Nlc3NUZXN0LmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uQWJzdHJhY3RHcmVtbGluVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MucmVtb3RlLnRyYXZlcnNhbC5SZW1vdGVUcmF2ZXJzYWxTaWRlRWZmZWN0czsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbEVuZ2luZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNpZGVFZmZlY3RzOwpAQCAtMzUsNiArMzQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCkBAIC05OCwxNCArOTgsNyBAQAogICAgICAgICAgICAgYXNzZXJ0VGhhdChzaWRlRWZmZWN0cy5rZXlzKCkuY29udGFpbnMoa2V5KSwgaXModHJ1ZSkpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChzaWRlRWZmZWN0cy5leGlzdHMoa2V5KSwgaXModHJ1ZSkpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChzaWRlRWZmZWN0cy5leGlzdHMoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSksIGlzKGZhbHNlKSk7Ci0KLSAgICAgICAgICAgIC8vIHRoZXJlIGlzIHNsaWdodGx5IGRpZmZlcmVudCBiZWhhdmlvciBmb3IgcmVtb3RlIHNpZGUtZWZmZWN0cyBzbyBjYXJ2aW5nIG91dCBhIGZldyBhc3NlcnRzIHdpdGggdGhhdAotICAgICAgICAgICAgLy8gaW4gbWluZC4gdGhlIGNsaWVudCByZWFsbHkgZG9lc250JyByZWFsbHkgaGF2ZSBhIHdheSBvZiBrbm93aW5nIHdoYXQgdHlwZSBvZiBvYmplY3QgdG8gY3JlYXRlIHdoZW4gaXQKLSAgICAgICAgICAgIC8vIGdldHMgYW4gZW1wdHkgaXRlcmF0b3Igc28gaXQgbWFrZXMgdGhlIHJlc3VsdCBudWxsIGFuZCB0aGVyZWZvcmUgd2UgZW5kIHVwIHdpdGggYSBOUEUgaWYgd2UgdHJ5IHRvCi0gICAgICAgICAgICAvLyBhY2Nlc3MgaXQuIHRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBzb2xpZCBzbyBiZXR0ZXIgdG8gZG8gdGhpcyB0aGFuIE9wdE91dCBJIHRoaW5rCi0gICAgICAgICAgICBpZiAoIShzaWRlRWZmZWN0cyBpbnN0YW5jZW9mIFJlbW90ZVRyYXZlcnNhbFNpZGVFZmZlY3RzKSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGF6eiwgc2lkZUVmZmVjdHMuZ2V0KChTdHJpbmcpIGtleXNDbGFzc2VzW2ldKS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGF6eiwgc2lkZUVmZmVjdHMuZ2V0KChTdHJpbmcpIGtleXNDbGFzc2VzW2ldKS5nZXRDbGFzcygpKTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRFcXVhbHMoc2lkZUVmZmVjdHMua2V5cygpLnNpemUoKSwgY291bnRlcik7CiAgICAgICAgIGFzc2VydFRoYXQoc2lkZUVmZmVjdHMua2V5cygpLmNvbnRhaW5zKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpLCBpcyhmYWxzZSkpOwpAQCAtMTkyLDEwICsxODUsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKCFhY3R1YWxMaXN0LmdldChpKS5nZXRLZXkoKS5lcXVhbHMoZXhwZWN0ZWRMaXN0LmdldChpKS5nZXRLZXkoKSkpIHsKKyAgICAgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHMoYWN0dWFsTGlzdC5nZXQoaSkuZ2V0S2V5KCksIGV4cGVjdGVkTGlzdC5nZXQoaSkuZ2V0S2V5KCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhY3R1YWxMaXN0LmdldChpKS5nZXRWYWx1ZSgpLmVxdWFscyhleHBlY3RlZExpc3QuZ2V0KGkpLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKGFjdHVhbExpc3QuZ2V0KGkpLmdldFZhbHVlKCksIGV4cGVjdGVkTGlzdC5nZXQoaSkuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9Qcm9jZXNzQ29tcHV0ZXJTdWl0ZS5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL1Byb2Nlc3NDb21wdXRlclN1aXRlLmphdmEKaW5kZXggM2NhNWI3Ni4uODc4NWU5MCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL1Byb2Nlc3NDb21wdXRlclN1aXRlLmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL1Byb2Nlc3NDb21wdXRlclN1aXRlLmphdmEKQEAgLTIxLDEwICsyMSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5BYnN0cmFjdEdyZW1saW5TdWl0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlclRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmJ1bGtkdW1waW5nLkJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuYnVsa2xvYWRpbmcuQnVsa0xvYWRlclZlcnRleFByb2dyYW1UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5jbG9uZS5DbG9uZVZlcnRleFByb2dyYW1UZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5jbHVzdGVyaW5nLnBlZXJwcmVzc3VyZS5QZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIucmFua2luZy5wYWdlcmFuay5QYWdlUmFua1ZlcnRleFByb2dyYW1UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5zZWFyY2gucGF0aC5TaG9ydGVzdFBhdGhWZXJ0ZXhQcm9ncmFtVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbEVuZ2luZTsKQEAgLTkyLDYgKzg5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5TdG9yZVRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuU3ViZ3JhcGhUZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LlRyZWVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5TZWVkU3RyYXRlZ3lQcm9jZXNzVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU3ViZ3JhcGhTdHJhdGVneVByb2Nlc3NUZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5UcmFuc2xhdGlvblN0cmF0ZWd5UHJvY2Vzc1Rlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb24uRWFybHlMaW1pdFN0cmF0ZWd5UHJvY2Vzc1Rlc3Q7CkBAIC0yMDEsMTAgKzE5OSw3IEBACiAKICAgICAgICAgICAgIC8vIGFsZ29yaXRobXMKICAgICAgICAgICAgIFBhZ2VSYW5rVmVydGV4UHJvZ3JhbVRlc3QuY2xhc3MsCi0gICAgICAgICAgICBQZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtVGVzdC5jbGFzcywKICAgICAgICAgICAgIFNob3J0ZXN0UGF0aFZlcnRleFByb2dyYW1UZXN0LmNsYXNzLAotICAgICAgICAgICAgQnVsa0xvYWRlclZlcnRleFByb2dyYW1UZXN0LmNsYXNzLAotICAgICAgICAgICAgQnVsa0R1bXBlclZlcnRleFByb2dyYW1UZXN0LmNsYXNzLAogICAgICAgICAgICAgQ2xvbmVWZXJ0ZXhQcm9ncmFtVGVzdC5jbGFzcywKIAogICAgICAgICAgICAgLy8gY3JlYXRpb25zCkBAIC0yMTIsNiArMjA3LDcgQEAKIAogICAgICAgICAgICAgLy8gZGVjb3JhdGlvbnMKICAgICAgICAgICAgIFJlYWRPbmx5U3RyYXRlZ3lQcm9jZXNzVGVzdC5jbGFzcywKKyAgICAgICAgICAgIFNlZWRTdHJhdGVneVByb2Nlc3NUZXN0LmNsYXNzLAogICAgICAgICAgICAgU3ViZ3JhcGhTdHJhdGVneVByb2Nlc3NUZXN0LmNsYXNzLAogCiAgICAgICAgICAgICAvLyBvcHRpbWl6YXRpb25zCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvUHJvY2Vzc1N0YW5kYXJkU3VpdGUuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9Qcm9jZXNzU3RhbmRhcmRTdWl0ZS5qYXZhCmluZGV4IGYxMjdjYTAuLjJmMzE2NzggMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9Qcm9jZXNzU3RhbmRhcmRTdWl0ZS5qYXZhCisrKyBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9Qcm9jZXNzU3RhbmRhcmRTdWl0ZS5qYXZhCkBAIC04Niw2ICs4Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLkVsZW1lbnRJZFN0cmF0ZWd5UHJvY2Vzc1Rlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLkV2ZW50U3RyYXRlZ3lQcm9jZXNzVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uUGFydGl0aW9uU3RyYXRlZ3lQcm9jZXNzVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU2VlZFN0cmF0ZWd5UHJvY2Vzc1Rlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLlN1YmdyYXBoU3RyYXRlZ3lQcm9jZXNzVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uVHJhbnNsYXRpb25TdHJhdGVneVByb2Nlc3NUZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLkVhcmx5TGltaXRTdHJhdGVneVByb2Nlc3NUZXN0OwpAQCAtMTkzLDYgKzE5NCw3IEBACiAgICAgICAgICAgICBFdmVudFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuY2xhc3MsCiAgICAgICAgICAgICBSZWFkT25seVN0cmF0ZWd5UHJvY2Vzc1Rlc3QuY2xhc3MsCiAgICAgICAgICAgICBQYXJ0aXRpb25TdHJhdGVneVByb2Nlc3NUZXN0LmNsYXNzLAorICAgICAgICAgICAgU2VlZFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuY2xhc3MsCiAgICAgICAgICAgICBTdWJncmFwaFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuY2xhc3MsCiAKICAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbnMKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9HcmFwaENvbXB1dGVyVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL0dyYXBoQ29tcHV0ZXJUZXN0LmphdmEKaW5kZXggZDE2YzhiOC4uMWNkNWRlNSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL0dyYXBoQ29tcHV0ZXJUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL0dyYXBoQ29tcHV0ZXJUZXN0LmphdmEKQEAgLTE4LDkgKzE4LDkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb25VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkV4Y2VwdGlvbkNvdmVyYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuQWJzdHJhY3RHcmVtbGluUHJvY2Vzc1Rlc3Q7CkBAIC0xMTY4LDYgKzExNjgsNyBAQAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBwdWJsaWMgdm9pZCBzaG91bGRTdGFydEFuZEVuZFdvcmtlcnNGb3JWZXJ0ZXhQcm9ncmFtQW5kTWFwUmVkdWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMTc1LDE3ICsxMTc2LDE3IEBACiAgICAgICAgIE1hcFJlZHVjZUkuV09SS0VSX0VORC5jbGVhcigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMywgZ3JhcGhQcm92aWRlci5nZXRHcmFwaENvbXB1dGVyKGdyYXBoKS5wcm9ncmFtKG5ldyBWZXJ0ZXhQcm9ncmFtSigpKS5tYXBSZWR1Y2UobmV3IE1hcFJlZHVjZUkoKSkuc3VibWl0KCkuZ2V0KCkubWVtb3J5KCkuPEludGVnZXI+Z2V0KCJhIikuaW50VmFsdWUoKSk7CiAgICAgICAgIGlmIChNYXBSZWR1Y2VJLldPUktFUl9TVEFSVC5zaXplKCkgPT0gMikgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIE1hcFJlZHVjZUkuV09SS0VSX1NUQVJULnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgTWFwUmVkdWNlSS5jb3VudFRydWUoTWFwUmVkdWNlSS5XT1JLRVJfU1RBUlQpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoTWFwUmVkdWNlSS5XT1JLRVJfU1RBUlQuY29udGFpbnMoTWFwUmVkdWNlLlN0YWdlLk1BUCkgJiYgTWFwUmVkdWNlSS5XT1JLRVJfU1RBUlQuY29udGFpbnMoTWFwUmVkdWNlLlN0YWdlLlJFRFVDRSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIE1hcFJlZHVjZUkuV09SS0VSX1NUQVJULnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgTWFwUmVkdWNlSS5jb3VudFRydWUoTWFwUmVkdWNlSS5XT1JLRVJfU1RBUlQpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoTWFwUmVkdWNlSS5XT1JLRVJfU1RBUlQuY29udGFpbnMoTWFwUmVkdWNlLlN0YWdlLk1BUCkgJiYgTWFwUmVkdWNlSS5XT1JLRVJfU1RBUlQuY29udGFpbnMoTWFwUmVkdWNlLlN0YWdlLkNPTUJJTkUpICYmIE1hcFJlZHVjZUkuV09SS0VSX1NUQVJULmNvbnRhaW5zKE1hcFJlZHVjZS5TdGFnZS5SRURVQ0UpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTWFwUmVkdWNlSS5XT1JLRVJfRU5ELnNpemUoKSA9PSAyKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgTWFwUmVkdWNlSS5XT1JLRVJfRU5ELnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgTWFwUmVkdWNlSS5jb3VudFRydWUoTWFwUmVkdWNlSS5XT1JLRVJfRU5EKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKE1hcFJlZHVjZUkuV09SS0VSX0VORC5jb250YWlucyhNYXBSZWR1Y2UuU3RhZ2UuTUFQKSAmJiBNYXBSZWR1Y2VJLldPUktFUl9FTkQuY29udGFpbnMoTWFwUmVkdWNlLlN0YWdlLlJFRFVDRSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIE1hcFJlZHVjZUkuV09SS0VSX0VORC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIE1hcFJlZHVjZUkuY291bnRUcnVlKE1hcFJlZHVjZUkuV09SS0VSX0VORCkpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShNYXBSZWR1Y2VJLldPUktFUl9FTkQuY29udGFpbnMoTWFwUmVkdWNlLlN0YWdlLk1BUCkgJiYgTWFwUmVkdWNlSS5XT1JLRVJfRU5ELmNvbnRhaW5zKE1hcFJlZHVjZS5TdGFnZS5DT01CSU5FKSAmJiBNYXBSZWR1Y2VJLldPUktFUl9FTkQuY29udGFpbnMoTWFwUmVkdWNlLlN0YWdlLlJFRFVDRSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTI3MiwxNCArMTI3MywxNCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgbWFwKGZpbmFsIFZlcnRleCB2ZXJ0ZXgsIGZpbmFsIE1hcEVtaXR0ZXI8TnVsbE9iamVjdCwgSW50ZWdlcj4gZW1pdHRlcikgewogICAgICAgICAgICAgZW1pdHRlci5lbWl0KDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFdPUktFUl9TVEFSVC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJ1ZShXT1JLRVJfU1RBUlQpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoV09SS0VSX1NUQVJULmNvbnRhaW5zKFN0YWdlLk1BUCkpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGNvbWJpbmUoZmluYWwgTnVsbE9iamVjdCBrZXksIGZpbmFsIEl0ZXJhdG9yPEludGVnZXI+IHZhbHVlcywgZmluYWwgUmVkdWNlRW1pdHRlcjxOdWxsT2JqZWN0LCBJbnRlZ2VyPiBlbWl0dGVyKSB7CiAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoMik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgV09SS0VSX1NUQVJULnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRUcnVlKFdPUktFUl9TVEFSVCkpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShXT1JLRVJfU1RBUlQuY29udGFpbnMoU3RhZ2UuTUFQKSAmJiBXT1JLRVJfU1RBUlQuY29udGFpbnMoU3RhZ2UuQ09NQklORSkpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoV09SS0VSX0VORC5pc0VtcHR5KCkpOwogICAgICAgICB9CkBAIC0xMjg3LDExICsxMjg4LDExIEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCByZWR1Y2UoZmluYWwgTnVsbE9iamVjdCBrZXksIGZpbmFsIEl0ZXJhdG9yPEludGVnZXI+IHZhbHVlcywgZmluYWwgUmVkdWNlRW1pdHRlcjxOdWxsT2JqZWN0LCBJbnRlZ2VyPiBlbWl0dGVyKSB7CiAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoMyk7Ci0gICAgICAgICAgICBpZiAoV09SS0VSX1NUQVJULnNpemUoKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFdPUktFUl9TVEFSVC5zaXplKCkpOworICAgICAgICAgICAgaWYgKEl0ZXJhdG9yVXRpbHMuY291bnQoV09SS0VSX1NUQVJUKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50VHJ1ZShXT1JLRVJfU1RBUlQpKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKFdPUktFUl9TVEFSVC5jb250YWlucyhTdGFnZS5NQVApICYmIFdPUktFUl9TVEFSVC5jb250YWlucyhTdGFnZS5SRURVQ0UpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIFdPUktFUl9TVEFSVC5zaXplKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBjb3VudFRydWUoV09SS0VSX1NUQVJUKSk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShXT1JLRVJfU1RBUlQuY29udGFpbnMoU3RhZ2UuTUFQKSAmJiBXT1JLRVJfU1RBUlQuY29udGFpbnMoU3RhZ2UuQ09NQklORSkgJiYgV09SS0VSX1NUQVJULmNvbnRhaW5zKFN0YWdlLlJFRFVDRSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoV09SS0VSX0VORC5pc0VtcHR5KCkpOwpAQCAtMTMxNSw2ICsxMzE2LDE1IEBACiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5S2V5KCkgewogICAgICAgICAgICAgcmV0dXJuICJhIjsKICAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBKYXZhZG9jIGZvciB7QGNvZGUgQ29uY3VycmVudFNraXBMaXN0U2V0fSBpbmNsdWRlcyB0aGlzIGxpdHRsZSBub3RlOiAiQmV3YXJlIHRoYXQsIHVubGlrZSBpbiBtb3N0CisgICAgICAgICAqIGNvbGxlY3Rpb25zLCB0aGUgc2l6ZSBtZXRob2QgaXMgbm90IGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uIiBEb2luZyBhIHRyYXZlcnNhbCBvZiBlbGVtZW50cyB3aWxsIHlpZWxkCisgICAgICAgICAqIHRoZSBjb3JyZWN0IGNvdW50LiBKYXZhIDExIHVwZ3JhZGUgc2VlbWVkIHRvIGZvcmNlIHRoaXMgZmFpbHVyZSBjb25zaXN0ZW50bHkuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgaW50IGNvdW50VHJ1ZShmaW5hbCBTZXQ8U3RhZ2U+IHMpIHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLnZhbHVlT2YoSXRlcmF0b3JVdGlscy5jb3VudChzKSkuaW50VmFsdWUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtkdW1waW5nL0J1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtkdW1waW5nL0J1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjEwNGMwLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9idWxrZHVtcGluZy9CdWxrRHVtcGVyVmVydGV4UHJvZ3JhbVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuYnVsa2R1bXBpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkxvYWRHcmFwaFdpdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLkFic3RyYWN0R3JlbWxpblByb2Nlc3NUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5Db21wdXRlclJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoLkdyYXBoRGF0YS5NT0RFUk47Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgS3VwcGl0eiAoaHR0cDovL2dyZW1saW4uZ3VydSkKLSAqLwotcHVibGljIGNsYXNzIEJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtVGVzdCBleHRlbmRzIEFic3RyYWN0R3JlbWxpblByb2Nlc3NUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQotICAgIHB1YmxpYyB2b2lkIHNob3VsZER1bXBXaG9sZUdyYXBoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChncmFwaFByb3ZpZGVyLmdldEdyYXBoQ29tcHV0ZXIoZ3JhcGgpLmZlYXR1cmVzKCkuc3VwcG9ydHNSZXN1bHRHcmFwaFBlcnNpc3RDb21iaW5hdGlvbihHcmFwaENvbXB1dGVyLlJlc3VsdEdyYXBoLk5FVywgR3JhcGhDb21wdXRlci5QZXJzaXN0LkVER0VTKSkgewotICAgICAgICAgICAgZmluYWwgQ29tcHV0ZXJSZXN1bHQgcmVzdWx0ID0gZ3JhcGhQcm92aWRlci5nZXRHcmFwaENvbXB1dGVyKGdyYXBoKS5wcm9ncmFtKEJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtLmJ1aWxkKCkuY3JlYXRlKGdyYXBoKSkuc3VibWl0KCkuZ2V0KCk7Ci0gICAgICAgICAgICByZXN1bHQuZ3JhcGgoKS50cmF2ZXJzYWwoKS5WKCkuZm9yRWFjaFJlbWFpbmluZyh2IC0+IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdi5rZXlzKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHYua2V5cygpLmNvbnRhaW5zKCJuYW1lIikpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUodi5rZXlzKCkuY29udGFpbnMoImFnZSIpIHx8IHYua2V5cygpLmNvbnRhaW5zKCJsYW5nIikpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KHYudmFsdWVzKCJuYW1lIikpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudCh2LnZhbHVlcygiYWdlIiwgImxhbmciKSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gdi52YWx1ZSgibmFtZSIpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygibWFya28iKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIHYubGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjkpLCB2LnZhbHVlKCJhZ2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBJdGVyYXRvclV0aWxzLmNvdW50KHYuZWRnZXMoRGlyZWN0aW9uLk9VVCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uT1VULCAia25vd3MiKSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudCh2LmVkZ2VzKERpcmVjdGlvbi5PVVQsICJjcmVhdGVkIikpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uSU4pKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidmFkYXMiKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIHYubGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjcpLCB2LnZhbHVlKCJhZ2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBJdGVyYXRvclV0aWxzLmNvdW50KHYuZWRnZXMoRGlyZWN0aW9uLk9VVCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uSU4pKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KHYuZWRnZXMoRGlyZWN0aW9uLklOLCAia25vd3MiKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImxvcCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygic29mdHdhcmUiLCB2LmxhYmVsKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEiLCB2LnZhbHVlKCJsYW5nIikpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgSXRlcmF0b3JVdGlscy5jb3VudCh2LmVkZ2VzKERpcmVjdGlvbi5PVVQpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBJdGVyYXRvclV0aWxzLmNvdW50KHYuZWRnZXMoRGlyZWN0aW9uLklOKSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgSXRlcmF0b3JVdGlscy5jb3VudCh2LmVkZ2VzKERpcmVjdGlvbi5JTiwgImNyZWF0ZWQiKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImpvc2giKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIHYubGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMzIpLCB2LnZhbHVlKCJhZ2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBJdGVyYXRvclV0aWxzLmNvdW50KHYuZWRnZXMoRGlyZWN0aW9uLk9VVCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uT1VULCAiY3JlYXRlZCIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KHYuZWRnZXMoRGlyZWN0aW9uLklOKSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudCh2LmVkZ2VzKERpcmVjdGlvbi5JTiwgImtub3dzIikpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJyaXBwbGUiKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNvZnR3YXJlIiwgdi5sYWJlbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhIiwgdi52YWx1ZSgibGFuZyIpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uT1VUKSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudCh2LmVkZ2VzKERpcmVjdGlvbi5JTikpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uSU4sICJjcmVhdGVkIikpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJwZXRlciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicGVyc29uIiwgdi5sYWJlbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzNSksIHYudmFsdWUoImFnZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uT1VUKSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudCh2LmVkZ2VzKERpcmVjdGlvbi5PVVQsICJjcmVhdGVkIikpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5lZGdlcyhEaXJlY3Rpb24uSU4pKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBmb2xsb3dpbmcgdmVydGV4IHNob3VsZCBub3QgZXhpc3QgaW4gdGhlIGdyYXBoOiAiICsgbmFtZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjUsIChEb3VibGUpIHJlc3VsdC5ncmFwaCgpLnRyYXZlcnNhbCgpLkUoKS52YWx1ZXMoIndlaWdodCIpLnN1bSgpLm5leHQoKSwgMC4wMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMS41LCAoRG91YmxlKSByZXN1bHQuZ3JhcGgoKS50cmF2ZXJzYWwoKS5FKCkuaGFzTGFiZWwoImtub3dzIikudmFsdWVzKCJ3ZWlnaHQiKS5zdW0oKS5uZXh0KCksIDAuMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMCwgKERvdWJsZSkgcmVzdWx0LmdyYXBoKCkudHJhdmVyc2FsKCkuRSgpLmhhc0xhYmVsKCJjcmVhdGVkIikudmFsdWVzKCJ3ZWlnaHQiKS5zdW0oKS5uZXh0KCksIDAuMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5tZW1vcnkoKS5nZXRJdGVyYXRpb24oKSwgMCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lm1lbW9yeSgpLmFzTWFwKCkuc2l6ZSgpLCAwKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvYnVsa2xvYWRpbmcvQnVsa0xvYWRlclZlcnRleFByb2dyYW1UZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvYnVsa2xvYWRpbmcvQnVsa0xvYWRlclZlcnRleFByb2dyYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZWIxZWIuLjAwMDAwMDAKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL2NvbXB1dGVyL2J1bGtsb2FkaW5nL0J1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuYnVsa2xvYWRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLkFic3RyYWN0R3JlbWxpblByb2Nlc3NUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5JZ25vcmVFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleFByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuQ2xvc2VhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5HcmFwaEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoLkdyYXBoRGF0YS5NT0RFUk47Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotLyoqCi0gKiBAYXV0aG9yIERhbmllbCBLdXBwaXR6IChodHRwOi8vZ3JlbWxpbi5ndXJ1KQotICovCi1wdWJsaWMgY2xhc3MgQnVsa0xvYWRlclZlcnRleFByb2dyYW1UZXN0IGV4dGVuZHMgQWJzdHJhY3RHcmVtbGluUHJvY2Vzc1Rlc3QgewotCi0gICAgZmluYWwgc3RhdGljIFN0cmluZyBUSU5LRVJHUkFQSF9MT0NBVElPTiA9IFRlc3RIZWxwZXIubWFrZVRlc3REYXRhRmlsZShCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbVRlc3QuY2xhc3MsICJ0aW5rZXJ0ZXN0LmtyeW8iKTsKLQotICAgIHByaXZhdGUgQnVsa0xvYWRlciBnZXRCdWxrTG9hZGVyKGZpbmFsIEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtIGJsdnApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBGaWVsZCBmaWVsZCA9IEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImJ1bGtMb2FkZXIiKTsKLSAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIChCdWxrTG9hZGVyKSBmaWVsZC5nZXQoYmx2cCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIGdldFdyaXRlR3JhcGhDb25maWd1cmF0aW9uKCkgewotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQmFzZUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShHcmFwaC5HUkFQSCwgIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlLlRpbmtlckdyYXBoIik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoImdyZW1saW4udGlua2VyZ3JhcGguZ3JhcGhMb2NhdGlvbiIsIFRJTktFUkdSQVBIX0xPQ0FUSU9OKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eSgiZ3JlbWxpbi50aW5rZXJncmFwaC5ncmFwaEZvcm1hdCIsICJncnlvIik7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgR3JhcGggZ2V0V3JpdGVHcmFwaCgpIHsKLSAgICAgICAgcmV0dXJuIEdyYXBoRmFjdG9yeS5vcGVuKGdldFdyaXRlR3JhcGhDb25maWd1cmF0aW9uKCkpOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGZpbmFsIEZpbGUgZ3JhcGggPSBuZXcgRmlsZShUSU5LRVJHUkFQSF9MT0NBVElPTik7Ci0gICAgICAgIGFzc2VydFRydWUoIWdyYXBoLmV4aXN0cygpIHx8IGdyYXBoLmRlbGV0ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFVzZUluY3JlbWVudGFsQnVsa0xvYWRlckJ5RGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBCdWxrTG9hZGVyIGxvYWRlciA9IGdldEJ1bGtMb2FkZXIoQnVsa0xvYWRlclZlcnRleFByb2dyYW0uYnVpbGQoKS5jcmVhdGUoZ3JhcGgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsb2FkZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbEJ1bGtMb2FkZXIpOwotICAgICAgICBhc3NlcnRUcnVlKGxvYWRlci5rZWVwT3JpZ2luYWxJZHMoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGxvYWRlci51c2VVc2VyU3VwcGxpZWRJZHMoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgc2hvdWxkU3RvcmVPcmlnaW5hbElkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbSBibHZwID0gQnVsa0xvYWRlclZlcnRleFByb2dyYW0uYnVpbGQoKQotICAgICAgICAgICAgICAgIC51c2VyU3VwcGxpZWRJZHMoZmFsc2UpCi0gICAgICAgICAgICAgICAgLndyaXRlR3JhcGgoZ2V0V3JpdGVHcmFwaENvbmZpZ3VyYXRpb24oKSkuY3JlYXRlKGdyYXBoKTsKLSAgICAgICAgZmluYWwgQnVsa0xvYWRlciBsb2FkZXIgPSBnZXRCdWxrTG9hZGVyKGJsdnApOwotICAgICAgICBhc3NlcnRGYWxzZShsb2FkZXIudXNlVXNlclN1cHBsaWVkSWRzKCkpOwotICAgICAgICBncmFwaFByb3ZpZGVyLmdldEdyYXBoQ29tcHV0ZXIoZ3JhcGgpLndvcmtlcnMoMSkucHJvZ3JhbShibHZwKS5zdWJtaXQoKS5nZXQoKTsKLSAgICAgICAgYXNzZXJ0R3JhcGhFcXVhbGl0eShncmFwaCwgZ2V0V3JpdGVHcmFwaCgpLCB2IC0+IHYudmFsdWUobG9hZGVyLmdldFZlcnRleElkUHJvcGVydHkoKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQotICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdFN0b3JlT3JpZ2luYWxJZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQnVsa0xvYWRlclZlcnRleFByb2dyYW0gYmx2cCA9IEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmJ1aWxkKCkKLSAgICAgICAgICAgICAgICAudXNlclN1cHBsaWVkSWRzKHRydWUpCi0gICAgICAgICAgICAgICAgLndyaXRlR3JhcGgoZ2V0V3JpdGVHcmFwaENvbmZpZ3VyYXRpb24oKSkuY3JlYXRlKGdyYXBoKTsKLSAgICAgICAgZmluYWwgQnVsa0xvYWRlciBsb2FkZXIgPSBnZXRCdWxrTG9hZGVyKGJsdnApOwotICAgICAgICBhc3NlcnRUcnVlKGxvYWRlci51c2VVc2VyU3VwcGxpZWRJZHMoKSk7Ci0gICAgICAgIGdyYXBoUHJvdmlkZXIuZ2V0R3JhcGhDb21wdXRlcihncmFwaCkud29ya2VycygxKS5wcm9ncmFtKGJsdnApLnN1Ym1pdCgpLmdldCgpOwotICAgICAgICBhc3NlcnRHcmFwaEVxdWFsaXR5KGdyYXBoLCBnZXRXcml0ZUdyYXBoKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQotICAgIHB1YmxpYyB2b2lkIHNob3VsZE92ZXJ3cml0ZUV4aXN0aW5nRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQnVsa0xvYWRlclZlcnRleFByb2dyYW0gYmx2cCA9IEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmJ1aWxkKCkKLSAgICAgICAgICAgICAgICAudXNlclN1cHBsaWVkSWRzKHRydWUpCi0gICAgICAgICAgICAgICAgLndyaXRlR3JhcGgoZ2V0V3JpdGVHcmFwaENvbmZpZ3VyYXRpb24oKSkuY3JlYXRlKGdyYXBoKTsKLSAgICAgICAgZ3JhcGhQcm92aWRlci5nZXRHcmFwaENvbXB1dGVyKGdyYXBoKS53b3JrZXJzKDEpLnByb2dyYW0oYmx2cCkuc3VibWl0KCkuZ2V0KCk7IC8vIGluaXRpYWwKLSAgICAgICAgZ3JhcGhQcm92aWRlci5nZXRHcmFwaENvbXB1dGVyKGdyYXBoKS53b3JrZXJzKDEpLnByb2dyYW0oYmx2cCkuc3VibWl0KCkuZ2V0KCk7IC8vIGluY3JlbWVudGFsCi0gICAgICAgIGFzc2VydEdyYXBoRXF1YWxpdHkoZ3JhcGgsIGdldFdyaXRlR3JhcGgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgQElnbm9yZUVuZ2luZShUcmF2ZXJzYWxFbmdpbmUuVHlwZS5DT01QVVRFUikgLy8gd2UgY2FuJ3QgbW9kaWZ5IHRoZSBncmFwaCBpbiBjb21wdXRlciBtb2RlCi0gICAgcHVibGljIHZvaWQgc2hvdWxkUHJvcGVybHlIYW5kbGVNZXRhUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBncmFwaC50cmF2ZXJzYWwoKS5WKCkuaGFzKCJuYW1lIiwgIm1hcmtvIikucHJvcGVydGllcygibmFtZSIpLnByb3BlcnR5KCJhbGlhcyIsICJva3JhbSIpLml0ZXJhdGUoKTsKLSAgICAgICAgZmluYWwgQnVsa0xvYWRlclZlcnRleFByb2dyYW0gYmx2cCA9IEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmJ1aWxkKCkKLSAgICAgICAgICAgICAgICAudXNlclN1cHBsaWVkSWRzKHRydWUpCi0gICAgICAgICAgICAgICAgLndyaXRlR3JhcGgoZ2V0V3JpdGVHcmFwaENvbmZpZ3VyYXRpb24oKSkuY3JlYXRlKGdyYXBoKTsKLSAgICAgICAgZ3JhcGhQcm92aWRlci5nZXRHcmFwaENvbXB1dGVyKGdyYXBoKS53b3JrZXJzKDEpLnByb2dyYW0oYmx2cCkuc3VibWl0KCkuZ2V0KCk7Ci0gICAgICAgIGFzc2VydEdyYXBoRXF1YWxpdHkoZ3JhcGgsIGdldFdyaXRlR3JhcGgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgc2hvdWxkVXNlT25lVGltZUJ1bGtMb2FkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaXRlcmF0aW9uID0gMTsgaXRlcmF0aW9uIDw9IDI7IGl0ZXJhdGlvbisrKSB7Ci0gICAgICAgICAgICBmaW5hbCBCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbSBibHZwID0gQnVsa0xvYWRlclZlcnRleFByb2dyYW0uYnVpbGQoKQotICAgICAgICAgICAgICAgICAgICAuYnVsa0xvYWRlcihPbmVUaW1lQnVsa0xvYWRlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlR3JhcGgoZ2V0V3JpdGVHcmFwaENvbmZpZ3VyYXRpb24oKSkuY3JlYXRlKGdyYXBoKTsKLSAgICAgICAgICAgIGZpbmFsIEJ1bGtMb2FkZXIgbG9hZGVyID0gZ2V0QnVsa0xvYWRlcihibHZwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobG9hZGVyIGluc3RhbmNlb2YgT25lVGltZUJ1bGtMb2FkZXIpOwotICAgICAgICAgICAgZ3JhcGhQcm92aWRlci5nZXRHcmFwaENvbXB1dGVyKGdyYXBoKS53b3JrZXJzKDEpLnByb2dyYW0oYmx2cCkuc3VibWl0KCkuZ2V0KCk7Ci0gICAgICAgICAgICBmaW5hbCBHcmFwaCByZXN1bHQgPSBnZXRXcml0ZUdyYXBoKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoNiAqIGl0ZXJhdGlvbiwgSXRlcmF0b3JVdGlscy5jb3VudChyZXN1bHQudmVydGljZXMoKSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDYgKiBpdGVyYXRpb24sIEl0ZXJhdG9yVXRpbHMuY291bnQocmVzdWx0LmVkZ2VzKCkpKTsKLSAgICAgICAgICAgIHJlc3VsdC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgc2hvdWxkVXNlT25lVGltZUJ1bGtMb2FkZXJXaXRoVXNlclN1cHBsaWVkSWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtIGJsdnAgPSBCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbS5idWlsZCgpCi0gICAgICAgICAgICAgICAgLmJ1bGtMb2FkZXIoT25lVGltZUJ1bGtMb2FkZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLnVzZXJTdXBwbGllZElkcyh0cnVlKQotICAgICAgICAgICAgICAgIC53cml0ZUdyYXBoKGdldFdyaXRlR3JhcGhDb25maWd1cmF0aW9uKCkpLmNyZWF0ZShncmFwaCk7Ci0gICAgICAgIGZpbmFsIEJ1bGtMb2FkZXIgbG9hZGVyID0gZ2V0QnVsa0xvYWRlcihibHZwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsb2FkZXIgaW5zdGFuY2VvZiBPbmVUaW1lQnVsa0xvYWRlcik7Ci0gICAgICAgIGdyYXBoUHJvdmlkZXIuZ2V0R3JhcGhDb21wdXRlcihncmFwaCkud29ya2VycygxKS5wcm9ncmFtKGJsdnApLnN1Ym1pdCgpLmdldCgpOwotICAgICAgICBmaW5hbCBHcmFwaCByZXN1bHQgPSBnZXRXcml0ZUdyYXBoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2LCBJdGVyYXRvclV0aWxzLmNvdW50KHJlc3VsdC52ZXJ0aWNlcygpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2LCBJdGVyYXRvclV0aWxzLmNvdW50KHJlc3VsdC5lZGdlcygpKSk7Ci0gICAgICAgIHJlc3VsdC5jbG9zZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0R3JhcGhFcXVhbGl0eShmaW5hbCBHcmFwaCBzb3VyY2UsIGZpbmFsIEdyYXBoIHRhcmdldCkgewotICAgICAgICBhc3NlcnRHcmFwaEVxdWFsaXR5KHNvdXJjZSwgdGFyZ2V0LCBFbGVtZW50OjppZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRHcmFwaEVxdWFsaXR5KGZpbmFsIEdyYXBoIHNvdXJjZSwgZmluYWwgR3JhcGggdGFyZ2V0LCBmaW5hbCBGdW5jdGlvbjxWZXJ0ZXgsIE9iamVjdD4gaWRBY2Nlc3NvcikgewotICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSB0ZyA9IHRhcmdldC50cmF2ZXJzYWwoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEl0ZXJhdG9yVXRpbHMuY291bnQoc291cmNlLnZlcnRpY2VzKCkpLCBJdGVyYXRvclV0aWxzLmNvdW50KHRhcmdldC52ZXJ0aWNlcygpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJdGVyYXRvclV0aWxzLmNvdW50KHNvdXJjZS5lZGdlcygpKSwgSXRlcmF0b3JVdGlscy5jb3VudCh0YXJnZXQuZWRnZXMoKSkpOwotICAgICAgICBzb3VyY2UudmVydGljZXMoKS5mb3JFYWNoUmVtYWluaW5nKG9yaWdpbmFsVmVydGV4IC0+IHsKLSAgICAgICAgICAgIFZlcnRleCB0bXBWZXJ0ZXggPSBudWxsOwotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8VmVydGV4PiB2ZXJ0ZXhJdGVyYXRvciA9IHRhcmdldC52ZXJ0aWNlcygpOwotICAgICAgICAgICAgd2hpbGUgKHZlcnRleEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFZlcnRleCB2ID0gdmVydGV4SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChpZEFjY2Vzc29yLmFwcGx5KHYpLnRvU3RyaW5nKCkuZXF1YWxzKG9yaWdpbmFsVmVydGV4LmlkKCkudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wVmVydGV4ID0gdjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbG9zZWFibGVJdGVyYXRvci5jbG9zZUl0ZXJhdG9yKHZlcnRleEl0ZXJhdG9yKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBWZXJ0ZXgpOwotICAgICAgICAgICAgZmluYWwgVmVydGV4IGNsb25lZFZlcnRleCA9IHRtcFZlcnRleDsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhJdGVyYXRvclV0aWxzLmNvdW50KG9yaWdpbmFsVmVydGV4LmVkZ2VzKERpcmVjdGlvbi5JTikpLCBJdGVyYXRvclV0aWxzLmNvdW50KGNsb25lZFZlcnRleC5lZGdlcyhEaXJlY3Rpb24uSU4pKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSXRlcmF0b3JVdGlscy5jb3VudChvcmlnaW5hbFZlcnRleC5lZGdlcyhEaXJlY3Rpb24uT1VUKSksIEl0ZXJhdG9yVXRpbHMuY291bnQoY2xvbmVkVmVydGV4LmVkZ2VzKERpcmVjdGlvbi5PVVQpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxWZXJ0ZXgubGFiZWwoKSwgY2xvbmVkVmVydGV4LmxhYmVsKCkpOwotICAgICAgICAgICAgb3JpZ2luYWxWZXJ0ZXgucHJvcGVydGllcygpLmZvckVhY2hSZW1haW5pbmcob3JpZ2luYWxQcm9wZXJ0eSAtPiB7Ci0gICAgICAgICAgICAgICAgVmVydGV4UHJvcGVydHkgY2xvbmVkUHJvcGVydHkgPSBudWxsOwotICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFZlcnRleFByb3BlcnR5PE9iamVjdD4+IHZlcnRleFByb3BlcnR5SXRlcmF0b3IgPSBjbG9uZWRWZXJ0ZXgucHJvcGVydGllcyhvcmlnaW5hbFByb3BlcnR5LmtleSgpKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodmVydGV4UHJvcGVydHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVydGV4UHJvcGVydHkgcCA9IHZlcnRleFByb3BlcnR5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocC52YWx1ZSgpLmVxdWFscyhvcmlnaW5hbFByb3BlcnR5LnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRQcm9wZXJ0eSA9IHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNsb25lZFByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxQcm9wZXJ0eS5pc1ByZXNlbnQoKSwgY2xvbmVkUHJvcGVydHkuaXNQcmVzZW50KCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFByb3BlcnR5LnZhbHVlKCksIGNsb25lZFByb3BlcnR5LnZhbHVlKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBvcmlnaW5hbFZlcnRleC5lZGdlcyhEaXJlY3Rpb24uT1VUKS5mb3JFYWNoUmVtYWluaW5nKG9yaWdpbmFsRWRnZSAtPiB7Ci0gICAgICAgICAgICAgICAgR3JhcGhUcmF2ZXJzYWwgdCA9IHRnLlYoY2xvbmVkVmVydGV4KS5vdXRFKG9yaWdpbmFsRWRnZS5sYWJlbCgpKTsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbEVkZ2UucHJvcGVydGllcygpLmZvckVhY2hSZW1haW5pbmcocCAtPiB0LmhhcyhwLmtleSgpLCBwLnZhbHVlKCkpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHQuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgICAgICBDbG9zZWFibGVJdGVyYXRvci5jbG9zZUl0ZXJhdG9yKHQpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvY29tcHV0ZXIvY2x1c3RlcmluZy9wZWVycHJlc3N1cmUvUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbVRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9QZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg0MGIwLi4wMDAwMDAwCi0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy9jb21wdXRlci9jbHVzdGVyaW5nL3BlZXJwcmVzc3VyZS9QZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmNsdXN0ZXJpbmcucGVlcnByZXNzdXJlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5BYnN0cmFjdEdyZW1saW5Qcm9jZXNzVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuQ29tcHV0ZXJSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEuTU9ERVJOOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1wdWJsaWMgY2xhc3MgUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEdyZW1saW5Qcm9jZXNzVGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRFeGVjdXRlUGVlclByZXNzdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qaWYgKGcuZ2V0R3JhcGhDb21wdXRlcigpLmdldCgpLmZlYXR1cmVzKCkuc3VwcG9ydHNSZXN1bHRHcmFwaFBlcnNpc3RDb21iaW5hdGlvbihHcmFwaENvbXB1dGVyLlJlc3VsdEdyYXBoLk5FVywgR3JhcGhDb21wdXRlci5QZXJzaXN0LlZFUlRFWF9QUk9QRVJUSUVTKSkgewotICAgICAgICAgICAgZmluYWwgQ29tcHV0ZXJSZXN1bHQgcmVzdWx0ID0gZ3JhcGguY29tcHV0ZShnLmdldEdyYXBoQ29tcHV0ZXIoKS5nZXQoKS5nZXRDbGFzcygpKS5wcm9ncmFtKFBlZXJQcmVzc3VyZVZlcnRleFByb2dyYW0uYnVpbGQoKS5jcmVhdGUoZ3JhcGgpKS5zdWJtaXQoKS5nZXQoKTsKLSAgICAgICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IGNsdXN0ZXJzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgcmVzdWx0LmdyYXBoKCkudHJhdmVyc2FsKCkuVigpLmZvckVhY2hSZW1haW5pbmcodiAtPiB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHYua2V5cygpLnNpemUoKSk7IC8vIG5hbWUsIGFnZS9sYW5nLCB2b3RlU3RyZW5ndGgsIGNsdXN0ZXIKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHYua2V5cygpLmNvbnRhaW5zKCJuYW1lIikpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUodi5rZXlzKCkuY29udGFpbnMoUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbS5WT1RFX1NUUkVOR1RIKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmtleXMoKS5jb250YWlucyhQZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtLkNMVVNURVIpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudCh2LnZhbHVlcygibmFtZSIpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEl0ZXJhdG9yVXRpbHMuY291bnQodi52YWx1ZXMoUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbS5DTFVTVEVSKSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjbHVzdGVyID0gdi52YWx1ZShQZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtLkNMVVNURVIpOwotICAgICAgICAgICAgICAgIGNsdXN0ZXJzLmFkZChjbHVzdGVyKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgLy9hc3NlcnRFcXVhbHMoMiwgY2x1c3RlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIC8vYXNzZXJ0RXF1YWxzKDMsIHJlc3VsdC5tZW1vcnkoKS5nZXRJdGVyYXRpb24oKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0Lm1lbW9yeSgpLmFzTWFwKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0Lm1lbW9yeSgpLmtleXMoKS5jb250YWlucygiZ3JlbWxpbi5wZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtLnZvdGVUb0hhbHQiKSk7ICAvLyB0aGlzIGlzIHByaXZhdGUgaW4gUGVlclByZXNzdXJlVmVydGV4UHJvZ3JhbSAoYW5kIHRoYXQgaXMgb2theSkKLSAgICAgICAgfSovCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvQ29yZVRyYXZlcnNhbFRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvQ29yZVRyYXZlcnNhbFRlc3QuamF2YQppbmRleCBjZjM0ZWUyLi40M2RjZjE1IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL0NvcmVUcmF2ZXJzYWxUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9Db3JlVHJhdmVyc2FsVGVzdC5qYXZhCkBAIC01MSw2ICs1MSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLlN0cmluZ1N0YXJ0c1dpdGguc3RhcnRzV2l0aDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTY4LDYgKzY5LDQ0IEBACiBwdWJsaWMgY2xhc3MgQ29yZVRyYXZlcnNhbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEdyZW1saW5Qcm9jZXNzVGVzdCB7CiAKICAgICBAVGVzdAorICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKKyAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9BRERfVkVSVElDRVMpCisgICAgQEZlYXR1cmVSZXF1aXJlbWVudChmZWF0dXJlQ2xhc3MgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLkZFQVRVUkVfQUREX1BST1BFUlRZKQorICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX05VTExfUFJPUEVSVFlfVkFMVUVTKQorICAgIHB1YmxpYyB2b2lkIGdfYWRkVlhwZXJzb25YX3Byb3BlcnR5WG5hbWVfbnVsbFgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gdHJhdmVyc2FsID0gZy5hZGRWKCJwZXJzb24iKS5wcm9wZXJ0eSgibmFtZSIsIG51bGwpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgZmluYWwgVmVydGV4IG51bGxlZCA9IHRyYXZlcnNhbC5uZXh0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIG51bGxlZC5sYWJlbCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChudWxsZWQudmFsdWUoIm5hbWUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KG51bGxlZC5wcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIEl0ZXJhdG9yVXRpbHMuY291bnQoZy5WKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKKyAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5GRUFUVVJFX0FERF9FREdFUykKKyAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5GRUFUVVJFX05VTExfUFJPUEVSVFlfVkFMVUVTKQorICAgIHB1YmxpYyB2b2lkIGdfVlgxWF9hc1hhWF9vdXRYY3JlYXRlZFhfYWRkRVhjcmVhdGVkQnlYX3RvWGFYX3Byb3BlcnR5WHdlaWdodF9udWxsWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgRWRnZT4gdHJhdmVyc2FsID0gZy5WKGNvbnZlcnRUb1ZlcnRleElkKCJtYXJrbyIpKS5hcygiYSIpLm91dCgiY3JlYXRlZCIpLmFkZEUoImNyZWF0ZWRCeSIpLnRvKCJhIikucHJvcGVydHkoIndlaWdodCIsIG51bGwpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKHRyYXZlcnNhbC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEVkZ2UgZWRnZSA9IHRyYXZlcnNhbC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNyZWF0ZWRCeSIsIGVkZ2UubGFiZWwoKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGcuRShlZGdlKS48RG91YmxlPnZhbHVlcygid2VpZ2h0IikubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBnLkUoZWRnZSkucHJvcGVydGllcygpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOworICAgICAgICAgICAgY291bnQrKzsKKworCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIEl0ZXJhdG9yVXRpbHMuY291bnQoZy5FKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIEl0ZXJhdG9yVXRpbHMuY291bnQoZy5WKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoCiAgICAgcHVibGljIHZvaWQgc2hvdWxkTmV2ZXJQcm9wYWdhdGVBTm9CdWxrVHJhdmVyc2VyKCkgewogICAgICAgICB0cnkgewpAQCAtODAsMTggKzExOSw2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBATG9hZEdyYXBoV2l0aAotICAgIHB1YmxpYyB2b2lkIHNob3VsZE5ldmVyUHJvcGFnYXRlQU51bGxWYWx1ZWRUcmF2ZXJzZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShnLlYoKS5tYXAodCAtPiBudWxsKS5oYXNOZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGcuVigpLm1hcCh0IC0+IG51bGwpLnRvTGlzdCgpLnNpemUoKSk7Ci0gICAgICAgICAgICBnLlYoKS5tYXAodCAtPiBudWxsKS5zaWRlRWZmZWN0KHQgLT4gZmFpbCgidGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQiKSkuaXRlcmF0ZSgpOwotICAgICAgICB9IGNhdGNoIChWZXJpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaXRzIG9rYXkgaWYgbGFtYmRhcyBjYW4ndCBiZSBzZXJpYWxpemVkIGJ5IHRoZSB0ZXN0IHN1aXRlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBwdWJsaWMgdm9pZCBzaG91bGRGaWx0ZXJPbkl0ZXJhdGUoKSB7CiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsU3RyaW5nPiB0cmF2ZXJzYWwgPSBnLlYoKS5vdXQoKS5vdXQoKS48U3RyaW5nPnZhbHVlcygibmFtZSIpLmFnZ3JlZ2F0ZSgieCIpLml0ZXJhdGUoKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9Db21wbGV4VGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL0NvbXBsZXhUZXN0LmphdmEKaW5kZXggMDExMGQ0NC4uZjc3MzVjNiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL0NvbXBsZXhUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL0NvbXBsZXhUZXN0LmphdmEKQEAgLTMxNywyNyArMzE3LDI3IEBACiAgICAgICAgICAgICByZXR1cm4gZy53aXRob3V0U3RyYXRlZ2llcyhDb21wdXRlclZlcmlmaWNhdGlvblN0cmF0ZWd5LmNsYXNzLCBQYXRoUmV0cmFjdGlvblN0cmF0ZWd5LmNsYXNzKS4KICAgICAgICAgICAgICAgICAgICAgVigpLmFzKCJ2IikuYm90aCgpLmFzKCJ2IikuCiAgICAgICAgICAgICAgICAgICAgIHByb2plY3QoInNyYyIsICJ0Z3QiLCAicCIpLgotICAgICAgICAgICAgICAgICAgICBieShzZWxlY3QoZmlyc3QsICJ2IikpLgotICAgICAgICAgICAgICAgICAgICBieShzZWxlY3QobGFzdCwgInYiKSkuCi0gICAgICAgICAgICAgICAgICAgIGJ5KHNlbGVjdChhbGwsICJ2IikpLmFzKCJ0cmlwbGUiKS4KKyAgICAgICAgICAgICAgICAgICAgICBieShzZWxlY3QoZmlyc3QsICJ2IikpLgorICAgICAgICAgICAgICAgICAgICAgIGJ5KHNlbGVjdChsYXN0LCAidiIpKS4KKyAgICAgICAgICAgICAgICAgICAgICBieShzZWxlY3QoYWxsLCAidiIpKS5hcygidHJpcGxlIikuCiAgICAgICAgICAgICAgICAgICAgIGdyb3VwKCJ4IikuCi0gICAgICAgICAgICAgICAgICAgIGJ5KHNlbGVjdCgic3JjIiwgInRndCIpKS4KLSAgICAgICAgICAgICAgICAgICAgYnkoc2VsZWN0KCJwIikuZm9sZCgpKS5zZWxlY3QoInRndCIpLmJhcnJpZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgICBieShzZWxlY3QoInNyYyIsICJ0Z3QiKSkuCisgICAgICAgICAgICAgICAgICAgICAgYnkoc2VsZWN0KCJwIikuZm9sZCgpKS5zZWxlY3QoInRndCIpLmJhcnJpZXIoKS4KICAgICAgICAgICAgICAgICAgICAgcmVwZWF0KGJvdGgoKS5hcygidiIpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QoInNyYyIsICJ0Z3QiLCAicCIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5KHNlbGVjdChmaXJzdCwgInYiKSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkoc2VsZWN0KGxhc3QsICJ2IikpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5KHNlbGVjdChhbGwsICJ2IikpLmFzKCJ0IikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieShzZWxlY3QoZmlyc3QsICJ2IikpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkoc2VsZWN0KGxhc3QsICJ2IikpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkoc2VsZWN0KGFsbCwgInYiKSkuYXMoInQiKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2VsZWN0KGFsbCwgInAiKS5jb3VudChsb2NhbCkuYXMoImwiKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChsYXN0LCAidCIpLnNlbGVjdChhbGwsICJwIikuZGVkdXAobG9jYWwpLmNvdW50KGxvY2FsKS53aGVyZShlcSgibCIpKSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChsYXN0LCAidCIpLnNlbGVjdChhbGwsICJwIikuZGVkdXAobG9jYWwpLmNvdW50KGxvY2FsKS53aGVyZShlcSgibCIpKSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGxhc3QsICJ0IikuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90KHNlbGVjdChhbGwsICJwIikuYXMoInAiKS5jb3VudChsb2NhbCkuYXMoImwiKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbGwsICJ4IikudW5mb2xkKCkuZmlsdGVyKHNlbGVjdChrZXlzKS53aGVyZShlcSgidCIpKS5ieShzZWxlY3QoInNyYyIsICJ0Z3QiKSkpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNlbGVjdCh2YWx1ZXMpLnVuZm9sZCgpLm9yKGNvdW50KGxvY2FsKS53aGVyZShsdCgibCIpKSwgd2hlcmUoZXEoInAiKSkpKSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbGwsICJ4IikudW5mb2xkKCkuZmlsdGVyKHNlbGVjdChrZXlzKS53aGVyZShlcSgidCIpKS5ieShzZWxlY3QoInNyYyIsICJ0Z3QiKSkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2VsZWN0KHZhbHVlcykudW5mb2xkKCkub3IoY291bnQobG9jYWwpLndoZXJlKGx0KCJsIikpLCB3aGVyZShlcSgicCIpKSkpKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJyaWVyKCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAoIngiKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieShzZWxlY3QoInNyYyIsICJ0Z3QiKSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkoc2VsZWN0KGFsbCwgInAiKS5mb2xkKCkpLnNlbGVjdCgidGd0IikuYmFycmllcigpKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5KHNlbGVjdCgic3JjIiwgInRndCIpKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5KHNlbGVjdChhbGwsICJwIikuZm9sZCgpKS5zZWxlY3QoInRndCIpLmJhcnJpZXIoKSkuCiAgICAgICAgICAgICAgICAgICAgIGNhcCgieCIpLnNlbGVjdCh2YWx1ZXMpLnVuZm9sZCgpLnVuZm9sZCgpLm1hcCh1bmZvbGQoKS5pZCgpLmZvbGQoKSk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9EZWR1cFRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvRGVkdXBUZXN0LmphdmEKaW5kZXggMDg3N2RkYi4uZDgzNDJmMyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9EZWR1cFRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL0RlZHVwVGVzdC5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEuQ1JFVzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoLkdyYXBoRGF0YS5NT0RFUk47CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fLmJvdGg7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fLmJvdGhFOwpAQCAtOTEsNiArOTIsMTIgQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBMb25nPiBnZXRfZ19WX3JlcGVhdFhkZWR1cFhfdGltZXNYMlhfY291bnQoKTsKIAorICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBMb25nPiBnZXRfZ19WX2JvdGhFX3Byb3BlcnRpZXNfZGVkdXBfY291bnQoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBMb25nPiBnZXRfZ19WX2JvdGhfcHJvcGVydGllc19kZWR1cF9jb3VudCgpOworCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIExvbmc+IGdldF9nX1ZfYm90aF9wcm9wZXJ0aWVzX3Byb3BlcnRpZXNfZGVkdXBfY291bnQoKTsKKwogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQogICAgIHB1YmxpYyB2b2lkIGdfVl9vdXRfaW5fdmFsdWVzWG5hbWVYX2ZvbGRfZGVkdXBYbG9jYWxYX3VuZm9sZCgpIHsKQEAgLTMxMiw2ICszMTksMzMgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UodHJhdmVyc2FsLmhhc05leHQoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgcHVibGljIHZvaWQgZ19WX2JvdGhFX3Byb3BlcnRpZXNfZGVkdXBfY291bnQoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIExvbmc+IHRyYXZlcnNhbCA9IGdldF9nX1ZfYm90aEVfcHJvcGVydGllc19kZWR1cF9jb3VudCgpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDRMLCB0cmF2ZXJzYWwubmV4dCgpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodHJhdmVyc2FsLmhhc05leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgcHVibGljIHZvaWQgZ19WX2JvdGhfcHJvcGVydGllc19kZWR1cF9jb3VudCgpIHsKKyAgICAgICAgLy8gdmVydGV4IHByb3BlcnRpZXMgYmVoYXZlIGxpa2UgRWxlbWVudCB3aXRoIHRoZWlyIGRlZHVwKCkgc28gMTIgaXMgdGhlIHJpZ2h0IG51bWJlciB0aGVyZQorICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBMb25nPiB0cmF2ZXJzYWwgPSBnZXRfZ19WX2JvdGhfcHJvcGVydGllc19kZWR1cF9jb3VudCgpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyTCwgdHJhdmVyc2FsLm5leHQoKS5sb25nVmFsdWUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQExvYWRHcmFwaFdpdGgoQ1JFVykKKyAgICBwdWJsaWMgdm9pZCBnX1ZfYm90aF9wcm9wZXJ0aWVzX3Byb3BlcnRpZXNfZGVkdXBfY291bnQoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIExvbmc+IHRyYXZlcnNhbCA9IGdldF9nX1ZfYm90aF9wcm9wZXJ0aWVzX3Byb3BlcnRpZXNfZGVkdXBfY291bnQoKTsKKyAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMUwsIHRyYXZlcnNhbC5uZXh0KCkubG9uZ1ZhbHVlKCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0cmF2ZXJzYWwuaGFzTmV4dCgpKTsKKyAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyYXZlcnNhbHMgZXh0ZW5kcyBEZWR1cFRlc3QgewogICAgICAgICBAT3ZlcnJpZGUKQEAgLTM5Myw1ICs0MjcsMjAgQEAKICAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIExvbmc+IGdldF9nX1ZfcmVwZWF0WGRlZHVwWF90aW1lc1gyWF9jb3VudCgpIHsKICAgICAgICAgICAgIHJldHVybiBnLlYoKS5yZXBlYXQoZGVkdXAoKSkudGltZXMoMikuY291bnQoKTsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTG9uZz4gZ2V0X2dfVl9ib3RoRV9wcm9wZXJ0aWVzX2RlZHVwX2NvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGcuVigpLmJvdGhFKCkucHJvcGVydGllcygpLmRlZHVwKCkuY291bnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTG9uZz4gZ2V0X2dfVl9ib3RoX3Byb3BlcnRpZXNfZGVkdXBfY291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkuYm90aCgpLnByb3BlcnRpZXMoKS5kZWR1cCgpLmNvdW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIExvbmc+IGdldF9nX1ZfYm90aF9wcm9wZXJ0aWVzX3Byb3BlcnRpZXNfZGVkdXBfY291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkuYm90aCgpLnByb3BlcnRpZXMoKS5wcm9wZXJ0aWVzKCkuZGVkdXAoKS5jb3VudCgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9SYW5nZVRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvUmFuZ2VUZXN0LmphdmEKaW5kZXggM2E1NjViZS4uNTQ4MDEwOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9SYW5nZVRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL1JhbmdlVGVzdC5qYXZhCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY2VuYXJpbzogbGltaXQgc3RlcCwgU2NvcGUubG9jYWwsID4xIGl0ZW0gcmVxdWVzdGVkLCBMaXN0PFN0cmluZz4gaW5wdXQsIExpc3Q8U3RyaW5nPiBvdXRwdXQKKyAgICAgKiBTY2VuYXJpbzogbGltaXQgc3RlcCwgU2NvcGUubG9jYWwsICZndDsxIGl0ZW0gcmVxdWVzdGVkLCBMaXN0Jmx0O1N0cmluZyZndDsgaW5wdXQsIExpc3QmbHQ7U3RyaW5nJmd0OyBvdXRwdXQKICAgICAgKi8KICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjZW5hcmlvOiByYW5nZSBzdGVwLCBTY29wZS5sb2NhbCwgPjEgaXRlbSByZXF1ZXN0ZWQsIExpc3Q8U3RyaW5nPiBpbnB1dCwgTGlzdDxTdHJpbmc+IG91dHB1dAorICAgICAqIFNjZW5hcmlvOiByYW5nZSBzdGVwLCBTY29wZS5sb2NhbCwgJmd0OzEgaXRlbSByZXF1ZXN0ZWQsIExpc3QmbHQ7U3RyaW5nJmd0OyBpbnB1dCwgTGlzdCZsdDtTdHJpbmcmZ3Q7IG91dHB1dAogICAgICAqLwogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQpAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2NlbmFyaW86IGxpbWl0IHN0ZXAsIFNjb3BlLmxvY2FsLCA+MSBpdGVtIHJlcXVlc3RlZCwgTWFwIGlucHV0LCBNYXAgb3V0cHV0CisgICAgICogU2NlbmFyaW86IGxpbWl0IHN0ZXAsIFNjb3BlLmxvY2FsLCAmZ3Q7MSBpdGVtIHJlcXVlc3RlZCwgTWFwIGlucHV0LCBNYXAgb3V0cHV0CiAgICAgICovCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCkBAIC0yODYsNyArMjg2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY2VuYXJpbzogcmFuZ2Ugc3RlcCwgU2NvcGUubG9jYWwsID4xIGl0ZW0gcmVxdWVzdGVkLCBNYXAgaW5wdXQsIE1hcCBvdXRwdXQKKyAgICAgKiBTY2VuYXJpbzogcmFuZ2Ugc3RlcCwgU2NvcGUubG9jYWwsICZndDsxIGl0ZW0gcmVxdWVzdGVkLCBNYXAgaW5wdXQsIE1hcCBvdXRwdXQKICAgICAgKi8KICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvVGFpbFRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9maWx0ZXIvVGFpbFRlc3QuamF2YQppbmRleCBmNDhkMGFmLi5jZTAyYmIzIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvZmlsdGVyL1RhaWxUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL2ZpbHRlci9UYWlsVGVzdC5qYXZhCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY2VuYXJpbzogTG9jYWwgc2NvcGUsIExpc3QgaW5wdXQsIE4+MQorICAgICAqIFNjZW5hcmlvOiBMb2NhbCBzY29wZSwgTGlzdCBpbnB1dCwgTiZndDsxCiAgICAgICovCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCkBAIC0yMDIsNyArMjAyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY2VuYXJpbzogTG9jYWwgc2NvcGUsIE1hcCBpbnB1dCwgTj4xCisgICAgICogU2NlbmFyaW86IExvY2FsIHNjb3BlLCBNYXAgaW5wdXQsIE4mZ3Q7MQogICAgICAqLwogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRFZGdlVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRFZGdlVGVzdC5qYXZhCmluZGV4IDU0YzQwOTEuLjFlN2YxNjIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkRWRnZVRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0FkZEVkZ2VUZXN0LmphdmEKQEAgLTQ0LDYgKzQ0LDggQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX18uc2VsZWN0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Db2x1bW4ua2V5czsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuQ29sdW1uLnZhbHVlczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogCkBAIC01OCw2ICs2MCw4IEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgRWRnZT4gZ2V0X2dfVlgxWF9hc1hhWF9vdXRYY3JlYXRlZFhfYWRkRVhjcmVhdGVkQnlYX3RvWGFYX3Byb3BlcnR5WHdlaWdodF8yWChmaW5hbCBPYmplY3QgdjFJZCk7CiAKKyAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgRWRnZT4gZ2V0X2dfVl9vdXRFX3Byb3BlcnR5WHdlaWdodF9udWxsWCgpOworCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIEVkZ2U+IGdldF9nX1ZfYWdncmVnYXRlWHhYX2FzWGFYX3NlbGVjdFh4WF91bmZvbGRfYWRkRVhleGlzdHNXaXRoWF90b1hhWF9wcm9wZXJ0eVh0aW1lX25vd1goKTsKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBFZGdlPiBnZXRfZ19WX2FzWGFYX291dFhjcmVhdGVkWF9pblhjcmVhdGVkWF93aGVyZVhuZXFYYVhYX2FzWGJYX2FkZEVYY29kZXZlbG9wZXJYX2Zyb21YYVhfdG9YYlhfcHJvcGVydHlYeWVhcl8yMDA5WCgpOwpAQCAtMTIwLDYgKzEyNCwxNSBAQAogCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgQEZlYXR1cmVSZXF1aXJlbWVudChmZWF0dXJlQ2xhc3MgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLkZFQVRVUkVfTlVMTF9QUk9QRVJUWV9WQUxVRVMsIHN1cHBvcnRlZCA9IGZhbHNlKQorICAgIHB1YmxpYyB2b2lkIGdfVl9vdXRFX3Byb3BlcnR5WHdlaWdodF9udWxsWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgRWRnZT4gdHJhdmVyc2FsID0gZ2V0X2dfVl9vdXRFX3Byb3BlcnR5WHdlaWdodF9udWxsWCgpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgdHJhdmVyc2FsLmZvckVhY2hSZW1haW5pbmcoZSAtPiBhc3NlcnRUaGF0KGUucHJvcGVydGllcygid2VpZ2h0IikuaGFzTmV4dCgpLCBpcyhmYWxzZSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5GRUFUVVJFX0FERF9FREdFUykKICAgICBwdWJsaWMgdm9pZCBnX1ZfYWdncmVnYXRlWHhYX2FzWGFYX3NlbGVjdFh4WF91bmZvbGRfYWRkRVhleGlzdHNXaXRoWF90b1hhWF9wcm9wZXJ0eVh0aW1lX25vd1goKSB7CiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIEVkZ2U+IHRyYXZlcnNhbCA9IGdldF9nX1ZfYWdncmVnYXRlWHhYX2FzWGFYX3NlbGVjdFh4WF91bmZvbGRfYWRkRVhleGlzdHNXaXRoWF90b1hhWF9wcm9wZXJ0eVh0aW1lX25vd1goKTsKQEAgLTMwNiw2ICszMTksMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgRWRnZT4gZ2V0X2dfVl9vdXRFX3Byb3BlcnR5WHdlaWdodF9udWxsWCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnLlYoKS5vdXRFKCkucHJvcGVydHkoIndlaWdodCIsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8VmVydGV4LCBFZGdlPiBnZXRfZ19WX2FnZ3JlZ2F0ZVh4WF9hc1hhWF9zZWxlY3RYeFhfdW5mb2xkX2FkZEVYZXhpc3RzV2l0aFhfdG9YYVhfcHJvcGVydHlYdGltZV9ub3dYKCkgewogICAgICAgICAgICAgcmV0dXJuIGcuVigpLmFnZ3JlZ2F0ZSgieCIpLmFzKCJhIikuc2VsZWN0KCJ4IikudW5mb2xkKCkuYWRkRSgiZXhpc3RzV2l0aCIpLnRvKCJhIikucHJvcGVydHkoInRpbWUiLCAibm93Iik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQWRkVmVydGV4VGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRWZXJ0ZXhUZXN0LmphdmEKaW5kZXggMjFmYmI4Yy4uYWQwZTFkZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRWZXJ0ZXhUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9BZGRWZXJ0ZXhUZXN0LmphdmEKQEAgLTQwLDggKzQwLDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEuTU9ERVJOOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXy5WOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXy5zZWxlY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgpAQCAtNTYsNiArNTksMTIgQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBWZXJ0ZXg+IGdldF9nX2FkZFZYcGVyc29uWF9wcm9wZXJ0eVhuYW1lX3N0ZXBoZW5YKCk7CiAKKyAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcHJvcGVydHlYbmFtZV9udWxsWCgpOworCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfYWRkVlhudWxsWF9wcm9wZXJ0eVhpZF9udWxsWCgpOworCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfYWRkVl9wcm9wZXJ0eVhsYWJlbF9wZXJzb25YKCk7CisKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBnZXRfZ19hZGRWWHBlcnNvblhfcHJvcGVydHlYc2luZ2xlX25hbWVfc3RlcGhlblhfcHJvcGVydHlYc2luZ2xlX25hbWVfc3RlcGhlbm1YKCk7CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBnZXRfZ19hZGRWWHBlcnNvblhfcHJvcGVydHlYc2luZ2xlX25hbWVfc3RlcGhlblhfcHJvcGVydHlYc2luZ2xlX25hbWVfc3RlcGhlbm1fc2luY2VfMjAxMFgoKTsKQEAgLTkxLDcgKzEwMCw2IEBACiAgICAgICAgIGFzc2VydEVxdWFscyg3LCBJdGVyYXRvclV0aWxzLmNvdW50KGcuVigpKSk7CiAgICAgfQogCi0KICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9BRERfVkVSVElDRVMpCkBAIC0xMTIsNiArMTIwLDMxIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9BRERfVkVSVElDRVMpCisgICAgQEZlYXR1cmVSZXF1aXJlbWVudChmZWF0dXJlQ2xhc3MgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLkZFQVRVUkVfQUREX1BST1BFUlRZKQorICAgIHB1YmxpYyB2b2lkIGdfYWRkVlhudWxsWF9wcm9wZXJ0eVhpZF9udWxsWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiB0cmF2ZXJzYWwgPSBnZXRfZ19hZGRWWG51bGxYX3Byb3BlcnR5WGlkX251bGxYKCk7CisgICAgICAgIHByaW50VHJhdmVyc2FsRm9ybSh0cmF2ZXJzYWwpOworCisgICAgICAgIGZpbmFsIFZlcnRleCB2ZXJ0ZXggPSB0cmF2ZXJzYWwubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoVmVydGV4LkRFRkFVTFRfTEFCRUwsIHZlcnRleC5sYWJlbCgpKTsKKworICAgICAgICAvLyBzaG91bGQgZ2VuZXJhdGUgYW4gaWQgZm9yIHRoZSBudWxsIHZhbHVlCisgICAgICAgIGFzc2VydE5vdE51bGwodmVydGV4LmlkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEZlYXR1cmVSZXF1aXJlbWVudChmZWF0dXJlQ2xhc3MgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLkZFQVRVUkVfQUREX1ZFUlRJQ0VTKQorICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX0FERF9QUk9QRVJUWSkKKyAgICBwdWJsaWMgdm9pZCBnX2FkZFZfcHJvcGVydHlYbGFiZWxfcGVyc29uWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiB0cmF2ZXJzYWwgPSBnZXRfZ19hZGRWX3Byb3BlcnR5WGxhYmVsX3BlcnNvblgoKTsKKyAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CisKKyAgICAgICAgZmluYWwgVmVydGV4IHZlcnRleCA9IHRyYXZlcnNhbC5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGVyc29uIiwgdmVydGV4LmxhYmVsKCkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQogICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX0FERF9WRVJUSUNFUykKICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9BRERfUFJPUEVSVFkpCkBAIC0xMjgsNiArMTYxLDE1IEBACiAKICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKKyAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9OVUxMX1BST1BFUlRZX1ZBTFVFUywgc3VwcG9ydGVkID0gZmFsc2UpCisgICAgcHVibGljIHZvaWQgZ19WX2hhc0xhYmVsWHBlcnNvblhfcHJvcGVydHlYbmFtZV9udWxsWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiB0cmF2ZXJzYWwgPSBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcHJvcGVydHlYbmFtZV9udWxsWCgpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgdHJhdmVyc2FsLmZvckVhY2hSZW1haW5pbmcodiAtPiBhc3NlcnRUaGF0KHYucHJvcGVydGllcygibmFtZSIpLmhhc05leHQoKSwgaXMoZmFsc2UpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCiAgICAgQEZlYXR1cmVSZXF1aXJlbWVudChmZWF0dXJlQ2xhc3MgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLkZFQVRVUkVfQUREX1ZFUlRJQ0VTKQogICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX0FERF9QUk9QRVJUWSkKICAgICBwdWJsaWMgdm9pZCBnX2FkZFZYcGVyc29uWF9wcm9wZXJ0eVhzaW5nbGVfbmFtZV9zdGVwaGVuWF9wcm9wZXJ0eVhzaW5nbGVfbmFtZV9zdGVwaGVubVgoKSB7CkBAIC0zMTUsNiArMzU3LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfVl9oYXNMYWJlbFhwZXJzb25YX3Byb3BlcnR5WG5hbWVfbnVsbFgoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkuaGFzTGFiZWwoInBlcnNvbiIpLnByb3BlcnR5KCJuYW1lIiwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfYWRkVlhwZXJzb25YX3Byb3BlcnR5WHNpbmdsZV9uYW1lX3N0ZXBoZW5YX3Byb3BlcnR5WHNpbmdsZV9uYW1lX3N0ZXBoZW5tWCgpIHsKICAgICAgICAgICAgIHJldHVybiBnLmFkZFYoInBlcnNvbiIpLnByb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZSwgIm5hbWUiLCAic3RlcGhlbiIpLnByb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZSwgIm5hbWUiLCAic3RlcGhlbm0iKTsKICAgICAgICAgfQpAQCAtMzYzLDUgKzQxMCwxNiBAQAogICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgT2JqZWN0Pj4gZ2V0X2dfVl9hc1hhWF9oYXNYbmFtZV9tYXJrb1hfb3V0WGNyZWF0ZWRYX2FzWGJYX2FkZFZYc2VsZWN0WGFYX2xhYmVsWF9wcm9wZXJ0eVh0ZXN0X3NlbGVjdFhiWF9sYWJlbFhfdmFsdWVNYXBfd2l0aFh0b2tlbnNYKCkgewogICAgICAgICAgICAgcmV0dXJuIGcuVigpLmFzKCJhIikuaGFzKCJuYW1lIiwgIm1hcmtvIikub3V0KCJjcmVhdGVkIikuYXMoImIiKS5hZGRWKHNlbGVjdCgiYSIpLmxhYmVsKCkpLnByb3BlcnR5KCJ0ZXN0Iiwgc2VsZWN0KCJiIikubGFiZWwoKSkudmFsdWVNYXAoKS53aXRoKFdpdGhPcHRpb25zLnRva2Vucyk7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfYWRkVlhudWxsWF9wcm9wZXJ0eVhpZF9udWxsWCgpIHsKKyAgICAgICAgICAgIC8vIHRlc3RpbmcgVHJhdmVyc2FsIGJ1dCBzaG91bGQgd29yayB0aGUgc2FtZSBmb3IgU3RyaW5nCisgICAgICAgICAgICByZXR1cm4gZy5hZGRWKChUcmF2ZXJzYWwuQWRtaW48PywgU3RyaW5nPikgbnVsbCkucHJvcGVydHkoVC5pZCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfYWRkVl9wcm9wZXJ0eVhsYWJlbF9wZXJzb25YKCkgeworICAgICAgICAgICAgcmV0dXJuIGcuYWRkVigpLnByb3BlcnR5KFQubGFiZWwsICJwZXJzb24iKTsKKyAgICAgICAgfQogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0NvbnN0YW50VGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Db25zdGFudFRlc3QuamF2YQppbmRleCBlMzVkYjQzLi4wN2E3YjU1IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL0NvbnN0YW50VGVzdC5qYXZhCisrKyBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvQ29uc3RhbnRUZXN0LmphdmEKQEAgLTQ2LDkgKzQ2LDEwIEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgSW50ZWdlcj4gZ2V0X2dfVl9jb25zdGFudFgxMjNYKCk7CiAKKyAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgVm9pZD4gZ2V0X2dfVl9jb25zdGFudFhudWxsWCgpOworCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFN0cmluZz4gZ2V0X2dfVl9jaG9vc2VYaGFzTGFiZWxYcGVyc29uWF92YWx1ZXNYbmFtZVhfY29uc3RhbnRYaW5odW1hblhYKCk7CiAKLSAgICAvKiogU2NlbmFyaW86IFRyaXZpYWwgdXNlIGNhc2UgZnJvbSBHcmFwaFRyYXZlcnNhbCAqLwogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQogICAgIHB1YmxpYyB2b2lkIGdfVl9jb25zdGFudFgxMjNYKCkgewpAQCAtNTYsNiArNTcsMTMgQEAKICAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDEyMywgMTIzLCAxMjMsIDEyMywgMTIzLCAxMjMpLCB0cmF2ZXJzYWwudG9MaXN0KCkpOwogICAgIH0KKyAgICBAVGVzdAorICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKKyAgICBwdWJsaWMgdm9pZCBnX1ZfY29uc3RhbnRYbnVsbFgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIFZvaWQ+IHRyYXZlcnNhbCA9IGdldF9nX1ZfY29uc3RhbnRYbnVsbFgoKTsKKyAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLCB0cmF2ZXJzYWwudG9MaXN0KCkpOworICAgIH0KIAogICAgIC8qKiBTY2VuYXJpbzogQW5vbnltb3VzIHRyYXZlcnNhbCB3aXRoaW4gY2hvb3NlICovCiAgICAgQFRlc3QKQEAgLTc0LDYgKzgyLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFZvaWQ+IGdldF9nX1ZfY29uc3RhbnRYbnVsbFgoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkuY29uc3RhbnQobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFN0cmluZz4gZ2V0X2dfVl9jaG9vc2VYaGFzTGFiZWxYcGVyc29uWF92YWx1ZXNYbmFtZVhfY29uc3RhbnRYaW5odW1hblhYKCkgewogICAgICAgICAgICAgcmV0dXJuIGcuVigpLmNob29zZShoYXNMYWJlbCgicGVyc29uIiksIHZhbHVlcygibmFtZSIpLCBjb25zdGFudCgiaW5odW1hbiIpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9NYXBUZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01hcFRlc3QuamF2YQppbmRleCA5MDA2ZmVjLi4zNWZhYTAzIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01hcFRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL01hcFRlc3QuamF2YQpAQCAtMzEsOSArMzEsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkxvYWRHcmFwaFdpdGguR3JhcGhEYXRhLk1PREVSTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX18uY29uc3RhbnQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fLnNlbGVjdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKQEAgLTUzLDYgKzU1LDggQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBWZXJ0ZXg+IGdldF9nX1ZfbWFwWHNlbGVjdFhhWFgoKTsKIAorICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBWZXJ0ZXg+IGdldF9nX1ZfbWFwWGNvbnN0YW50WG51bGxYWCgpOworCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCiAgICAgcHVibGljIHZvaWQgZ19WWDFYX21hcFhuYW1lWCgpIHsKQEAgLTEzOSw2ICsxNDMsMTkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGNvdW50ZXIpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQorICAgIHB1YmxpYyB2b2lkIGdfVl9tYXBYY29uc3RhbnRYbnVsbFhYKCkgeworICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBWZXJ0ZXg+IHRyYXZlcnNhbCA9IGdldF9nX1ZfbWFwWGNvbnN0YW50WG51bGxYWCgpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICB3aGlsZSAodHJhdmVyc2FsLmhhc05leHQoKSkgeworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAgICAgYXNzZXJ0TnVsbCh0cmF2ZXJzYWwubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoNiwgY291bnRlcik7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmF2ZXJzYWxzIGV4dGVuZHMgTWFwVGVzdCB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgU3RyaW5nPiBnZXRfZ19WWDFYX21hcFhuYW1lWChmaW5hbCBPYmplY3QgdjFJZCkgewpAQCAtMTY5LDUgKzE4NiwxMCBAQAogICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBnZXRfZ19WX21hcFhzZWxlY3RYYVhYKCkgewogICAgICAgICAgICAgcmV0dXJuIGcuVigpLmFzKCJhIikubWFwKHNlbGVjdCgiYSIpKTsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBnZXRfZ19WX21hcFhjb25zdGFudFhudWxsWFgoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkubWFwKGNvbnN0YW50KG51bGwpKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvT3JkZXJUZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL09yZGVyVGVzdC5qYXZhCmluZGV4IGVkY2EzMWQuLjY3NGQxYTEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvT3JkZXJUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9PcmRlclRlc3QuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwudXRpbC5UcmF2ZXJzYWxIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlByb3BlcnR5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNjQsMTQgKzY1LDEwIEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgU3RyaW5nPiBnZXRfZ19WX25hbWVfb3JkZXJfYnlYYTFfYjFYX2J5WGIyX2EyWCgpOwogCi0gICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFN0cmluZz4gZ2V0X2dfVl9vcmRlcl9ieVhuYW1lX2luY3JYX25hbWUoKTsKLQogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBTdHJpbmc+IGdldF9nX1Zfb3JkZXJfYnlYbmFtZV9hc2NYX25hbWUoKTsKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBTdHJpbmc+IGdldF9nX1Zfb3JkZXJfYnlYbmFtZVhfbmFtZSgpOwogCi0gICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIERvdWJsZT4gZ2V0X2dfVl9vdXRFX29yZGVyX2J5WHdlaWdodF9kZWNyWF93ZWlnaHQoKTsKLQogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBEb3VibGU+IGdldF9nX1Zfb3V0RV9vcmRlcl9ieVh3ZWlnaHRfZGVzY1hfd2VpZ2h0KCk7CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgU3RyaW5nPiBnZXRfZ19WX29yZGVyX2J5WG5hbWVfYTFfYjFYX2J5WG5hbWVfYjJfYTJYX25hbWUoKTsKQEAgLTExMCw2ICsxMDcsMTAgQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+PiBnZXRfZ19WWDFYX2VsZW1lbnRNYXBfb3JkZXJYbG9jYWxYX2J5WGtleXNfZGVzY1h1bmZvbGQoZmluYWwgT2JqZWN0IHYxSWQpOwogCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfVl9vcmRlcl9ieVhsYWJlbFgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBWZXJ0ZXg+IGdldF9nX1Zfb3JkZXJfYnlYbGFiZWxfZGVzY1goKTsKKwogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQogICAgIHB1YmxpYyB2b2lkIGdfVl9uYW1lX29yZGVyKCkgewpAQCAtMTI4LDE0ICsxMjksNiBAQAogCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgZ19WX29yZGVyX2J5WG5hbWVfaW5jclhfbmFtZSgpIHsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgU3RyaW5nPiB0cmF2ZXJzYWwgPSBnZXRfZ19WX29yZGVyX2J5WG5hbWVfaW5jclhfbmFtZSgpOwotICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKLSAgICAgICAgY2hlY2tPcmRlcmVkUmVzdWx0cyhBcnJheXMuYXNMaXN0KCJqb3NoIiwgImxvcCIsICJtYXJrbyIsICJwZXRlciIsICJyaXBwbGUiLCAidmFkYXMiKSwgdHJhdmVyc2FsKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBwdWJsaWMgdm9pZCBnX1Zfb3JkZXJfYnlYbmFtZV9hc2NYX25hbWUoKSB7CiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIFN0cmluZz4gdHJhdmVyc2FsID0gZ2V0X2dfVl9vcmRlcl9ieVhuYW1lX2FzY1hfbmFtZSgpOwogICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKQEAgLTE1MiwxNCArMTQ1LDYgQEAKIAogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQotICAgIHB1YmxpYyB2b2lkIGdfVl9vdXRFX29yZGVyX2J5WHdlaWdodF9kZWNyWF93ZWlnaHQoKSB7Ci0gICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIERvdWJsZT4gdHJhdmVyc2FsID0gZ2V0X2dfVl9vdXRFX29yZGVyX2J5WHdlaWdodF9kZWNyWF93ZWlnaHQoKTsKLSAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7Ci0gICAgICAgIGNoZWNrT3JkZXJlZFJlc3VsdHMoQXJyYXlzLmFzTGlzdCgxLjBkLCAxLjBkLCAwLjVkLCAwLjRkLCAwLjRkLCAwLjJkKSwgdHJhdmVyc2FsKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBwdWJsaWMgdm9pZCBnX1Zfb3V0RV9vcmRlcl9ieVh3ZWlnaHRfZGVzY1hfd2VpZ2h0KCkgewogICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBEb3VibGU+IHRyYXZlcnNhbCA9IGdldF9nX1Zfb3V0RV9vcmRlcl9ieVh3ZWlnaHRfZGVzY1hfd2VpZ2h0KCk7CiAgICAgICAgIHByaW50VHJhdmVyc2FsRm9ybSh0cmF2ZXJzYWwpOwpAQCAtNDI1LDYgKzQxMCwyMiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMS45LCBlbnRyeS5nZXRWYWx1ZSgpLmRvdWJsZVZhbHVlKCksIDAuMDAwMSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZ19WX29yZGVyX2J5WGxhYmVsWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiB0cmF2ZXJzYWwgPSBnZXRfZ19WX29yZGVyX2J5WGxhYmVsWCgpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJhdmVyc2FsLmhhc05leHQoKSk7CisgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IHRyYXZlcnNhbC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBlcnNvbiIsIHYubGFiZWwoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJhdmVyc2FsLmhhc05leHQoKSk7CisgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IHRyYXZlcnNhbC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNvZnR3YXJlIiwgdi5sYWJlbCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZSh0cmF2ZXJzYWwuaGFzTmV4dCgpKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBwdWJsaWMgdm9pZCBnX1ZfaGFzTGFiZWxYcGVyc29uWF9ncm91cF9ieVhuYW1lWF9ieVhvdXRFX3dlaWdodF9zdW1YX3VuZm9sZF9vcmRlcl9ieVh2YWx1ZXNfZGVzY1goKSB7CkBAIC00NDgsNiArNDQ5LDIyIEBACiAgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGdfVl9vcmRlcl9ieVhsYWJlbF9kZXNjWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiB0cmF2ZXJzYWwgPSBnZXRfZ19WX29yZGVyX2J5WGxhYmVsX2Rlc2NYKCk7CisgICAgICAgIHByaW50VHJhdmVyc2FsRm9ybSh0cmF2ZXJzYWwpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cmF2ZXJzYWwuaGFzTmV4dCgpKTsKKyAgICAgICAgICAgIGZpbmFsIFZlcnRleCB2ID0gdHJhdmVyc2FsLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygic29mdHdhcmUiLCB2LmxhYmVsKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOworICAgICAgICAgICAgZmluYWwgVmVydGV4IHYgPSB0cmF2ZXJzYWwubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwZXJzb24iLCB2LmxhYmVsKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQogICAgIHB1YmxpYyB2b2lkIGdfVlgxWF9lbGVtZW50TWFwX29yZGVyWGxvY2FsWF9ieVhrZXlzX2Rlc2NYdW5mb2xkKCkgewpAQCAtNDg5LDExICs1MDYsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8VmVydGV4LCBTdHJpbmc+IGdldF9nX1Zfb3JkZXJfYnlYbmFtZV9pbmNyWF9uYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGcuVigpLm9yZGVyKCkuYnkoIm5hbWUiLCBPcmRlci5pbmNyKS52YWx1ZXMoIm5hbWUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgU3RyaW5nPiBnZXRfZ19WX29yZGVyX2J5WG5hbWVfYXNjWF9uYW1lKCkgewogICAgICAgICAgICAgcmV0dXJuIGcuVigpLm9yZGVyKCkuYnkoIm5hbWUiLCBPcmRlci5hc2MpLnZhbHVlcygibmFtZSIpOwogICAgICAgICB9CkBAIC01MDQsMTEgKzUxNiw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIERvdWJsZT4gZ2V0X2dfVl9vdXRFX29yZGVyX2J5WHdlaWdodF9kZWNyWF93ZWlnaHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZy5WKCkub3V0RSgpLm9yZGVyKCkuYnkoIndlaWdodCIsIE9yZGVyLmRlY3IpLnZhbHVlcygid2VpZ2h0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIERvdWJsZT4gZ2V0X2dfVl9vdXRFX29yZGVyX2J5WHdlaWdodF9kZXNjWF93ZWlnaHQoKSB7CiAgICAgICAgICAgICByZXR1cm4gZy5WKCkub3V0RSgpLm9yZGVyKCkuYnkoIndlaWdodCIsIGRlc2MpLnZhbHVlcygid2VpZ2h0Iik7CiAgICAgICAgIH0KQEAgLTYxMSw1ICs2MTgsMTQgQEAKICAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4+IGdldF9nX1ZYMVhfZWxlbWVudE1hcF9vcmRlclhsb2NhbFhfYnlYa2V5c19kZXNjWHVuZm9sZChmaW5hbCBPYmplY3QgdjFJZCkgewogICAgICAgICAgICAgcmV0dXJuIGcuVih2MUlkKS5lbGVtZW50TWFwKCkub3JkZXIoU2NvcGUubG9jYWwpLmJ5KGtleXMsIGRlc2MpLnVuZm9sZCgpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfVl9vcmRlcl9ieVhsYWJlbFgoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkub3JkZXIoKS5ieShfXy5sYWJlbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBnZXRfZ19WX29yZGVyX2J5WGxhYmVsX2Rlc2NYKCkgeworICAgICAgICAgICAgcmV0dXJuIGcuVigpLm9yZGVyKCkuYnkoX18ubGFiZWwoKSwgT3JkZXIuZGVzYyk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1BhZ2VSYW5rVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9QYWdlUmFua1Rlc3QuamF2YQppbmRleCA4NjRlYmIwLi4zM2JhODA1IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1BhZ2VSYW5rVGVzdC5qYXZhCisrKyBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUGFnZVJhbmtUZXN0LmphdmEKQEAgLTUxLDI0ICs1MSwyMiBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFZlcnRleD4gZ2V0X2dfVl9wYWdlUmFua19oYXNYcGFnZVJhbmtYKCk7CiAKLSAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gZ2V0X2dfVl9vdXRYY3JlYXRlZFhfcGFnZVJhbmtfYnlYYm90aEVYX2J5WHByb2plY3RSYW5rWF90aW1lc1gwWF92YWx1ZU1hcFhuYW1lX3Byb2plY3RSYW5rWCgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+PiBnZXRfZ19WX291dFhjcmVhdGVkWF9wYWdlUmFua193aXRoWGVkZ2VzX2JvdGhFWF93aXRoWHByb3BlcnR5TmFtZV9wcm9qZWN0UmFua1h3aXRoWHRpbWVzXzBYX3ZhbHVlTWFwWG5hbWVfcHJvamVjdFJhbmtYKCk7CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgU3RyaW5nPiBnZXRfZ19WX3BhZ2VSYW5rX29yZGVyX2J5WHBhZ2VSYW5rX2Rlc2NYX2J5WG5hbWVYX25hbWUoKTsKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBTdHJpbmc+IGdldF9nX1ZfcGFnZVJhbmtfb3JkZXJfYnlYcGFnZVJhbmtfZGVzY1hfbmFtZV9saW1pdFgyWCgpOwogCi0gICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGdldF9nX1ZfcGFnZVJhbmtfYnlYb3V0RVhrbm93c1hYX2J5WGZyaWVuZFJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWGZyaWVuZFJhbmtYX21hdGhYKCk7CisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGdldF9nX1ZfcGFnZVJhbmtfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfd2l0aFhwcm9wZXJ0eU5hbWVfZnJpZW5kUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYZnJpZW5kUmFua1hfbWF0aFgoKTsKIAotICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfYnlYcGFnZVJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWHBhZ2VSYW5rWF9tYXRoWCgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcGFnZVJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWHBhZ2VSYW5rWF9tYXRoWCgpOwogCi0gICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGdldF9nX1ZfcGFnZVJhbmtfYnlYcGFnZVJhbmtYX2FzWGFYX291dFhrbm93c1hfcGFnZVJhbmtfYXNYYlhfc2VsZWN0WGFfYlhfYnlfYnlYbWF0aFgoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0X2dfVl9wYWdlUmFua193aXRoWHByb3BlcnR5TmFtZV9wYWdlUmFua1hfYXNYYVhfb3V0WGtub3dzWF9wYWdlUmFua19hc1hiWF9zZWxlY3RYYV9iWF9ieV9ieVhtYXRoWCgpOwogCi0gICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4+IGdldF9nX1ZfaGFzTGFiZWxYc29mdHdhcmVYX2hhc1huYW1lX3JpcHBsZVhfcGFnZVJhbmtYMVhfYnlYaW5FWGNyZWF0ZWRYWF90aW1lc1gxWF9ieVhwcmlvcnNYX2luWGNyZWF0ZWRYX3VuaW9uWGJvdGhfX2lkZW50aXR5WF92YWx1ZU1hcFhuYW1lX3ByaW9yc1goKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gZ2V0X2dfVl9oYXNMYWJlbFhzb2Z0d2FyZVhfaGFzWG5hbWVfcmlwcGxlWF9wYWdlUmFua1gxWF93aXRoWGVkZ2VzX2luRVhjcmVhdGVkWFhfd2l0aFh0aW1lc18xWF93aXRoWHByb3BlcnR5TmFtZV9wcmlvcnNYX2luWGNyZWF0ZWRYX3VuaW9uWGJvdGhfX2lkZW50aXR5WF92YWx1ZU1hcFhuYW1lX3ByaW9yc1goKTsKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBMaXN0PFZlcnRleD4+PiBnZXRfZ19WX291dFhjcmVhdGVkWF9ncm91cFhtWF9ieVhsYWJlbFhfcGFnZVJhbmtYMVhfd2l0aFhwcm9wZXJ0eU5hbWVfcGFnZVJhbmtYWF93aXRoWGVkZ2VzX2luRVhYX3dpdGhYdGltZXNfMVhfaW5YY3JlYXRlZFhfZ3JvdXBYbVhfYnlYcGFnZVJhbmtYX2NhcFhtWCgpOwogCi0gICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxPYmplY3QsIExpc3Q8VmVydGV4Pj4+IGdldF9nX1Zfb3V0WGNyZWF0ZWRYX2dyb3VwWG1YX2J5WGxhYmVsWF9wYWdlUmFua1gxWF9ieVhwYWdlUmFua1hfYnlYaW5FWF90aW1lc1gxWF9pblhjcmVhdGVkWF9ncm91cFhtWF9ieVhwYWdlUmFua1hfY2FwWG1YKCk7Ci0KICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBwdWJsaWMgdm9pZCBnX1ZfcGFnZVJhbmtfaGFzWHBhZ2VSYW5rWCgpIHsKQEAgLTc5LDggKzc3LDggQEAKIAogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQotICAgIHB1YmxpYyB2b2lkIGdfVl9vdXRYY3JlYXRlZFhfcGFnZVJhbmtfYnlYYm90aEVYX2J5WHByb2plY3RSYW5rWF92YWx1ZU1hcFhuYW1lX3Byb2plY3RSYW5rWCgpIHsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9vdXRYY3JlYXRlZFhfcGFnZVJhbmtfYnlYYm90aEVYX2J5WHByb2plY3RSYW5rWF90aW1lc1gwWF92YWx1ZU1hcFhuYW1lX3Byb2plY3RSYW5rWCgpOworICAgIHB1YmxpYyB2b2lkIGdfVl9vdXRYY3JlYXRlZFhfcGFnZVJhbmtfd2l0aFhlZGdlc19ib3RoRVhfd2l0aFhwcm9wZXJ0eU5hbWVfcHJvamVjdFJhbmtYd2l0aFh0aW1lc18wWF92YWx1ZU1hcFhuYW1lX3Byb2plY3RSYW5rWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9vdXRYY3JlYXRlZFhfcGFnZVJhbmtfd2l0aFhlZGdlc19ib3RoRVhfd2l0aFhwcm9wZXJ0eU5hbWVfcHJvamVjdFJhbmtYd2l0aFh0aW1lc18wWF92YWx1ZU1hcFhuYW1lX3Byb2plY3RSYW5rWCgpOwogICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKICAgICAgICAgZmluYWwgTGlzdDxNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+PiByZXN1bHQgPSB0cmF2ZXJzYWwudG9MaXN0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscyg0LCByZXN1bHQuc2l6ZSgpKTsKQEAgLTExMiw4ICsxMTAsOCBAQAogCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgZ19WX3BhZ2VSYW5rX2J5WG91dEVYa25vd3NYWF9ieVhmcmllbmRSYW5rWF9wcm9qZWN0X2J5WG5hbWVYX2J5WHZhbHVlc1hmcmllbmRSYW5rWF9tYXRoWCgpIHsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgT2JqZWN0Pj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9wYWdlUmFua19ieVhvdXRFWGtub3dzWFhfYnlYZnJpZW5kUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYZnJpZW5kUmFua1hfbWF0aFgoKTsKKyAgICBwdWJsaWMgdm9pZCBnX1ZfcGFnZVJhbmtfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfd2l0aFhwcm9wZXJ0eU5hbWVfZnJpZW5kUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYZnJpZW5kUmFua1hfbWF0aFgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHRyYXZlcnNhbCA9IGdldF9nX1ZfcGFnZVJhbmtfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfd2l0aFhwcm9wZXJ0eU5hbWVfZnJpZW5kUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYZnJpZW5kUmFua1hfbWF0aFgoKTsKICAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CiAgICAgICAgIGludCBjb3VudGVyID0gMDsKICAgICAgICAgd2hpbGUgKHRyYXZlcnNhbC5oYXNOZXh0KCkpIHsKQEAgLTE0NCw4ICsxNDIsOCBAQAogCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfYnlYcGFnZVJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWHBhZ2VSYW5rWF9tYXRoWCgpIHsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgT2JqZWN0Pj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9oYXNMYWJlbFhwZXJzb25YX3BhZ2VSYW5rX2J5WHBhZ2VSYW5rWF9wcm9qZWN0X2J5WG5hbWVYX2J5WHZhbHVlc1hwYWdlUmFua1hfbWF0aFgoKTsKKyAgICBwdWJsaWMgdm9pZCBnX1ZfaGFzTGFiZWxYcGVyc29uWF9wYWdlUmFua193aXRoWHByb3BlcnR5TmFtZV9wYWdlUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYcGFnZVJhbmtYX21hdGhYKCkgeworICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBPYmplY3Q+PiB0cmF2ZXJzYWwgPSBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcGFnZVJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWHBhZ2VSYW5rWF9tYXRoWCgpOwogICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKICAgICAgICAgaW50IGNvdW50ZXIgPSAwOwogICAgICAgICB3aGlsZSAodHJhdmVyc2FsLmhhc05leHQoKSkgewpAQCAtMTY1LDggKzE2Myw4IEBACiAKICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKLSAgICBwdWJsaWMgdm9pZCBnX1ZfcGFnZVJhbmtfYnlYcGFnZVJhbmtYX2FzWGFYX291dFhrbm93c1hfcGFnZVJhbmtfYXNYYlhfc2VsZWN0WGFfYlhfYnlfYnlYbWF0aFgoKSB7Ci0gICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHRyYXZlcnNhbCA9IGdldF9nX1ZfcGFnZVJhbmtfYnlYcGFnZVJhbmtYX2FzWGFYX291dFhrbm93c1hfcGFnZVJhbmtfYXNYYlhfc2VsZWN0WGFfYlhfYnlfYnlYbWF0aFgoKTsKKyAgICBwdWJsaWMgdm9pZCBnX1ZfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcGFnZVJhbmtYX2FzWGFYX291dFhrbm93c1hfcGFnZVJhbmtfYXNYYlhfc2VsZWN0WGFfYlhfYnlfYnlYbWF0aFgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHRyYXZlcnNhbCA9IGdldF9nX1ZfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcGFnZVJhbmtYX2FzWGFYX291dFhrbm93c1hfcGFnZVJhbmtfYXNYYlhfc2VsZWN0WGFfYlhfYnlfYnlYbWF0aFgoKTsKICAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CiAgICAgICAgIGludCBjb3VudGVyID0gMDsKICAgICAgICAgd2hpbGUgKHRyYXZlcnNhbC5oYXNOZXh0KCkpIHsKQEAgLTE4Myw4ICsxODEsOCBAQAogCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgZ19WX2hhc0xhYmVsWHNvZnR3YXJlWF9oYXNYbmFtZV9yaXBwbGVYX3BhZ2VSYW5rWDFYX2J5WGluRVhjcmVhdGVkWFhfdGltZXNYMVhfYnlYcHJpb3JzWF9pblhjcmVhdGVkWF91bmlvblhib3RoX19pZGVudGl0eVhfdmFsdWVNYXBYbmFtZV9wcmlvcnNYKCkgewotICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+PiB0cmF2ZXJzYWwgPSBnZXRfZ19WX2hhc0xhYmVsWHNvZnR3YXJlWF9oYXNYbmFtZV9yaXBwbGVYX3BhZ2VSYW5rWDFYX2J5WGluRVhjcmVhdGVkWFhfdGltZXNYMVhfYnlYcHJpb3JzWF9pblhjcmVhdGVkWF91bmlvblhib3RoX19pZGVudGl0eVhfdmFsdWVNYXBYbmFtZV9wcmlvcnNYKCk7CisgICAgcHVibGljIHZvaWQgZ19WX2hhc0xhYmVsWHNvZnR3YXJlWF9oYXNYbmFtZV9yaXBwbGVYX3BhZ2VSYW5rWDFYX3dpdGhYZWRnZXNfaW5FWGNyZWF0ZWRYWF93aXRoWHRpbWVzXzFYX3dpdGhYcHJvcGVydHlOYW1lX3ByaW9yc1hfaW5YY3JlYXRlZFhfdW5pb25YYm90aF9faWRlbnRpdHlYX3ZhbHVlTWFwWG5hbWVfcHJpb3JzWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9oYXNMYWJlbFhzb2Z0d2FyZVhfaGFzWG5hbWVfcmlwcGxlWF9wYWdlUmFua1gxWF93aXRoWGVkZ2VzX2luRVhjcmVhdGVkWFhfd2l0aFh0aW1lc18xWF93aXRoWHByb3BlcnR5TmFtZV9wcmlvcnNYX2luWGNyZWF0ZWRYX3VuaW9uWGJvdGhfX2lkZW50aXR5WF92YWx1ZU1hcFhuYW1lX3ByaW9yc1goKTsKICAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CiAgICAgICAgIGludCBjb3VudGVyID0gMDsKICAgICAgICAgd2hpbGUgKHRyYXZlcnNhbC5oYXNOZXh0KCkpIHsKQEAgLTIwMiwzOSArMjAwLDYgQEAKIAogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQotICAgIHB1YmxpYyB2b2lkIGdfVl9vdXRYY3JlYXRlZFhfZ3JvdXBYbVhfYnlYbGFiZWxYX3BhZ2VSYW5rWDFYX2J5WHBhZ2VSYW5rWF9ieVhpbkVYX3RpbWVzWDFYX2luWGNyZWF0ZWRYX2dyb3VwWG1YX2J5WHBhZ2VSYW5rWF9jYXBYbVgoKSB7Ci0gICAgICAgIC8vIFt7Mi4wPVt2WzRdLCB2WzRdLCB2WzRdLCB2WzRdXSwgMS4wPVt2WzZdLCB2WzZdLCB2WzZdLCB2WzFdLCB2WzFdLCB2WzFdXSwgc29mdHdhcmU9W3ZbNV0sIHZbM10sIHZbM10sIHZbM11dfV0KLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxWZXJ0ZXg+Pj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9vdXRYY3JlYXRlZFhfZ3JvdXBYbVhfYnlYbGFiZWxYX3BhZ2VSYW5rWDFYX2J5WHBhZ2VSYW5rWF9ieVhpbkVYX3RpbWVzWDFYX2luWGNyZWF0ZWRYX2dyb3VwWG1YX2J5WHBhZ2VSYW5rWF9jYXBYbVgoKTsKLSAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7Ci0gICAgICAgIGZpbmFsIE1hcDxPYmplY3QsIExpc3Q8VmVydGV4Pj4gbWFwID0gdHJhdmVyc2FsLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UodHJhdmVyc2FsLmhhc05leHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtYXAuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoInNvZnR3YXJlIikpOwotICAgICAgICBtYXAuZm9yRWFjaCgoaywgdikgLT4gewotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKCFrLmVxdWFscygic29mdHdhcmUiKSAmJiB2LnNpemUoKSA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMGQsICgoTnVtYmVyKSBrKS5kb3VibGVWYWx1ZSgpLCAwLjAxZCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHYuc3RyZWFtKCkuZmlsdGVyKHZlcnRleCAtPiB2ZXJ0ZXguaWQoKS5lcXVhbHMoY29udmVydFRvVmVydGV4SWQoZ3JhcGgsICJqb3NoIikpKS5jb3VudCgpKTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHYuc2l6ZSgpID09IDYpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZCwgKChOdW1iZXIpIGspLmRvdWJsZVZhbHVlKCksIDAuMDFkKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgdi5zdHJlYW0oKS5maWx0ZXIodmVydGV4IC0+IHZlcnRleC5pZCgpLmVxdWFscyhjb252ZXJ0VG9WZXJ0ZXhJZChncmFwaCwgInBldGVyIikpKS5jb3VudCgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgdi5zdHJlYW0oKS5maWx0ZXIodmVydGV4IC0+IHZlcnRleC5pZCgpLmVxdWFscyhjb252ZXJ0VG9WZXJ0ZXhJZChncmFwaCwgIm1hcmtvIikpKS5jb3VudCgpKTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHYuc2l6ZSgpID09IDQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNvZnR3YXJlIiwgayk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHYuc3RyZWFtKCkuZmlsdGVyKHZlcnRleCAtPiB2ZXJ0ZXguaWQoKS5lcXVhbHMoY29udmVydFRvVmVydGV4SWQoZ3JhcGgsICJsb3AiKSkpLmNvdW50KCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB2LnN0cmVhbSgpLmZpbHRlcih2ZXJ0ZXggLT4gdmVydGV4LmlkKCkuZXF1YWxzKGNvbnZlcnRUb1ZlcnRleElkKGdyYXBoLCAicmlwcGxlIikpKS5jb3VudCgpKTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZm91bmQpCi0gICAgICAgICAgICAgICAgZmFpbCgiVGhlcmUgYXJlIHRvbyBtYW55IGtleS92YWx1ZXM6ICIgKyBrICsgIi0tIiArIHYpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBwdWJsaWMgdm9pZCBnX1Zfb3V0WGNyZWF0ZWRYX2dyb3VwWG1YX2J5WGxhYmVsWF9wYWdlUmFua1gxWF93aXRoWFBST1BFUlRZX05BTUVfcGFnZVJhbmtYWF93aXRoWEVER0VTX2luRVhYX3dpdGhYVElNRVNfMVhfaW5YY3JlYXRlZFhfZ3JvdXBYbVhfYnlYcGFnZVJhbmtYX2NhcFhtWCgpIHsKICAgICAgICAgLy8gW3syLjA9W3ZbNF0sIHZbNF0sIHZbNF0sIHZbNF1dLCAxLjA9W3ZbNl0sIHZbNl0sIHZbNl0sIHZbMV0sIHZbMV0sIHZbMV1dLCBzb2Z0d2FyZT1bdls1XSwgdlszXSwgdlszXSwgdlszXV19XQogICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBMaXN0PFZlcnRleD4+PiB0cmF2ZXJzYWwgPSBnZXRfZ19WX291dFhjcmVhdGVkWF9ncm91cFhtWF9ieVhsYWJlbFhfcGFnZVJhbmtYMVhfd2l0aFhwcm9wZXJ0eU5hbWVfcGFnZVJhbmtYWF93aXRoWGVkZ2VzX2luRVhYX3dpdGhYdGltZXNfMVhfaW5YY3JlYXRlZFhfZ3JvdXBYbVhfYnlYcGFnZVJhbmtYX2NhcFhtWCgpOwpAQCAtMjc0LDEzICsyMzksMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gZ2V0X2dfVl9vdXRYY3JlYXRlZFhfcGFnZVJhbmtfYnlYYm90aEVYX2J5WHByb2plY3RSYW5rWF90aW1lc1gwWF92YWx1ZU1hcFhuYW1lX3Byb2plY3RSYW5rWCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnLlYoKS5vdXQoImNyZWF0ZWQiKS5wYWdlUmFuaygpLmJ5KF9fLmJvdGhFKCkpLmJ5KCJwcm9qZWN0UmFuayIpLnRpbWVzKDApLnZhbHVlTWFwKCJuYW1lIiwgInByb2plY3RSYW5rIik7CisgICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+PiBnZXRfZ19WX291dFhjcmVhdGVkWF9wYWdlUmFua193aXRoWGVkZ2VzX2JvdGhFWF93aXRoWHByb3BlcnR5TmFtZV9wcm9qZWN0UmFua1h3aXRoWHRpbWVzXzBYX3ZhbHVlTWFwWG5hbWVfcHJvamVjdFJhbmtYKCkgeworICAgICAgICAgICAgcmV0dXJuIGcuVigpLm91dCgiY3JlYXRlZCIpLnBhZ2VSYW5rKCkud2l0aChQYWdlUmFuay5lZGdlcywgX18uYm90aEUoKSkud2l0aChQYWdlUmFuay5wcm9wZXJ0eU5hbWUsICJwcm9qZWN0UmFuayIpLndpdGgoUGFnZVJhbmsudGltZXMsIDApLnZhbHVlTWFwKCJuYW1lIiwgInByb2plY3RSYW5rIik7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGdldF9nX1ZfcGFnZVJhbmtfYnlYb3V0RVhrbm93c1hYX2J5WGZyaWVuZFJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWGZyaWVuZFJhbmtYX21hdGhYKCkgewotICAgICAgICAgICAgcmV0dXJuIGcuVigpLnBhZ2VSYW5rKCkuYnkoX18ub3V0RSgia25vd3MiKSkuYnkoImZyaWVuZFJhbmsiKS5wcm9qZWN0KCJuYW1lIiwgImZyaWVuZFJhbmsiKS5ieSgibmFtZSIpLmJ5KF9fLnZhbHVlcygiZnJpZW5kUmFuayIpLm1hdGgoImNlaWwoXyAqIDEwMCkiKSk7CisgICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRfZ19WX3BhZ2VSYW5rX3dpdGhYZWRnZXNfb3V0RVhrbm93c1hYX3dpdGhYcHJvcGVydHlOYW1lX2ZyaWVuZFJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWGZyaWVuZFJhbmtYX21hdGhYKCkgeworICAgICAgICAgICAgcmV0dXJuIGcuVigpLnBhZ2VSYW5rKCkud2l0aChQYWdlUmFuay5lZGdlcywgX18ub3V0RSgia25vd3MiKSkud2l0aChQYWdlUmFuay5wcm9wZXJ0eU5hbWUsICJmcmllbmRSYW5rIikucHJvamVjdCgibmFtZSIsICJmcmllbmRSYW5rIikuYnkoIm5hbWUiKS5ieShfXy52YWx1ZXMoImZyaWVuZFJhbmsiKS5tYXRoKCJjZWlsKF8gKiAxMDApIikpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0yOTQsMjMgKzI1OSwxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfYnlYcGFnZVJhbmtYX3Byb2plY3RfYnlYbmFtZVhfYnlYdmFsdWVzWHBhZ2VSYW5rWF9tYXRoWCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnLlYoKS5oYXNMYWJlbCgicGVyc29uIikucGFnZVJhbmsoKS5ieSgicGFnZVJhbmsiKS5wcm9qZWN0KCJuYW1lIiwgInBhZ2VSYW5rIikuYnkoIm5hbWUiKS5ieShfXy52YWx1ZXMoInBhZ2VSYW5rIikubWF0aCgiY2VpbChfICogMTAwKSIpKTsKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGdldF9nX1ZfaGFzTGFiZWxYcGVyc29uWF9wYWdlUmFua193aXRoWHByb3BlcnR5TmFtZV9wYWdlUmFua1hfcHJvamVjdF9ieVhuYW1lWF9ieVh2YWx1ZXNYcGFnZVJhbmtYX21hdGhYKCkgeworICAgICAgICAgICAgcmV0dXJuIGcuVigpLmhhc0xhYmVsKCJwZXJzb24iKS5wYWdlUmFuaygpLndpdGgoUGFnZVJhbmsucHJvcGVydHlOYW1lLCAicGFnZVJhbmsiKS5wcm9qZWN0KCJuYW1lIiwgInBhZ2VSYW5rIikuYnkoIm5hbWUiKS5ieShfXy52YWx1ZXMoInBhZ2VSYW5rIikubWF0aCgiY2VpbChfICogMTAwKSIpKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0X2dfVl9wYWdlUmFua19ieVhwYWdlUmFua1hfYXNYYVhfb3V0WGtub3dzWF9wYWdlUmFua19hc1hiWF9zZWxlY3RYYV9iWF9ieV9ieVhtYXRoWCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnLlYoKS5wYWdlUmFuaygpLmJ5KCJwYWdlUmFuayIpLmFzKCJhIikub3V0KCJrbm93cyIpLnZhbHVlcygicGFnZVJhbmsiKS5hcygiYiIpLnNlbGVjdCgiYSIsICJiIikuYnkoKS5ieShfXy5tYXRoKCJjZWlsKF8gKiAxMDApIikpOworICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0X2dfVl9wYWdlUmFua193aXRoWHByb3BlcnR5TmFtZV9wYWdlUmFua1hfYXNYYVhfb3V0WGtub3dzWF9wYWdlUmFua19hc1hiWF9zZWxlY3RYYV9iWF9ieV9ieVhtYXRoWCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnLlYoKS5wYWdlUmFuaygpLndpdGgoUGFnZVJhbmsucHJvcGVydHlOYW1lLCAicGFnZVJhbmsiKS5hcygiYSIpLm91dCgia25vd3MiKS52YWx1ZXMoInBhZ2VSYW5rIikuYXMoImIiKS5zZWxlY3QoImEiLCAiYiIpLmJ5KCkuYnkoX18ubWF0aCgiY2VpbChfICogMTAwKSIpKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gZ2V0X2dfVl9oYXNMYWJlbFhzb2Z0d2FyZVhfaGFzWG5hbWVfcmlwcGxlWF9wYWdlUmFua1gxWF9ieVhpbkVYY3JlYXRlZFhYX3RpbWVzWDFYX2J5WHByaW9yc1hfaW5YY3JlYXRlZFhfdW5pb25YYm90aF9faWRlbnRpdHlYX3ZhbHVlTWFwWG5hbWVfcHJpb3JzWCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnLlYoKS5oYXNMYWJlbCgic29mdHdhcmUiKS5oYXMoIm5hbWUiLCAicmlwcGxlIikucGFnZVJhbmsoMS4wKS5ieShfXy5pbkUoImNyZWF0ZWQiKSkudGltZXMoMSkuYnkoInByaW9ycyIpLmluKCJjcmVhdGVkIikudW5pb24oX18uYm90aCgpLCBfXy5pZGVudGl0eSgpKS52YWx1ZU1hcCgibmFtZSIsICJwcmlvcnMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxWZXJ0ZXg+Pj4gZ2V0X2dfVl9vdXRYY3JlYXRlZFhfZ3JvdXBYbVhfYnlYbGFiZWxYX3BhZ2VSYW5rWDFYX2J5WHBhZ2VSYW5rWF9ieVhpbkVYX3RpbWVzWDFYX2luWGNyZWF0ZWRYX2dyb3VwWG1YX2J5WHBhZ2VSYW5rWF9jYXBYbVgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZy5WKCkub3V0KCJjcmVhdGVkIikuZ3JvdXAoIm0iKS5ieShULmxhYmVsKS5wYWdlUmFuaygxLjApLmJ5KCJwYWdlUmFuayIpLmJ5KF9fLmluRSgpKS50aW1lcygxKS5pbigiY3JlYXRlZCIpLmdyb3VwKCJtIikuYnkoInBhZ2VSYW5rIikuY2FwKCJtIik7CisgICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+PiBnZXRfZ19WX2hhc0xhYmVsWHNvZnR3YXJlWF9oYXNYbmFtZV9yaXBwbGVYX3BhZ2VSYW5rWDFYX3dpdGhYZWRnZXNfaW5FWGNyZWF0ZWRYWF93aXRoWHRpbWVzXzFYX3dpdGhYcHJvcGVydHlOYW1lX3ByaW9yc1hfaW5YY3JlYXRlZFhfdW5pb25YYm90aF9faWRlbnRpdHlYX3ZhbHVlTWFwWG5hbWVfcHJpb3JzWCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnLlYoKS5oYXNMYWJlbCgic29mdHdhcmUiKS5oYXMoIm5hbWUiLCAicmlwcGxlIikucGFnZVJhbmsoMS4wKS53aXRoKFBhZ2VSYW5rLmVkZ2VzLCBfXy5pbkUoImNyZWF0ZWQiKSkud2l0aChQYWdlUmFuay50aW1lcywgMSkud2l0aChQYWdlUmFuay5wcm9wZXJ0eU5hbWUsICJwcmlvcnMiKS5pbigiY3JlYXRlZCIpLnVuaW9uKF9fLmJvdGgoKSwgX18uaWRlbnRpdHkoKSkudmFsdWVNYXAoIm5hbWUiLCAicHJpb3JzIik7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUGVlclByZXNzdXJlVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9QZWVyUHJlc3N1cmVUZXN0LmphdmEKaW5kZXggNTA4NzUyMi4uZTgzNGVjZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9QZWVyUHJlc3N1cmVUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9QZWVyUHJlc3N1cmVUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuQWJzdHJhY3RHcmVtbGluUHJvY2Vzc1Rlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLkdyZW1saW5Qcm9jZXNzUnVubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5jbHVzdGVyaW5nLnBlZXJwcmVzc3VyZS5QZWVyUHJlc3N1cmVWZXJ0ZXhQcm9ncmFtOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci50cmF2ZXJzYWwuc3RlcC5tYXAuUGFnZVJhbms7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5QZWVyUHJlc3N1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CkBAIC01MSw5ICs1Miw3IEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgVmVydGV4PiBnZXRfZ19WX3BlZXJQcmVzc3VyZV9oYXNYY2x1c3RlclgoKTsKIAotICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBOdW1iZXI+PiBnZXRfZ19WX3BlZXJQcmVzc3VyZV9ieVhjbHVzdGVyWF9ieVhvdXRFWGtub3dzWFhfcGFnZVJhbmtYMVhfYnlYcmFua1hfYnlYb3V0RVhrbm93c1hYX3RpbWVzWDJYX2dyb3VwX2J5WGNsdXN0ZXJYX2J5WHJhbmtfc3VtWF9saW1pdFgxMDBYKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gZ2V0X2dfVl9oYXNYbmFtZV9yaXBwbGVYX2luWGNyZWF0ZWRYX3BlZXJQcmVzc3VyZV9ieVhvdXRFWF9ieVhjbHVzdGVyWF9yZXBlYXRYdW5pb25YaWRlbnRpdHlfX2JvdGhYX3RpbWVzWDJYX2RlZHVwX3ZhbHVlTWFwWG5hbWVfY2x1c3RlclgoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTnVtYmVyPj4gZ2V0X2dfVl9wZWVyUHJlc3N1cmVfd2l0aFhwcm9wZXJ0eU5hbWVfY2x1c3Rlclhfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfcGFnZVJhbmtYMVhfd2l0aFhwcm9wZXJ0eU5hbWVfcmFua1hfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfd2l0aFh0aW1lc18yWF9ncm91cF9ieVhjbHVzdGVyWF9ieVhyYW5rX3N1bVhfbGltaXRYMTAwWCgpOwogCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4+IGdldF9nX1ZfaGFzWG5hbWVfcmlwcGxlWF9pblhjcmVhdGVkWF9wZWVyUHJlc3N1cmVfd2l0aFhlZGdlc19vdXRFWF93aXRoWHByb3BlcnR5TmFtZV9jbHVzdGVyWF9yZXBlYXRYdW5pb25YaWRlbnRpdHlfX2JvdGhYX3RpbWVzWDJYX2RlZHVwX3ZhbHVlTWFwWG5hbWVfY2x1c3RlclgoKTsKIApAQCAtNjcsOCArNjYsOCBAQAogCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCi0gICAgcHVibGljIHZvaWQgZ19WX3BlZXJQcmVzc3VyZV9ieVhjbHVzdGVyWF9ieVhvdXRFWGtub3dzWFhfcGFnZVJhbmtYMVhfYnlYcmFua1hfYnlYb3V0RVhrbm93c1hYX3RpbWVzWDJYX2dyb3VwX2J5WGNsdXN0ZXJYX2J5WHJhbmtfc3VtWCgpIHsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTnVtYmVyPj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9wZWVyUHJlc3N1cmVfYnlYY2x1c3RlclhfYnlYb3V0RVhrbm93c1hYX3BhZ2VSYW5rWDFYX2J5WHJhbmtYX2J5WG91dEVYa25vd3NYWF90aW1lc1gyWF9ncm91cF9ieVhjbHVzdGVyWF9ieVhyYW5rX3N1bVhfbGltaXRYMTAwWCgpOworICAgIHB1YmxpYyB2b2lkIGdfVl9wZWVyUHJlc3N1cmVfd2l0aFhwcm9wZXJ0eU5hbWVfY2x1c3Rlclhfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfcGFnZVJhbmtYMVhfd2l0aFhwcm9wZXJ0eU5hbWVfcmFua1hfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfd2l0aFh0aW1lc18yWF9ncm91cF9ieVhjbHVzdGVyWF9ieVhyYW5rX3N1bVhfbGltaXRYMTAwWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTnVtYmVyPj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9wZWVyUHJlc3N1cmVfd2l0aFhwcm9wZXJ0eU5hbWVfY2x1c3Rlclhfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfcGFnZVJhbmtYMVhfd2l0aFhwcm9wZXJ0eU5hbWVfcmFua1hfd2l0aFhlZGdlc19vdXRFWGtub3dzWFhfd2l0aFh0aW1lc18yWF9ncm91cF9ieVhjbHVzdGVyWF9ieVhyYW5rX3N1bVhfbGltaXRYMTAwWCgpOwogICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKICAgICAgICAgZmluYWwgTWFwPE9iamVjdCwgTnVtYmVyPiBtYXAgPSB0cmF2ZXJzYWwubmV4dCgpOwogICAgICAgICBhc3NlcnRGYWxzZSh0cmF2ZXJzYWwuaGFzTmV4dCgpKTsKQEAgLTgxLDI5ICs4MCw3IEBACiAKICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKLSAgICBwdWJsaWMgdm9pZCBnX1ZfaGFzWG5hbWVfcmlwcGxlWF9pblhjcmVhdGVkWF9wZWVyUHJlc3N1cmVfYnlYb3V0RVhfYnlYY2x1c3RlclhfcmVwZWF0WHVuaW9uWGlkZW50aXR5X19ib3RoWF90aW1lc1gyWF9kZWR1cF92YWx1ZU1hcFhuYW1lX2NsdXN0ZXJYKCkgewotICAgICAgICBUZXN0SGVscGVyLmFzc3VtZU5vbkRldGVybWluaXN0aWMoKTsKLSAgICAgICAgZmluYWwgVHJhdmVyc2FsPFZlcnRleCwgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9oYXNYbmFtZV9yaXBwbGVYX2luWGNyZWF0ZWRYX3BlZXJQcmVzc3VyZV9ieVhvdXRFWF9ieVhjbHVzdGVyWF9yZXBlYXRYdW5pb25YaWRlbnRpdHlfX2JvdGhYX3RpbWVzWDJYX2RlZHVwX3ZhbHVlTWFwWG5hbWVfY2x1c3RlclgoKTsKLSAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7Ci0gICAgICAgIGZpbmFsIExpc3Q8TWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+Pj4gcmVzdWx0cyA9IHRyYXZlcnNhbC50b0xpc3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIHJlc3VsdHMuc2l6ZSgpKTsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBjbHVzdGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcmVzdWx0cy5mb3JFYWNoKG0gLT4gY2x1c3RlcnMucHV0KChTdHJpbmcpIG0uZ2V0KCJuYW1lIikuZ2V0KDApLCBtLmdldCgiY2x1c3RlciIpLmdldCgwKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0cy5nZXQoMCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGNsdXN0ZXJzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVycy5nZXQoImpvc2giKSwgY2x1c3RlcnMuZ2V0KCJyaXBwbGUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVycy5nZXQoImpvc2giKSwgY2x1c3RlcnMuZ2V0KCJsb3AiKSk7Ci0gICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IGlkcyA9IG5ldyBIYXNoU2V0PD4oY2x1c3RlcnMudmFsdWVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgaWRzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmNvbnRhaW5zKGNvbnZlcnRUb1ZlcnRleElkKCJtYXJrbyIpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmNvbnRhaW5zKGNvbnZlcnRUb1ZlcnRleElkKCJ2YWRhcyIpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmNvbnRhaW5zKGNvbnZlcnRUb1ZlcnRleElkKCJqb3NoIikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoY29udmVydFRvVmVydGV4SWQoInBldGVyIikpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKLSAgICBwdWJsaWMgdm9pZCBnX1ZfaGFzWG5hbWVfcmlwcGxlWF9pblhjcmVhdGVkWF9wZWVyUHJlc3N1cmVfd2l0aFhFREdFU19vdXRFWF93aXRoWFBST1BFUlRZX05BTUVfY2x1c3RlclhfcmVwZWF0WHVuaW9uWGlkZW50aXR5X19ib3RoWF90aW1lc1gyWF9kZWR1cF92YWx1ZU1hcFhuYW1lX2NsdXN0ZXJYKCkgeworICAgIHB1YmxpYyB2b2lkIGdfVl9oYXNYbmFtZV9yaXBwbGVYX2luWGNyZWF0ZWRYX3BlZXJQcmVzc3VyZV93aXRoWGVkZ2VzX291dEVYX3dpdGhYcHJvcGVydHlOYW1lX2NsdXN0ZXJYX3JlcGVhdFh1bmlvblhpZGVudGl0eV9fYm90aFhfdGltZXNYMlhfZGVkdXBfdmFsdWVNYXBYbmFtZV9jbHVzdGVyWCgpIHsKICAgICAgICAgVGVzdEhlbHBlci5hc3N1bWVOb25EZXRlcm1pbmlzdGljKCk7CiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4+IHRyYXZlcnNhbCA9IGdldF9nX1ZfaGFzWG5hbWVfcmlwcGxlWF9pblhjcmVhdGVkWF9wZWVyUHJlc3N1cmVfd2l0aFhlZGdlc19vdXRFWF93aXRoWHByb3BlcnR5TmFtZV9jbHVzdGVyWF9yZXBlYXRYdW5pb25YaWRlbnRpdHlfX2JvdGhYX3RpbWVzWDJYX2RlZHVwX3ZhbHVlTWFwWG5hbWVfY2x1c3RlclgoKTsKICAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CkBAIC0xMzEsMTMgKzEwOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxPYmplY3QsIE51bWJlcj4+IGdldF9nX1ZfcGVlclByZXNzdXJlX2J5WGNsdXN0ZXJYX2J5WG91dEVYa25vd3NYWF9wYWdlUmFua1gxWF9ieVhyYW5rWF9ieVhvdXRFWGtub3dzWFhfdGltZXNYMlhfZ3JvdXBfYnlYY2x1c3RlclhfYnlYcmFua19zdW1YX2xpbWl0WDEwMFgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZy5WKCkucGVlclByZXNzdXJlKCkuYnkoImNsdXN0ZXIiKS5ieShfXy5vdXRFKCJrbm93cyIpKS5wYWdlUmFuaygxLjBkKS5ieSgicmFuayIpLmJ5KF9fLm91dEUoImtub3dzIikpLnRpbWVzKDEpLjxPYmplY3QsIE51bWJlcj5ncm91cCgpLmJ5KCJjbHVzdGVyIikuYnkoX18udmFsdWVzKCJyYW5rIikuc3VtKCkpLmxpbWl0KDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4+IGdldF9nX1ZfaGFzWG5hbWVfcmlwcGxlWF9pblhjcmVhdGVkWF9wZWVyUHJlc3N1cmVfYnlYb3V0RVhfYnlYY2x1c3RlclhfcmVwZWF0WHVuaW9uWGlkZW50aXR5X19ib3RoWF90aW1lc1gyWF9kZWR1cF92YWx1ZU1hcFhuYW1lX2NsdXN0ZXJYKCkgewotICAgICAgICAgICAgcmV0dXJuIGcuVigpLmhhcygibmFtZSIsICJyaXBwbGUiKS5pbigiY3JlYXRlZCIpLnBlZXJQcmVzc3VyZSgpLmJ5KF9fLm91dEUoKSkuYnkoImNsdXN0ZXIiKS5yZXBlYXQoX18udW5pb24oX18uaWRlbnRpdHkoKSwgX18uYm90aCgpKSkudGltZXMoMikuZGVkdXAoKS52YWx1ZU1hcCgibmFtZSIsICJjbHVzdGVyIik7CisgICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8T2JqZWN0LCBOdW1iZXI+PiBnZXRfZ19WX3BlZXJQcmVzc3VyZV93aXRoWHByb3BlcnR5TmFtZV9jbHVzdGVyWF93aXRoWGVkZ2VzX291dEVYa25vd3NYWF9wYWdlUmFua1gxWF93aXRoWHByb3BlcnR5TmFtZV9yYW5rWF93aXRoWGVkZ2VzX291dEVYa25vd3NYWF93aXRoWHRpbWVzXzJYX2dyb3VwX2J5WGNsdXN0ZXJYX2J5WHJhbmtfc3VtWF9saW1pdFgxMDBYKCkgeworICAgICAgICAgICAgcmV0dXJuIGcuVigpLnBlZXJQcmVzc3VyZSgpLndpdGgoUGVlclByZXNzdXJlLnByb3BlcnR5TmFtZSwgImNsdXN0ZXIiKS53aXRoKFBlZXJQcmVzc3VyZS5lZGdlcywgX18ub3V0RSgia25vd3MiKSkucGFnZVJhbmsoMS4wZCkud2l0aChQYWdlUmFuay5wcm9wZXJ0eU5hbWUsICJyYW5rIikud2l0aChQYWdlUmFuay5lZGdlcywgX18ub3V0RSgia25vd3MiKSkud2l0aChQYWdlUmFuay50aW1lcywgMSkuPE9iamVjdCwgTnVtYmVyPmdyb3VwKCkuYnkoImNsdXN0ZXIiKS5ieShfXy52YWx1ZXMoInJhbmsiKS5zdW0oKSkubGltaXQoMTAwKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9maWxlVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9maWxlVGVzdC5qYXZhCmluZGV4IGI3OTg1ZTYuLjk3NDdmYzAgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvZmlsZVRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb2ZpbGVUZXN0LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuQWJzdHJhY3RHcmVtbGluUHJvY2Vzc1Rlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLkdyZW1saW5Qcm9jZXNzUnVubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5JZ25vcmVFbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdGVwLm1hcC5QYWdlUmFuazsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0ZXAubWFwLlRyYXZlcnNhbFZlcnRleFByb2dyYW1TdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlN0ZXA7CkBAIC05Miw3ICs5Myw3IEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgU3RyaW5nPj4gZ2V0X2dfVl9tYXRjaFhhX2NyZWF0ZWRfYl9fYl9pbl9jb3VudF9pc1hlcVgxWFhYX3NlbGVjdFhhX2JYX3Byb2ZpbGVYbWV0cmljc1goKTsKIAotICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBUcmF2ZXJzYWxNZXRyaWNzPiBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfYnlYcmFua1hfYnlYYm90aEVYX3JhbmtfcHJvZmlsZSgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBUcmF2ZXJzYWxNZXRyaWNzPiBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcmFua1hfd2l0aFhlZGdlc19ib3RoRVhfcmFua19wcm9maWxlKCk7CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgVHJhdmVyc2FsTWV0cmljcz4gZ2V0X2dfVl9ncm91cFhtWF9wcm9maWxlKCk7CiAKQEAgLTI2NSw4ICsyNjYsOCBAQAogCiAgICAgICAgIGZpbmFsIFRyYXZlcnNhbE1ldHJpY3MgdHJhdmVyc2FsTWV0cmljcyA9IHRyYXZlcnNhbC5uZXh0KCk7CiAgICAgICAgIHZhbGlkYXRlX2dfVl9yZXBlYXRfYm90aF9tb2Rlcm5fcHJvZmlsZSh0cmF2ZXJzYWxNZXRyaWNzLAotICAgICAgICAgICAgICAgIHRyYXZlcnNhbC5hc0FkbWluKCkuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKFJlcGVhdFVucm9sbFN0cmF0ZWd5Lmluc3RhbmNlKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdHJhdGVnaWVzKCkudG9MaXN0KCkuY29udGFpbnMoQ29tcHV0ZXJWZXJpZmljYXRpb25TdHJhdGVneS5pbnN0YW5jZSgpKSk7CisgICAgICAgICAgICAgICAgdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koUmVwZWF0VW5yb2xsU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koQ29tcHV0ZXJWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcykuaXNQcmVzZW50KCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNzcsOCArMjc4LDggQEAKICAgICAgICAgdHJhdmVyc2FsLml0ZXJhdGUoKTsKICAgICAgICAgZmluYWwgVHJhdmVyc2FsTWV0cmljcyB0cmF2ZXJzYWxNZXRyaWNzID0gdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTaWRlRWZmZWN0cygpLmdldChNRVRSSUNTX0tFWSk7CiAgICAgICAgIHZhbGlkYXRlX2dfVl9yZXBlYXRfYm90aF9tb2Rlcm5fcHJvZmlsZSh0cmF2ZXJzYWxNZXRyaWNzLAotICAgICAgICAgICAgICAgIHRyYXZlcnNhbC5hc0FkbWluKCkuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKFJlcGVhdFVucm9sbFN0cmF0ZWd5Lmluc3RhbmNlKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdHJhdGVnaWVzKCkudG9MaXN0KCkuY29udGFpbnMoQ29tcHV0ZXJWZXJpZmljYXRpb25TdHJhdGVneS5pbnN0YW5jZSgpKSk7CisgICAgICAgICAgICAgICAgdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koUmVwZWF0VW5yb2xsU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhdHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koQ29tcHV0ZXJWZXJpZmljYXRpb25TdHJhdGVneS5jbGFzcykuaXNQcmVzZW50KCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZV9nX1ZfcmVwZWF0X2JvdGhfbW9kZXJuX3Byb2ZpbGUoZmluYWwgVHJhdmVyc2FsTWV0cmljcyB0cmF2ZXJzYWxNZXRyaWNzLCBmaW5hbCBib29sZWFuIHdpdGhSZXBlYXRVbnJvbGxTdHJhdGVneSkgewpAQCAtMzMzLDcgKzMzNCw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRyaWNzLmdldENvdW50KFRyYXZlcnNhbE1ldHJpY3MuVFJBVkVSU0VSX0NPVU5UX0lEKS5sb25nVmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRyaWNzLmdldENvdW50KFRyYXZlcnNhbE1ldHJpY3MuRUxFTUVOVF9DT1VOVF9JRCkubG9uZ1ZhbHVlKCkpOwogCi0gICAgICAgIGlmICh0cmF2ZXJzYWwuYXNBZG1pbigpLmdldFN0cmF0ZWdpZXMoKS50b0xpc3QoKS5zdHJlYW0oKS5hbnlNYXRjaChzIC0+IHMgaW5zdGFuY2VvZiBDb3VudFN0cmF0ZWd5KSkgeworICAgICAgICBpZiAodHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koQ291bnRTdHJhdGVneS5jbGFzcykuaXNQcmVzZW50KCkpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTWV0cmljcyAxIHNob3VsZCBoYXZlIDQgbmVzdGVkIG1ldHJpY3MuIiwgNCwgbWV0cmljcy5nZXROZXN0ZWQoKS5zaXplKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXRyaWNzIDEgc2hvdWxkIGhhdmUgMyBuZXN0ZWQgbWV0cmljcy4iLCAzLCBtZXRyaWNzLmdldE5lc3RlZCgpLnNpemUoKSk7CkBAIC00MzUsOCArNDM2LDggQEAKICAgICBAVGVzdAogICAgIEBMb2FkR3JhcGhXaXRoKE1PREVSTikKICAgICBASWdub3JlRW5naW5lKFRyYXZlcnNhbEVuZ2luZS5UeXBlLlNUQU5EQVJEKQotICAgIHB1YmxpYyB2b2lkIGdfVl9oYXNMYWJlbFhwZXJzb25YX3BhZ2VSYW5rX2J5WHJhbmtYX2J5WGJvdGhFWF9yYW5rX3Byb2ZpbGUoKSB7Ci0gICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIFRyYXZlcnNhbE1ldHJpY3M+IHRyYXZlcnNhbCA9IGdldF9nX1ZfaGFzTGFiZWxYcGVyc29uWF9wYWdlUmFua19ieVhyYW5rWF9ieVhib3RoRVhfcmFua19wcm9maWxlKCk7CisgICAgcHVibGljIHZvaWQgZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcmFua1hfd2l0aFhlZGdlc19ib3RoRVhfcmFua19wcm9maWxlKCkgeworICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBUcmF2ZXJzYWxNZXRyaWNzPiB0cmF2ZXJzYWwgPSBnZXRfZ19WX2hhc0xhYmVsWHBlcnNvblhfcGFnZVJhbmtfd2l0aFhwcm9wZXJ0eU5hbWVfcmFua1hfd2l0aFhlZGdlc19ib3RoRVhfcmFua19wcm9maWxlKCk7CiAgICAgICAgIC8vcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0cmF2ZXJzYWwuaXRlcmF0ZSgpOwpAQCAtNTM5LDggKzU0MCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIFRyYXZlcnNhbE1ldHJpY3M+IGdldF9nX1ZfaGFzTGFiZWxYcGVyc29uWF9wYWdlUmFua19ieVhyYW5rWF9ieVhib3RoRVhfcmFua19wcm9maWxlKCkgewotICAgICAgICAgICAgcmV0dXJuIGcuVigpLmhhc0xhYmVsKCJwZXJzb24iKS5wYWdlUmFuaygpLmJ5KCJyYW5rIikuYnkoX18uYm90aEUoKSkudmFsdWVzKCJyYW5rIikucHJvZmlsZSgpOworICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgVHJhdmVyc2FsTWV0cmljcz4gZ2V0X2dfVl9oYXNMYWJlbFhwZXJzb25YX3BhZ2VSYW5rX3dpdGhYcHJvcGVydHlOYW1lX3JhbmtYX3dpdGhYZWRnZXNfYm90aEVYX3JhbmtfcHJvZmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnLlYoKS5oYXNMYWJlbCgicGVyc29uIikucGFnZVJhbmsoKS53aXRoKFBhZ2VSYW5rLnByb3BlcnR5TmFtZSwgInJhbmsiKS53aXRoKFBhZ2VSYW5rLmVkZ2VzLCBfXy5ib3RoRSgpKS52YWx1ZXMoInJhbmsiKS5wcm9maWxlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvZ3JhbVRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvUHJvZ3JhbVRlc3QuamF2YQppbmRleCBhMGM1YjIzLi4xNDM5YTdiIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvbWFwL1Byb2dyYW1UZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9Qcm9ncmFtVGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5BYnN0cmFjdEdyZW1saW5Qcm9jZXNzVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuR3JhcGhDb21wdXRlcjsKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9tYXAvU2VsZWN0VGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TZWxlY3RUZXN0LmphdmEKaW5kZXggYzRmYmQ3MC4uNGU1ZDRhMCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TZWxlY3RUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL21hcC9TZWxlY3RUZXN0LmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5fXzsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTE1NCw2ICsxNTUsMTAgQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBWZXJ0ZXg+IGdldF9nX1ZYMVhfYXNYYVhfcmVwZWF0WG91dF9hc1hhWFhfdGltZXNYMlhfc2VsZWN0WGxhc3RfYVgoZmluYWwgT2JqZWN0IHYxSWQpOwogCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxFZGdlLCBPYmplY3Q+IGdldF9nX0VYMTFYX3Byb3BlcnRpZXNYd2VpZ2h0WF9hc1hhWF9zZWxlY3RYYVhfYnlYa2V5WChmaW5hbCBPYmplY3QgZTExSWQpOworCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxFZGdlLCBPYmplY3Q+IGdldF9nX0VYMTFYX3Byb3BlcnRpZXNYd2VpZ2h0WF9hc1hhWF9zZWxlY3RYYVhfYnlYdmFsdWVYKGZpbmFsIE9iamVjdCBlMTFJZCk7CisKICAgICAvLyB3aGVuIGxhYmVscyBkb24ndCBleGlzdAogCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFN0cmluZz4gZ2V0X2dfVl91bnRpbFhvdXRfb3V0WF9yZXBlYXRYaW5fYXNYYVhYX3NlbGVjdFhhWF9ieVh0YWlsWGxvY2FsWF9uYW1lWCgpOwpAQCAtNzAyLDYgKzcwNywyMiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIHRyYXZlcnNhbC50b0xpc3QoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgcHVibGljIHZvaWQgZ19FWDExWF9wcm9wZXJ0aWVzWHdlaWdodFhfYXNYYVhfc2VsZWN0WGFYX2J5WGtleVgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxFZGdlLCBPYmplY3Q+IHRyYXZlcnNhbCA9IGdldF9nX0VYMTFYX3Byb3BlcnRpZXNYd2VpZ2h0WF9hc1hhWF9zZWxlY3RYYVhfYnlYa2V5WChjb252ZXJ0VG9FZGdlSWQoImpvc2giLCAiY3JlYXRlZCIsICJsb3AiKSk7CisgICAgICAgIHByaW50VHJhdmVyc2FsRm9ybSh0cmF2ZXJzYWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndlaWdodCIsIHRyYXZlcnNhbC5uZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQorICAgIHB1YmxpYyB2b2lkIGdfRVgxMVhfcHJvcGVydGllc1h3ZWlnaHRYX2FzWGFYX3NlbGVjdFhhWF9ieVh2YWx1ZVgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxFZGdlLCBPYmplY3Q+IHRyYXZlcnNhbCA9IGdldF9nX0VYMTFYX3Byb3BlcnRpZXNYd2VpZ2h0WF9hc1hhWF9zZWxlY3RYYVhfYnlYdmFsdWVYKGNvbnZlcnRUb0VkZ2VJZCgiam9zaCIsICJjcmVhdGVkIiwgImxvcCIpKTsKKyAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjRkLCAoZG91YmxlKSB0cmF2ZXJzYWwubmV4dCgpLCAwLjAwMDFkKTsKKyAgICB9CisKICAgICAvLyB3aGVuIGxhYmVscyBkb24ndCBleGlzdAogCiAgICAgQFRlc3QKQEAgLTEwNzMsNiArMTA5NCwxNiBAQAogICAgICAgICAgICAgcmV0dXJuIGcuVigpLmFzKCJhIikud2hlcmUoX18ub3V0KCJrbm93cyIpKS48VmVydGV4PnNlbGVjdCgiYSIpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUcmF2ZXJzYWw8RWRnZSwgT2JqZWN0PiBnZXRfZ19FWDExWF9wcm9wZXJ0aWVzWHdlaWdodFhfYXNYYVhfc2VsZWN0WGFYX2J5WGtleVgoZmluYWwgT2JqZWN0IGUxMUlkKSB7CisgICAgICAgICAgICByZXR1cm4gZy5FKGUxMUlkKS5wcm9wZXJ0aWVzKCJ3ZWlnaHQiKS5hcygiYSIpLnNlbGVjdCgiYSIpLmJ5KFQua2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPEVkZ2UsIE9iamVjdD4gZ2V0X2dfRVgxMVhfcHJvcGVydGllc1h3ZWlnaHRYX2FzWGFYX3NlbGVjdFhhWF9ieVh2YWx1ZVgoZmluYWwgT2JqZWN0IGUxMUlkKSB7CisgICAgICAgICAgICByZXR1cm4gZy5FKGUxMUlkKS5wcm9wZXJ0aWVzKCJ3ZWlnaHQiKS5hcygiYSIpLnNlbGVjdCgiYSIpLmJ5KFQudmFsdWUpOworICAgICAgICB9CisKICAgICAgICAgLy8gc2VsZWN0IGNvbHVtbnMgdGVzdAogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvR3JvdXBUZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9Hcm91cFRlc3QuamF2YQppbmRleCA1YjBjZjMyLi5jN2Y4NmQ3IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9Hcm91cFRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9Hcm91cFRlc3QuamF2YQpAQCAtNTksNiArNTksOCBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248VmVydGV4Pj4+IGdldF9nX1ZfZ3JvdXBfYnlYbmFtZVgoKTsKIAorICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8SW50ZWdlciwgQ29sbGVjdGlvbjxWZXJ0ZXg+Pj4gZ2V0X2dfVl9ncm91cF9ieVhhZ2VYKCk7CisKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxWZXJ0ZXg+Pj4gZ2V0X2dfVl9ncm91cF9ieVhuYW1lWF9ieSgpOwogCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248VmVydGV4Pj4+IGdldF9nX1ZfZ3JvdXBYYVhfYnlYbmFtZVhfY2FwWGFYKCk7CkBAIC0xMDEsNiArMTAzLDEwIEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgTnVtYmVyPj4gZ2V0X2dfVl9oYXNMYWJlbFhwZXJzb25YX2FzWHBYX291dFhjcmVhdGVkWF9ncm91cF9ieVhuYW1lWF9ieVhzZWxlY3RYcFhfdmFsdWVzWGFnZVhfc3VtWCgpOwogCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIExvbmc+PiBnZXRfZ19WX2dyb3VwX2J5WGxhYmVsWF9ieVhsYWJlbF9jb3VudFgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBMb25nPj4gZ2V0X2dfVl9ncm91cFhtWF9ieVhsYWJlbFhfYnlYbGFiZWxfY291bnRYX2NhcFhtWCgpOworCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCiAgICAgcHVibGljIHZvaWQgZ19WX2dyb3VwX2J5WG5hbWVYKCkgewpAQCAtMTEwLDYgKzExNiwyNCBAQAogICAgICAgICBjaGVja1NpZGVFZmZlY3RzKHRyYXZlcnNhbC5hc0FkbWluKCkuZ2V0U2lkZUVmZmVjdHMoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgcHVibGljIHZvaWQgZ19WX2dyb3VwX2J5WGFnZVgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxJbnRlZ2VyLCBDb2xsZWN0aW9uPFZlcnRleD4+PiB0cmF2ZXJzYWwgPSBnZXRfZ19WX2dyb3VwX2J5WGFnZVgoKTsKKyAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CisKKyAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIENvbGxlY3Rpb248VmVydGV4Pj4gbWFwID0gdHJhdmVyc2FsLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIG1hcC5zaXplKCkpOworICAgICAgICBtYXAuZm9yRWFjaCgoa2V5LCB2YWx1ZXMpIC0+IHsKKyAgICAgICAgICAgIGlmIChudWxsID09IGtleSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlcy5zaXplKCkpOworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodHJhdmVyc2FsLmhhc05leHQoKSk7CisKKyAgICAgICAgY2hlY2tTaWRlRWZmZWN0cyh0cmF2ZXJzYWwuYXNBZG1pbigpLmdldFNpZGVFZmZlY3RzKCkpOworICAgIH0KIAogICAgIEBUZXN0CiAgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQpAQCAtMTI5LDcgKzE1Myw3IEBACiAgICAgICAgIGNoZWNrU2lkZUVmZmVjdHModHJhdmVyc2FsLmFzQWRtaW4oKS5nZXRTaWRlRWZmZWN0cygpLCAiYSIsIEhhc2hNYXAuY2xhc3MpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDb21tb25BKFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248VmVydGV4Pj4+IHRyYXZlcnNhbCkgeworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDb21tb25BKGZpbmFsIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248VmVydGV4Pj4+IHRyYXZlcnNhbCkgewogICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFZlcnRleD4+IG1hcCA9IHRyYXZlcnNhbC5uZXh0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscyg2LCBtYXAuc2l6ZSgpKTsKICAgICAgICAgbWFwLmZvckVhY2goKGtleSwgdmFsdWVzKSAtPiB7CkBAIC00OTksNiArNTIzLDMyIEBACiAgICAgICAgIGFzc2VydEZhbHNlKHRyYXZlcnNhbC5oYXNOZXh0KCkpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQorICAgIHB1YmxpYyB2b2lkIGdfVl9ncm91cF9ieVhsYWJlbFhfYnlYbGFiZWxfY291bnRYKCkgeworICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBMb25nPj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9ncm91cF9ieVhsYWJlbFhfYnlYbGFiZWxfY291bnRYKCk7CisgICAgICAgIHByaW50VHJhdmVyc2FsRm9ybSh0cmF2ZXJzYWwpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBMb25nPiBtYXAgPSB0cmF2ZXJzYWwubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KCJwZXJzb24iKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KCJzb2Z0d2FyZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDRMLCBtYXAuZ2V0KCJwZXJzb24iKS5sb25nVmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgbWFwLmdldCgic29mdHdhcmUiKS5sb25nVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgcHVibGljIHZvaWQgZ19WX2dyb3VwWG1YX2J5WGxhYmVsWF9ieVhsYWJlbF9jb3VudFhfY2FwWG1YKCkgeworICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBNYXA8U3RyaW5nLCBMb25nPj4gdHJhdmVyc2FsID0gZ2V0X2dfVl9ncm91cFhtWF9ieVhsYWJlbFhfYnlYbGFiZWxfY291bnRYX2NhcFhtWCgpOworICAgICAgICBwcmludFRyYXZlcnNhbEZvcm0odHJhdmVyc2FsKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTG9uZz4gbWFwID0gdHJhdmVyc2FsLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgicGVyc29uIikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgic29mdHdhcmUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0TCwgbWFwLmdldCgicGVyc29uIikubG9uZ1ZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIG1hcC5nZXQoInNvZnR3YXJlIikubG9uZ1ZhbHVlKCkpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhdmVyc2FscyBleHRlbmRzIEdyb3VwVGVzdCB7CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC01MDcsNiArNTU3LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxJbnRlZ2VyLCBDb2xsZWN0aW9uPFZlcnRleD4+PiBnZXRfZ19WX2dyb3VwX2J5WGFnZVgoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkuPEludGVnZXIsIENvbGxlY3Rpb248VmVydGV4Pj5ncm91cCgpLmJ5KCJhZ2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxWZXJ0ZXg+Pj4gZ2V0X2dfVl9ncm91cF9ieVhuYW1lWF9ieSgpIHsKICAgICAgICAgICAgIHJldHVybiBnLlYoKS48U3RyaW5nLCBDb2xsZWN0aW9uPFZlcnRleD4+Z3JvdXAoKS5ieSgibmFtZSIpLmJ5KCk7CiAgICAgICAgIH0KQEAgLTYxMCw1ICs2NjUsMTUgQEAKICAgICAgICAgcHVibGljIFRyYXZlcnNhbDxWZXJ0ZXgsIE1hcDxTdHJpbmcsIE51bWJlcj4+IGdldF9nX1ZfaGFzTGFiZWxYcGVyc29uWF9hc1hwWF9vdXRYY3JlYXRlZFhfZ3JvdXBfYnlYbmFtZVhfYnlYc2VsZWN0WHBYX3ZhbHVlc1hhZ2VYX3N1bVgoKSB7CiAgICAgICAgICAgICByZXR1cm4gZy5WKCkuaGFzTGFiZWwoInBlcnNvbiIpLmFzKCJwIikub3V0KCJjcmVhdGVkIikuPFN0cmluZywgTnVtYmVyPmdyb3VwKCkuYnkoIm5hbWUiKS5ieShfXy5zZWxlY3QoInAiKS52YWx1ZXMoImFnZSIpLnN1bSgpKTsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgTG9uZz4+IGdldF9nX1ZfZ3JvdXBfYnlYbGFiZWxYX2J5WGxhYmVsX2NvdW50WCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnLlYoKS48U3RyaW5nLCBMb25nPmdyb3VwKCkuYnkoX18ubGFiZWwoKSkuYnkoX18ubGFiZWwoKS5jb3VudCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgTWFwPFN0cmluZywgTG9uZz4+IGdldF9nX1ZfZ3JvdXBYbVhfYnlYbGFiZWxYX2J5WGxhYmVsX2NvdW50WF9jYXBYbVgoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5WKCkuZ3JvdXAoIm0iKS5ieShfXy5sYWJlbCgpKS5ieShfXy5sYWJlbCgpLmNvdW50KCkpLmNhcCgibSIpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvSW5qZWN0VGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvSW5qZWN0VGVzdC5qYXZhCmluZGV4IGQzZmMxZWQuLmZkNzUyZDIgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L0luamVjdFRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9JbmplY3RUZXN0LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuR3JlbWxpblByb2Nlc3NSdW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5QYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2FsOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLk1hcEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC00OCw2ICs0OSwxMiBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxWZXJ0ZXgsIFN0cmluZz4gZ2V0X2dfVlgxWF9pbmplY3RYZ19WWDRYWF9vdXRfbmFtZShmaW5hbCBPYmplY3QgdjFJZCwgZmluYWwgT2JqZWN0IHY0SWQpOwogCisgICAgcHVibGljIGFic3RyYWN0IFRyYXZlcnNhbDxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRfZ19pbmplY3RYbnVsbF8xXzNfbnVsbFgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8SW50ZWdlciwgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0X2dfaW5qZWN0WDEwXzIwX251bGxfMjBfMTBfMTBYX2dyb3VwQ291bnRYeFhfZGVkdXBfYXNYeVhfcHJvamVjdFhhX2JYX2J5X2J5WHNlbGVjdFh4WF9zZWxlY3RYc2VsZWN0WHlYWFgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBUcmF2ZXJzYWw8TWFwPFN0cmluZyxPYmplY3Q+LCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRfZ19pbmplY3RYbmFtZV9tYXJrb19hZ2VfbnVsbFhfc2VsZWN0WG5hbWVfYWdlWCgpOworCiAgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCiAgICAgcHVibGljIHZvaWQgZ19WWDFYX291dF9pbmplY3RYdjJYX25hbWUoKSB7CkBAIC04NSw2ICs5MiwzMCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ19pbmplY3RYbnVsbF8xXzNfbnVsbFgoKSB7CisgICAgICAgIGZpbmFsIFRyYXZlcnNhbDxJbnRlZ2VyLCBJbnRlZ2VyPiB0cmF2ZXJzYWwgPSBnZXRfZ19pbmplY3RYbnVsbF8xXzNfbnVsbFgoKTsKKyAgICAgICAgcHJpbnRUcmF2ZXJzYWxGb3JtKHRyYXZlcnNhbCk7CisgICAgICAgIGNoZWNrUmVzdWx0cyhBcnJheXMuYXNMaXN0KG51bGwsIDEsIDMsIG51bGwpLCB0cmF2ZXJzYWwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ19pbmplY3RYMTBfMjBfbnVsbF8yMF8xMF8xMFhfZ3JvdXBDb3VudFh4WF9kZWR1cF9hc1h5WF9wcm9qZWN0WGFfYlhfYnlfYnlYc2VsZWN0WHhYX3NlbGVjdFhzZWxlY3RYeVhYWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPEludGVnZXIsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHRyYXZlcnNhbCA9IGdldF9nX2luamVjdFgxMF8yMF9udWxsXzIwXzEwXzEwWF9ncm91cENvdW50WHhYX2RlZHVwX2FzWHlYX3Byb2plY3RYYV9iWF9ieV9ieVhzZWxlY3RYeFhfc2VsZWN0WHNlbGVjdFh5WFhYKCk7CisgICAgICAgIHByaW50VHJhdmVyc2FsRm9ybSh0cmF2ZXJzYWwpOworICAgICAgICBjaGVja1Jlc3VsdHMobWFrZU1hcExpc3QoMiwKKyAgICAgICAgICAgICAgICAiYSIsIDEwLCAiYiIsIDNMLAorICAgICAgICAgICAgICAgICAgICAiYSIsIDIwLCAiYiIsIDJMLAorICAgICAgICAgICAgICAgICAgICAiYSIsIG51bGwsICJiIiwgMUwpLCB0cmF2ZXJzYWwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ19pbmplY3RYbmFtZV9tYXJrb19hZ2VfbnVsbFhfc2VsZWN0WG5hbWVfYWdlWCgpIHsKKyAgICAgICAgZmluYWwgVHJhdmVyc2FsPE1hcDxTdHJpbmcsIE9iamVjdD4sIE1hcDxTdHJpbmcsIE9iamVjdD4+IHRyYXZlcnNhbCA9IGdldF9nX2luamVjdFhuYW1lX21hcmtvX2FnZV9udWxsWF9zZWxlY3RYbmFtZV9hZ2VYKCk7CisgICAgICAgIHByaW50VHJhdmVyc2FsRm9ybSh0cmF2ZXJzYWwpOworICAgICAgICBjaGVja1Jlc3VsdHMobWFrZU1hcExpc3QoMiwgIm5hbWUiLCAibWFya28iLCAiYWdlIiwgbnVsbCksIHRyYXZlcnNhbCk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCiAgICAgcHVibGljIHZvaWQgZ19WWDFYX2luamVjdFhnX1ZYNFhYX291dF9uYW1lKCkgewogICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBTdHJpbmc+IHRyYXZlcnNhbCA9IGdldF9nX1ZYMVhfaW5qZWN0WGdfVlg0WFhfb3V0X25hbWUoY29udmVydFRvVmVydGV4SWQoIm1hcmtvIiksIGNvbnZlcnRUb1ZlcnRleElkKCJqb3NoIikpOwpAQCAtMTA4LDUgKzEzOSwyNyBAQAogICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPFZlcnRleCwgU3RyaW5nPiBnZXRfZ19WWDFYX2luamVjdFhnX1ZYNFhYX291dF9uYW1lKGZpbmFsIE9iamVjdCB2MUlkLCBmaW5hbCBPYmplY3QgdjRJZCkgewogICAgICAgICAgICAgcmV0dXJuIGcuVih2MUlkKS5pbmplY3QoZy5WKHY0SWQpLm5leHQoKSkub3V0KCkudmFsdWVzKCJuYW1lIik7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRfZ19pbmplY3RYbnVsbF8xXzNfbnVsbFgoKSB7CisgICAgICAgICAgICByZXR1cm4gZy5pbmplY3QobnVsbCwgMSwgMywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYXZlcnNhbDxJbnRlZ2VyLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRfZ19pbmplY3RYMTBfMjBfbnVsbF8yMF8xMF8xMFhfZ3JvdXBDb3VudFh4WF9kZWR1cF9hc1h5WF9wcm9qZWN0WGFfYlhfYnlfYnlYc2VsZWN0WHhYX3NlbGVjdFhzZWxlY3RYeVhYWCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnLmluamVjdCgxMCwyMCxudWxsLDIwLDEwLDEwKS5ncm91cENvdW50KCJ4IikuCisgICAgICAgICAgICAgICAgICAgICBkZWR1cCgpLmFzKCJ5IikuCisgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KCJhIiwiYiIpLgorICAgICAgICAgICAgICAgICAgICAgICBieSgpLgorICAgICAgICAgICAgICAgICAgICAgICBieShfXy5zZWxlY3QoIngiKS5zZWxlY3QoX18uc2VsZWN0KCJ5IikpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhdmVyc2FsPE1hcDxTdHJpbmcsIE9iamVjdD4sIE1hcDxTdHJpbmcsIE9iamVjdD4+IGdldF9nX2luamVjdFhuYW1lX21hcmtvX2FnZV9udWxsWF9zZWxlY3RYbmFtZV9hZ2VYKCkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBtLnB1dCgibmFtZSIsICJtYXJrbyIpOworICAgICAgICAgICAgbS5wdXQoImFnZSIsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIGcuaW5qZWN0KG0pLnNlbGVjdCgibmFtZSIsImFnZSIpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdGVwL3NpZGVFZmZlY3QvU3ViZ3JhcGhUZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9TdWJncmFwaFRlc3QuamF2YQppbmRleCA1MWQ4ODcwLi45ZjE0ZDE1IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9TdWJncmFwaFRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9TdWJncmFwaFRlc3QuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkZlYXR1cmVSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkxvYWRHcmFwaFdpdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLkFic3RyYWN0R3JlbWxpblByb2Nlc3NUZXN0OwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1BhcnRpdGlvblN0cmF0ZWd5UHJvY2Vzc1Rlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9QYXJ0aXRpb25TdHJhdGVneVByb2Nlc3NUZXN0LmphdmEKaW5kZXggZjU1MjAyMi4uYzBhZjJkOSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1BhcnRpdGlvblN0cmF0ZWd5UHJvY2Vzc1Rlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vUGFydGl0aW9uU3RyYXRlZ3lQcm9jZXNzVGVzdC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uTWFwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuTWFwQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkZlYXR1cmVSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkZlYXR1cmVSZXF1aXJlbWVudFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuQWJzdHJhY3RHcmVtbGluUHJvY2Vzc1Rlc3Q7CmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU2VlZFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9TZWVkU3RyYXRlZ3lQcm9jZXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGMwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU2VlZFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuQWJzdHJhY3RHcmVtbGluUHJvY2Vzc1Rlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLkdyZW1saW5Qcm9jZXNzUnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkxvYWRHcmFwaFdpdGguR3JhcGhEYXRhLkdSQVRFRlVMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkxvYWRHcmFwaFdpdGguR3JhcGhEYXRhLk1PREVSTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5PcmRlci5zaHVmZmxlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlNjb3BlLmxvY2FsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworQFJ1bldpdGgoR3JlbWxpblByb2Nlc3NSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2VlZFN0cmF0ZWd5UHJvY2Vzc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEdyZW1saW5Qcm9jZXNzVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VlZFN0cmF0ZWd5IHNlZWRTdHJhdGVneSA9IG5ldyBTZWVkU3RyYXRlZ3koMTIzNUwpOworCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgcHVibGljIHZvaWQgc2hvdWxkU2VlZENvaW4oKSB7CisgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGdTZWVkZWQgPSBjcmVhdGUoKTsKKyAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IG5hbWVzID0gZ1NlZWRlZC5WKCkub3JkZXIoKS5ieSgibmFtZSIpLnZhbHVlcygibmFtZSIpLmNvaW4oMC4zMSkub3JkZXIoKS50b0xpc3QoKTsKKyAgICAgICAgcmVwZWF0QXNzZXJ0KCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lcywgZ1NlZWRlZC5WKCkub3JkZXIoKS5ieSgibmFtZSIpLnZhbHVlcygibmFtZSIpLmNvaW4oMC4zMSkub3JkZXIoKS50b0xpc3QoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChNT0RFUk4pCisgICAgcHVibGljIHZvaWQgc2hvdWxkU2VlZEdsb2JhbE9yZGVyU2h1ZmZsZSgpIHsKKyAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZ1NlZWRlZCA9IGNyZWF0ZSgpOworICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gbmFtZXMgPSBnU2VlZGVkLlYoKS5vcmRlcigpLmJ5KCJuYW1lIikudmFsdWVzKCJuYW1lIikub3JkZXIoKS5ieShzaHVmZmxlKS50b0xpc3QoKTsKKyAgICAgICAgcmVwZWF0QXNzZXJ0KCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lcywgZ1NlZWRlZC5WKCkub3JkZXIoKS5ieSgibmFtZSIpLnZhbHVlcygibmFtZSIpLm9yZGVyKCkuYnkoc2h1ZmZsZSkudG9MaXN0KCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgQExvYWRHcmFwaFdpdGgoTU9ERVJOKQorICAgIHB1YmxpYyB2b2lkIHNob3VsZFNlZWRMb2NhbE9yZGVyU2h1ZmZsZSgpIHsKKyAgICAgICAgZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZ1NlZWRlZCA9IGNyZWF0ZSgpOworICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gbmFtZXMgPSBnU2VlZGVkLlYoKS5vcmRlcigpLmJ5KCJuYW1lIikudmFsdWVzKCJuYW1lIikuZm9sZCgpLm9yZGVyKGxvY2FsKS5ieShzaHVmZmxlKS5uZXh0KCk7CisgICAgICAgIHJlcGVhdEFzc2VydCgoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZXMsIGdTZWVkZWQuVigpLm9yZGVyKCkuYnkoIm5hbWUiKS52YWx1ZXMoIm5hbWUiKS5mb2xkKCkub3JkZXIobG9jYWwpLmJ5KHNodWZmbGUpLm5leHQoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChHUkFURUZVTCkKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRTZWVkR2xvYmFsU2FtcGxlKCkgeworICAgICAgICBmaW5hbCBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnU2VlZGVkID0gY3JlYXRlKCk7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBuYW1lcyA9IGdTZWVkZWQuVigpLm9yZGVyKCkuYnkoIm5hbWUiKS52YWx1ZXMoIm5hbWUiKS5zYW1wbGUoMjApLnRvTGlzdCgpOworICAgICAgICByZXBlYXRBc3NlcnQoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWVzLCBnU2VlZGVkLlYoKS5vcmRlcigpLmJ5KCJuYW1lIikudmFsdWVzKCJuYW1lIikuc2FtcGxlKDIwKS50b0xpc3QoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATG9hZEdyYXBoV2l0aChHUkFURUZVTCkKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRTZWVkTG9jYWxTYW1wbGUoKSB7CisgICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGdTZWVkZWQgPSBjcmVhdGUoKTsKKyAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IG5hbWVzID0gZ1NlZWRlZC5WKCkub3JkZXIoKS5ieSgibmFtZSIpLnZhbHVlcygibmFtZSIpLmZvbGQoKS5zYW1wbGUobG9jYWwsMjApLm5leHQoKTsKKyAgICAgICAgcmVwZWF0QXNzZXJ0KCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lcywgZ1NlZWRlZC5WKCkub3JkZXIoKS5ieSgibmFtZSIpLnZhbHVlcygibmFtZSIpLmZvbGQoKS5zYW1wbGUobG9jYWwsMjApLm5leHQoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcGVhdEFzc2VydChmaW5hbCBTdXBwbGllcjxWb2lkPiBhc3NlcnRpb24pIHsKKyAgICAgICAgZm9yIChpbnQgaXggPSAwOyBpeCA8IDEyODsgaXgrKykgeworICAgICAgICAgICAgYXNzZXJ0aW9uLmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBHcmFwaFRyYXZlcnNhbFNvdXJjZSBjcmVhdGUoKSB7CisgICAgICAgIHJldHVybiBnLndpdGhTdHJhdGVnaWVzKHNlZWRTdHJhdGVneSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1N1YmdyYXBoU3RyYXRlZ3lQcm9jZXNzVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1N1YmdyYXBoU3RyYXRlZ3lQcm9jZXNzVGVzdC5qYXZhCmluZGV4IGNmMWM3OTAuLjdiYjRmYTkgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9TdWJncmFwaFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vU3ViZ3JhcGhTdHJhdGVneVByb2Nlc3NUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuQWJzdHJhY3RHcmVtbGluUHJvY2Vzc1Rlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLkdyZW1saW5Qcm9jZXNzUnVubmVyOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1RyYW5zbGF0aW9uU3RyYXRlZ3kuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9UcmFuc2xhdGlvblN0cmF0ZWd5LmphdmEKaW5kZXggZmNlY2Y5ZS4uNWYzNDU4ZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL1RyYW5zbGF0aW9uU3RyYXRlZ3kuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vVHJhbnNsYXRpb25TdHJhdGVneS5qYXZhCkBAIC02MCw2ICs2MCw3IEBACiAgICAgICAgICAgICBQYXJ0aXRpb25TdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgIFJlcXVpcmVtZW50c1N0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgU2Fja1N0cmF0ZWd5LmNsYXNzLAorICAgICAgICAgICAgU2VlZFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgU2lkZUVmZmVjdFN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgU3ViZ3JhcGhTdHJhdGVneS5jbGFzcywKICAgICAgICAgICAgIFJlbW90ZVN0cmF0ZWd5LmNsYXNzLApAQCAtNzMsNyArNzQsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgewotICAgICAgICBpZiAoISh0cmF2ZXJzYWwuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBFbXB0eVN0ZXApKQorICAgICAgICBpZiAoISh0cmF2ZXJzYWwuaXNSb290KCkpIHx8IHRyYXZlcnNhbC5nZXRCeXRlY29kZSgpLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48PywgPz4gdHJhbnNsYXRlZFRyYXZlcnNhbDsKQEAgLTEzNCw3ICsxMzUsOSBAQAogICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gbmV3QXJncyA9IG5ldyBPYmplY3RbYXJncy5sZW5ndGhdOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoImtub3dzIikpCisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbmV3QXJnc1tpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoImtub3dzIikpCiAgICAgICAgICAgICAgICAgICAgIG5ld0FyZ3NbaV0gPSBuZXcgQnl0ZWNvZGUuQmluZGluZzw+KCJhIiwgImtub3dzIik7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoImNyZWF0ZWQiKSkKICAgICAgICAgICAgICAgICAgICAgbmV3QXJnc1tpXSA9IG5ldyBCeXRlY29kZS5CaW5kaW5nPD4oImIiLCAiY3JlYXRlZCIpOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vRWFybHlMaW1pdFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL0Vhcmx5TGltaXRTdHJhdGVneVByb2Nlc3NUZXN0LmphdmEKaW5kZXggOGE2NDBlMi4uMzNkMThjMSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vRWFybHlMaW1pdFN0cmF0ZWd5UHJvY2Vzc1Rlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9FYXJseUxpbWl0U3RyYXRlZ3lQcm9jZXNzVGVzdC5qYXZhCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIGFzc3VtZVRydWUoIlRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9ucyBhcHBseSB0byBUaW5rZXJHcmFwaCBvbmx5IGFzIHByb3ZpZGVyIHN0cmF0ZWdpZXMgY2FuIGFsdGVyIHRoZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICJzdGVwcyB0byBub3QgY29tcGx5IHdpdGggZXhwZWN0YXRpb25zIiwgZ3JhcGguZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKCJUaW5rZXJHcmFwaCIpKTsKIAotICAgICAgICBpZiAodC5hc0FkbWluKCkuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLnN0cmVhbSgpLmFueU1hdGNoKHMgLT4gcyBpbnN0YW5jZW9mIEVhcmx5TGltaXRTdHJhdGVneSkpIHsKKyAgICAgICAgaWYgKHQuYXNBZG1pbigpLmdldFN0cmF0ZWdpZXMoKS5nZXRTdHJhdGVneShFYXJseUxpbWl0U3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1ldHJpY3MuZ2V0TWV0cmljcygpLnNpemUoKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1ldHJpY3MuZ2V0TWV0cmljcyg1KS5nZXROYW1lKCkuZW5kc1dpdGgoIkBbZF0iKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJhbmdlR2xvYmFsU3RlcCgwLDEpIiwgbWV0cmljcy5nZXRNZXRyaWNzKDYpLmdldE5hbWUoKSk7CmRpZmYgLS1naXQgYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9LZGNGaXh0dXJlLmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NlcnZlci9LZGNGaXh0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhNWUwMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc2VydmVyL0tkY0ZpeHR1cmUuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5rZXJieS5rZXJiZXJvcy5rZXJiLktyYkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmtlcmJ5LmtlcmJlcm9zLmtlcmIuY2xpZW50LktyYkNsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmtlcmJ5LmtlcmJlcm9zLmtlcmIuY2xpZW50LktyYkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmtlcmJ5LmtlcmJlcm9zLmtlcmIuY2xpZW50LktyYkNvbmZpZ0tleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmtlcmJ5LmtlcmJlcm9zLmtlcmIuc2VydmVyLlNpbXBsZUtkY1NlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmtlcmJ5LmtlcmJlcm9zLmtlcmIudHlwZS50aWNrZXQuVGd0VGlja2V0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LkluZXQ0QWRkcmVzczsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvZGlyZWN0b3J5LWtlcmJ5L2Jsb2Iva2VyYnktYWxsLTEuMC4wLVJDMjoKKyAqICAtIG9yZy5hcGFjaGUua2VyYnkua2VyYmVyb3Mua2VyYi5zZXJ2ZXIuVGVzdEtkY1NlcnZlcgorICogIC0gb3JnLmFwYWNoZS5rZXJieS5rZXJiZXJvcy5rZXJiLnNlcnZlci5LZGNUZXN0QmFzZQorICogIC0gb3JnLmFwYWNoZS5rZXJieS5rZXJiZXJvcy5rZXJiLnNlcnZlci5Mb2dpblRlc3RCYXNlCisgKgorICogU2VlIGFsc286IGdyZW1saW4tc2VydmVyL3NyYy9tYWluL3N0YXRpYy9OT1RJQ0UKKyAqCisgKiBAYXV0aG9yIE1hcmMgZGUgTGlnbmllCisgKi8KK3B1YmxpYyBjbGFzcyBLZGNGaXh0dXJlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoS2RjRml4dHVyZS5jbGFzcyk7CisKKyAgICBmaW5hbCBTdHJpbmcgY2xpZW50UGFzc3dvcmQgPSAiMTIzNDU2IjsKKyAgICBmaW5hbCBTdHJpbmcgY2xpZW50UGFzc3dvcmQyID0gIjEyMzQ1NjIiOworICAgIGZpbmFsIFN0cmluZyB1c2VyUGFzc3dvcmQgPSAicGFzc3dvcmQiOworICAgIGZpbmFsIFN0cmluZyBjbGllbnRQcmluY2lwYWxOYW1lID0gImRyYW5reWUiOworICAgIGZpbmFsIFN0cmluZyBjbGllbnRQcmluY2lwYWxOYW1lMiA9ICJkcmFua3llMiI7CisgICAgZmluYWwgU3RyaW5nIHVzZXJQcmluY2lwYWxOYW1lID0gInN0ZXBoZW4iOworICAgIGZpbmFsIFN0cmluZyBzZXJ2ZXJQcmluY2lwYWxOYW1lID0gInRlc3Qtc2VydmljZSI7CisgICAgZmluYWwgU3RyaW5nIHRpY2tldENhY2hlRmlsZU5hbWUgPSAidGVzdC10a3QuY2MiOworICAgIGZpbmFsIFN0cmluZyB0aWNrZXRDYWNoZUZpbGVOYW1lMiA9ICJ0ZXN0LXRrdDIuY2MiOworICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlS2V5dGFiRmlsZU5hbWUgPSAidGVzdC1zZXJ2aWNlLmtleXRhYiI7CisKKyAgICBmaW5hbCBTdHJpbmcgY2xpZW50UHJpbmNpcGFsOworICAgIGZpbmFsIFN0cmluZyBjbGllbnRQcmluY2lwYWwyOworICAgIGZpbmFsIFN0cmluZyBzZXJ2ZXJQcmluY2lwYWw7CisgICAgZmluYWwgU3RyaW5nIHVzZXJQcmluY2lwYWw7CisgICAgZmluYWwgRmlsZSB0ZXN0RGlyOworICAgIGZpbmFsIEZpbGUgdGlja2V0Q2FjaGVGaWxlOworICAgIGZpbmFsIEZpbGUgdGlja2V0Q2FjaGVGaWxlMjsKKyAgICBmaW5hbCBGaWxlIHNlcnZpY2VLZXl0YWJGaWxlOworCisgICAgZmluYWwgU3RyaW5nIGdyZW1saW5Ib3N0bmFtZTsKKyAgICBmaW5hbCBTdHJpbmcga2RjSG9zdG5hbWU7CisgICAgcHJpdmF0ZSBTaW1wbGVLZGNTZXJ2ZXIga2RjU2VydmVyOworCisgICAgcHVibGljIEtkY0ZpeHR1cmUoZmluYWwgU3RyaW5nIG1vZHVsZUJhc2VEaXIpIHsKKyAgICAgICAgdGhpcyhtb2R1bGVCYXNlRGlyLCAibG9jYWxob3N0Iik7CisgICAgfQorCisgICAgcHVibGljIEtkY0ZpeHR1cmUoZmluYWwgU3RyaW5nIG1vZHVsZUJhc2VEaXIsIGZpbmFsIFN0cmluZyBrZGNIb3N0TmFtZSkgeworICAgICAgICB0aGlzLmtkY0hvc3RuYW1lID0ga2RjSG9zdE5hbWU7CisgICAgICAgIGdyZW1saW5Ib3N0bmFtZSA9IGZpbmRIb3N0bmFtZSgpOworICAgICAgICBzZXJ2ZXJQcmluY2lwYWwgPSBzZXJ2ZXJQcmluY2lwYWxOYW1lICsgIi8iICsgZ3JlbWxpbkhvc3RuYW1lICsgIkAiICsgS2RjRml4dHVyZS5UZXN0S2RjU2VydmVyLktEQ19SRUFMTTsKKyAgICAgICAgY2xpZW50UHJpbmNpcGFsID0gY2xpZW50UHJpbmNpcGFsTmFtZSArICJAIiArIEtkY0ZpeHR1cmUuVGVzdEtkY1NlcnZlci5LRENfUkVBTE07CisgICAgICAgIGNsaWVudFByaW5jaXBhbDIgPSBjbGllbnRQcmluY2lwYWxOYW1lMiArICJAIiArIEtkY0ZpeHR1cmUuVGVzdEtkY1NlcnZlci5LRENfUkVBTE07CisgICAgICAgIHVzZXJQcmluY2lwYWwgPSB1c2VyUHJpbmNpcGFsTmFtZSAgKyAiQCIgKyBLZGNGaXh0dXJlLlRlc3RLZGNTZXJ2ZXIuS0RDX1JFQUxNOworCisgICAgICAgIGZpbmFsIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUobW9kdWxlQmFzZURpciwgInRhcmdldCIpOworICAgICAgICB0ZXN0RGlyID0gbmV3IEZpbGUodGFyZ2V0RGlyLCAia2RjIik7CisgICAgICAgIHRlc3REaXIubWtkaXJzKCk7CisgICAgICAgIHRpY2tldENhY2hlRmlsZSA9IG5ldyBGaWxlKHRlc3REaXIsIHRpY2tldENhY2hlRmlsZU5hbWUpOworICAgICAgICB0aWNrZXRDYWNoZUZpbGUyID0gbmV3IEZpbGUodGVzdERpciwgdGlja2V0Q2FjaGVGaWxlTmFtZTIpOworICAgICAgICBzZXJ2aWNlS2V5dGFiRmlsZSA9IG5ldyBGaWxlKHRlc3REaXIsIHNlcnZpY2VLZXl0YWJGaWxlTmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZmluZEhvc3RuYW1lKCkgeworICAgICAgICAvLyBIb3N0bmFtZSBzZXR0aW5nIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgZ3JlbWxpbi1jb25zb2xlIHNldHMgZ3JlbWxpbi1zZXJ2ZXIncyBob3N0bmFtZQorICAgICAgICAvLyBhbmQgZGVyaXZlcyBncmVtbGluLXNlcnZlcidzIHByaW5jaXBhbCBuYW1lLiBBbHNvLCB0aGUgaG9zdG5hbWUgbmVlZHMgdG8gYmUgbG93ZXJjYXNlIGZvciB1c2UKKyAgICAgICAgLy8gaW4gcHJpbmNpcGFsIG5hbWVzLgorICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhvc3RuYW1lID0gSW5ldDRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldENhbm9uaWNhbEhvc3ROYW1lKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiSG9zdG5hbWUgbm90IGZvdW5kOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBob3N0bmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RLZGNTZXJ2ZXIgZXh0ZW5kcyBTaW1wbGVLZGNTZXJ2ZXIgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRENfUkVBTE0gPSAiVEVTVC5DT00iOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIEhPU1ROQU1FID0ga2RjSG9zdG5hbWU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtEQ19QT1JUID0gNDU4ODsKKworICAgICAgICBUZXN0S2RjU2VydmVyKCkgdGhyb3dzIEtyYkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzZXRLZGNSZWFsbShLRENfUkVBTE0pOworICAgICAgICAgICAgc2V0S2RjSG9zdChIT1NUTkFNRSk7CisgICAgICAgICAgICBzZXRBbGxvd1RjcCh0cnVlKTsKKyAgICAgICAgICAgIHNldEFsbG93VWRwKHRydWUpOworICAgICAgICAgICAgc2V0S2RjVGNwUG9ydChLRENfUE9SVCk7CisgICAgICAgICAgICBzZXRLZGNVZHBQb3J0KEtEQ19QT1JUKTsKKworICAgICAgICAgICAgZmluYWwgS3JiQ2xpZW50IGtyYkNsbnQgPSBnZXRLcmJDbGllbnQoKTsKKyAgICAgICAgICAgIGZpbmFsIEtyYkNvbmZpZyBrcmJDb25maWcgPSBrcmJDbG50LmdldEtyYkNvbmZpZygpOworICAgICAgICAgICAga3JiQ29uZmlnLnNldFN0cmluZyhLcmJDb25maWdLZXkuUEVSTUlUVEVEX0VOQ1RZUEVTLAorICAgICAgICAgICAgICAgICAgICAiYWVzMTI4LWN0cy1obWFjLXNoYTEtOTYgZGVzLWNiYy1jcmMgZGVzLWNiYy1tZDUgZGVzMy1jYmMtc2hhMSIpOworICAgICAgICAgICAga3JiQ29uZmlnLnNldFN0cmluZyhLcmJDb25maWdLZXkuREVGQVVMVF9SRUFMTSwgS0RDX1JFQUxNKTsKKyAgICAgICAgICAgIGtyYkNsbnQuc2V0VGltZW91dCgxMCAqIDEwMDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0VXBLZGNTZXJ2ZXIoKTsKKyAgICAgICAgc2V0VXBQcmluY2lwYWxzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwS2RjU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGtkY1NlcnZlciA9IG5ldyBUZXN0S2RjU2VydmVyKCk7CisgICAgICAgIGtkY1NlcnZlci5zZXRXb3JrRGlyKHRlc3REaXIpOworICAgICAgICBrZGNTZXJ2ZXIuaW5pdCgpOworICAgICAgICBrZGNTZXJ2ZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBQcmluY2lwYWxzKCkgdGhyb3dzIEtyYkV4Y2VwdGlvbiB7CisgICAgICAgIGtkY1NlcnZlci5jcmVhdGVQcmluY2lwYWxzKHNlcnZlclByaW5jaXBhbCk7CisgICAgICAgIGtkY1NlcnZlci5leHBvcnRQcmluY2lwYWwoc2VydmVyUHJpbmNpcGFsLCBzZXJ2aWNlS2V5dGFiRmlsZSk7CisKKyAgICAgICAga2RjU2VydmVyLmNyZWF0ZVByaW5jaXBhbChjbGllbnRQcmluY2lwYWwsIGNsaWVudFBhc3N3b3JkKTsKKyAgICAgICAgZmluYWwgVGd0VGlja2V0IHRndCA9IGtkY1NlcnZlci5nZXRLcmJDbGllbnQoKS5yZXF1ZXN0VGd0KGNsaWVudFByaW5jaXBhbCwgY2xpZW50UGFzc3dvcmQpOworICAgICAgICBrZGNTZXJ2ZXIuZ2V0S3JiQ2xpZW50KCkuc3RvcmVUaWNrZXQodGd0LCB0aWNrZXRDYWNoZUZpbGUpOworCisgICAgICAgIGtkY1NlcnZlci5jcmVhdGVQcmluY2lwYWwoY2xpZW50UHJpbmNpcGFsMiwgY2xpZW50UGFzc3dvcmQyKTsKKyAgICAgICAgZmluYWwgVGd0VGlja2V0IHRndDIgPSBrZGNTZXJ2ZXIuZ2V0S3JiQ2xpZW50KCkucmVxdWVzdFRndChjbGllbnRQcmluY2lwYWwyLCBjbGllbnRQYXNzd29yZDIpOworICAgICAgICBrZGNTZXJ2ZXIuZ2V0S3JiQ2xpZW50KCkuc3RvcmVUaWNrZXQodGd0MiwgdGlja2V0Q2FjaGVGaWxlMik7CisKKyAgICAgICAga2RjU2VydmVyLmNyZWF0ZVByaW5jaXBhbCh1c2VyUHJpbmNpcGFsLCB1c2VyUGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRlbGV0ZVByaW5jaXBhbHMoKTsKKyAgICAgICAga2RjU2VydmVyLnN0b3AoKTsKKyAgICAgICAgdGlja2V0Q2FjaGVGaWxlLmRlbGV0ZSgpOworICAgICAgICB0aWNrZXRDYWNoZUZpbGUyLmRlbGV0ZSgpOworICAgICAgICBzZXJ2aWNlS2V5dGFiRmlsZS5kZWxldGUoKTsKKyAgICAgICAgdGVzdERpci5kZWxldGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlUHJpbmNpcGFscygpIHRocm93cyBLcmJFeGNlcHRpb24geworICAgICAgICBrZGNTZXJ2ZXIuZ2V0S2FkbWluKCkuZGVsZXRlQnVpbHRpblByaW5jaXBhbHMoKTsKKyAgICAgICAga2RjU2VydmVyLmRlbGV0ZVByaW5jaXBhbHMoc2VydmVyUHJpbmNpcGFsKTsKKyAgICAgICAga2RjU2VydmVyLmRlbGV0ZVByaW5jaXBhbChjbGllbnRQcmluY2lwYWwpOworICAgICAgICBrZGNTZXJ2ZXIuZGVsZXRlUHJpbmNpcGFsKGNsaWVudFByaW5jaXBhbDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVByaW5jaXBhbChmaW5hbCBTdHJpbmcgcHJpbmNpcGFsKSB0aHJvd3MgS3JiRXhjZXB0aW9uIHsKKyAgICAgICAga2RjU2VydmVyLmNyZWF0ZVByaW5jaXBhbChwcmluY2lwYWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0QmFzZURpciA9IGFyZ3NbMF07CisgICAgICAgIC8vIFRoZSBLREMgaW4gZG9ja2VyL2dyZW1saW4tc2VydmVyLnNoIG5lZWRzIHRvIGJlIGV4cG9zZWQgdG8gYm90aCB0aGUgY29udGFpbmVyIGFuZCB0aGUgaG9zdAorICAgICAgICBmaW5hbCBLZGNGaXh0dXJlIGtkY0ZpeHR1cmUgPSBuZXcgS2RjRml4dHVyZShwcm9qZWN0QmFzZURpciwgIjAuMC4wLjAiKTsKKyAgICAgICAga2RjRml4dHVyZS5zZXRVcCgpOworICAgICAgICBsb2dnZXIuaW5mbygiS0RDIHN0YXJ0ZWQgd2l0aCBjb25maWd1cmF0aW9uIHt9L3RhcmdldC9rZGMva3JiNS5jb25mIiwgcHJvamVjdEJhc2VEaXIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvR3JhcGhDb25zdHJ1Y3Rpb25UZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9HcmFwaENvbnN0cnVjdGlvblRlc3QuamF2YQppbmRleCA4YjNlMDQ2Li41NzYxMjZhIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9HcmFwaENvbnN0cnVjdGlvblRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9HcmFwaENvbnN0cnVjdGlvblRlc3QuamF2YQpAQCAtMjAsNyArMjAsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5BYnN0cmFjdEdyZW1saW5UZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuR3JhcGhGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL1Byb3BlcnR5VGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvUHJvcGVydHlUZXN0LmphdmEKaW5kZXggOGI0NDNmYy4uMDk5YjNhMyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvUHJvcGVydHlUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvUHJvcGVydHlUZXN0LmphdmEKQEAgLTQwLDcgKzQwLDkgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaC5GZWF0dXJlcy5Qcm9wZXJ0eUZlYXR1cmVzLkZFQVRVUkVfUFJPUEVSVElFUzsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRoYXQ7CiAKQEAgLTE0MSw2ICsxNDMsNjIgQEAKICAgICAgICAgICAgICAgICBmYWlsKCJSZW1vdmluZyBhbiBlZGdlIHByb3BlcnR5IHRoYXQgd2FzIGFscmVhZHkgcmVtb3ZlZCBzaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgQEZlYXR1cmVSZXF1aXJlbWVudFNldChGZWF0dXJlUmVxdWlyZW1lbnRTZXQuUGFja2FnZS5WRVJUSUNFU19PTkxZKQorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9OVUxMX1BST1BFUlRZX1ZBTFVFUywgc3VwcG9ydGVkID0gZmFsc2UpCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdEFsbG93TnVsbEFkZFZlcnRleCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgVmVydGV4IHYgPSB0aGlzLmdyYXBoLmFkZFZlcnRleCgibmFtZSIsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh2LnByb3BlcnRpZXMoIm5hbWUiKS5oYXNOZXh0KCksIGlzKGZhbHNlKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50U2V0KEZlYXR1cmVSZXF1aXJlbWVudFNldC5QYWNrYWdlLlNJTVBMRSkKKyAgICAgICAgQEZlYXR1cmVSZXF1aXJlbWVudChmZWF0dXJlQ2xhc3MgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLkZFQVRVUkVfTlVMTF9QUk9QRVJUWV9WQUxVRVMsIHN1cHBvcnRlZCA9IGZhbHNlKQorICAgICAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RBbGxvd051bGxBZGRFZGdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IHRoaXMuZ3JhcGguYWRkVmVydGV4KCk7CisgICAgICAgICAgICBmaW5hbCBFZGdlIGUgPSB2LmFkZEVkZ2UoInNlbGYiLCB2LCAibmFtZSIsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChlLnByb3BlcnRpZXMoIm5hbWUiKS5oYXNOZXh0KCksIGlzKGZhbHNlKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50U2V0KEZlYXR1cmVSZXF1aXJlbWVudFNldC5QYWNrYWdlLlZFUlRJQ0VTX09OTFkpCisgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX05VTExfUFJPUEVSVFlfVkFMVUVTKQorICAgICAgICBwdWJsaWMgdm9pZCBzaG91bGRBbGxvd051bGxBZGRWZXJ0ZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFZlcnRleCB2ID0gdGhpcy5ncmFwaC5hZGRWZXJ0ZXgoIm5hbWUiLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwodi52YWx1ZSgibmFtZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnRTZXQoRmVhdHVyZVJlcXVpcmVtZW50U2V0LlBhY2thZ2UuU0lNUExFKQorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLkVkZ2VGZWF0dXJlcy5GRUFUVVJFX05VTExfUFJPUEVSVFlfVkFMVUVTKQorICAgICAgICBwdWJsaWMgdm9pZCBzaG91bGRBbGxvd051bGxBZGRFZGdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IHRoaXMuZ3JhcGguYWRkVmVydGV4KCk7CisgICAgICAgICAgICBmaW5hbCBFZGdlIGUgPSB2LmFkZEVkZ2UoInNlbGYiLCB2LCAibmFtZSIsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChlLnZhbHVlKCJuYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgQEZlYXR1cmVSZXF1aXJlbWVudFNldChGZWF0dXJlUmVxdWlyZW1lbnRTZXQuUGFja2FnZS5WRVJUSUNFU19PTkxZKQorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzLkZFQVRVUkVfTlVMTF9QUk9QRVJUWV9WQUxVRVMpCisgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX01FVEFfUFJPUEVSVElFUykKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdWxkQWxsb3dOdWxsQWRkVmVydGV4UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFZlcnRleCB2ID0gdGhpcy5ncmFwaC5hZGRWZXJ0ZXgoInBlcnNvbiIpOworICAgICAgICAgICAgZmluYWwgVmVydGV4UHJvcGVydHkgdnAgPSB2LnByb3BlcnR5KCJsb2NhdGlvbiIsICJzYW50YSBmZSIsICJzdGFydFRpbWUiLCAxOTk1LCAiZW5kVGltZSIsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDE5OTUsIChpbnQpIHZwLnZhbHVlKCJzdGFydFRpbWUiKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKHZwLnZhbHVlKCJlbmRUaW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgQEZlYXR1cmVSZXF1aXJlbWVudFNldChGZWF0dXJlUmVxdWlyZW1lbnRTZXQuUGFja2FnZS5WRVJUSUNFU19PTkxZKQorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzLkZFQVRVUkVfTlVMTF9QUk9QRVJUWV9WQUxVRVMsIHN1cHBvcnRlZCA9IGZhbHNlKQorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9NRVRBX1BST1BFUlRJRVMpCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdEFsbG93TnVsbEFkZFZlcnRleFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IHRoaXMuZ3JhcGguYWRkVmVydGV4KCJwZXJzb24iKTsKKyAgICAgICAgICAgIGZpbmFsIFZlcnRleFByb3BlcnR5IHZwID0gdi5wcm9wZXJ0eSgibG9jYXRpb24iLCAic2FudGEgZmUiLCAic3RhcnRUaW1lIiwgMTk5NSwgImVuZFRpbWUiLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxOTk1LCAoaW50KSB2cC52YWx1ZSgic3RhcnRUaW1lIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh2cC5wcm9wZXJ0aWVzKCJlbmRUaW1lIikuaGFzTmV4dCgpLCBpcyhmYWxzZSkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTMsNyArMjExLDYgQEAKICAgICAgICAgICAgICJwcm92aWRlZEtleVZhbHVlc011c3RIYXZlQUxlZ2FsS2V5T25FdmVuSW5kaWNlcyIKICAgICB9KQogICAgIEBFeGNlcHRpb25Db3ZlcmFnZShleGNlcHRpb25DbGFzcyA9IFByb3BlcnR5LkV4Y2VwdGlvbnMuY2xhc3MsIG1ldGhvZHMgPSB7Ci0gICAgICAgICAgICAicHJvcGVydHlWYWx1ZUNhbk5vdEJlTnVsbCIsCiAgICAgICAgICAgICAicHJvcGVydHlLZXlDYW5Ob3RCZUVtcHR5IgogICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25PbkFkZEV4Y2VwdGlvbkNvbnNpc3RlbmN5VGVzdCBleHRlbmRzIEFic3RyYWN0R3JlbWxpblRlc3QgewpAQCAtMTY0LDcgKzIyMSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHsicHJvdmlkZWRLZXlWYWx1ZXNNdXN0QmVBTXVsdGlwbGVPZlR3byIsIG5ldyBPYmplY3RbXXsib2RkIiwgIm51bWJlciIsICJhcmd1bWVudHMifSwgRWxlbWVudC5FeGNlcHRpb25zLnByb3ZpZGVkS2V5VmFsdWVzTXVzdEJlQU11bHRpcGxlT2ZUd28oKX0sCiAgICAgICAgICAgICAgICAgICAgIHsicHJvdmlkZWRLZXlWYWx1ZXNNdXN0QmVBTXVsdGlwbGVPZlR3byIsIG5ldyBPYmplY3RbXXsib2RkIn0sIEVsZW1lbnQuRXhjZXB0aW9ucy5wcm92aWRlZEtleVZhbHVlc011c3RCZUFNdWx0aXBsZU9mVHdvKCl9LAogICAgICAgICAgICAgICAgICAgICB7InByb3ZpZGVkS2V5VmFsdWVzTXVzdEhhdmVBTGVnYWxLZXlPbkV2ZW5JbmRpY2VzIiwgbmV3IE9iamVjdFtdeyJvZGQiLCAibnVtYmVyIiwgMTIzLCAidGVzdCJ9LCBFbGVtZW50LkV4Y2VwdGlvbnMucHJvdmlkZWRLZXlWYWx1ZXNNdXN0SGF2ZUFMZWdhbEtleU9uRXZlbkluZGljZXMoKX0sCi0gICAgICAgICAgICAgICAgICAgIHsicHJvcGVydHlWYWx1ZUNhbk5vdEJlTnVsbCIsIG5ldyBPYmplY3RbXXsib2RkIiwgbnVsbH0sIFByb3BlcnR5LkV4Y2VwdGlvbnMucHJvcGVydHlWYWx1ZUNhbk5vdEJlTnVsbCgpfSwKICAgICAgICAgICAgICAgICAgICAgeyJwcm92aWRlZEtleVZhbHVlc011c3RIYXZlQUxlZ2FsS2V5T25FdmVuSW5kaWNlcyIsIG5ldyBPYmplY3RbXXtudWxsLCAidmFsIn0sIEVsZW1lbnQuRXhjZXB0aW9ucy5wcm92aWRlZEtleVZhbHVlc011c3RIYXZlQUxlZ2FsS2V5T25FdmVuSW5kaWNlcygpfSwKICAgICAgICAgICAgICAgICAgICAgeyJwcm9wZXJ0eUtleUNhbk5vdEJlRW1wdHkiLCBuZXcgT2JqZWN0W117IiIsICJ2YWwifSwgUHJvcGVydHkuRXhjZXB0aW9ucy5wcm9wZXJ0eUtleUNhbk5vdEJlRW1wdHkoKX19KTsKICAgICAgICAgfQpAQCAtMjQ1LDEzICszMDEsMTEgQEAKIAogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgcHJvcGVydGllcyBhZGRlZCB0byBhbiB7QGxpbmsgRWxlbWVudH0gYXJlIHZhbGlkYXRlZCBpbiBhCi0gICAgICogY29uc2lzdGVudCB3YXkgd2hlbiB0aGV5IGFyZSBzZXQgYWZ0ZXIge0BsaW5rIFZlcnRleH0gb3Ige0BsaW5rIEVkZ2V9IGNvbnN0cnVjdGlvbiBieSB0aHJvd2luZyBhbgotICAgICAqIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKyAgICAgKiBDaGVja3MgdGhhdCBwcm9wZXJ0aWVzIGFkZGVkIHRvIGFuIHtAbGluayBFbGVtZW50fSBhcmUgdmFsaWRhdGVkIGluIGEgY29uc2lzdGVudCB3YXkgd2hlbiB0aGV5IGFyZSBzZXQgYWZ0ZXIKKyAgICAgKiB7QGxpbmsgVmVydGV4fSBvciB7QGxpbmsgRWRnZX0gY29uc3RydWN0aW9uIGJ5IHRocm93aW5nIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQogICAgIEBFeGNlcHRpb25Db3ZlcmFnZShleGNlcHRpb25DbGFzcyA9IFByb3BlcnR5LkV4Y2VwdGlvbnMuY2xhc3MsIG1ldGhvZHMgPSB7Ci0gICAgICAgICAgICAicHJvcGVydHlWYWx1ZUNhbk5vdEJlTnVsbCIsCiAgICAgICAgICAgICAicHJvcGVydHlLZXlDYW5Ob3RCZU51bGwiLAogICAgICAgICAgICAgInByb3BlcnR5S2V5Q2FuTm90QmVFbXB0eSIsCiAgICAgICAgICAgICAicHJvcGVydHlLZXlDYW5Ob3RCZUFIaWRkZW5LZXkiCkBAIC0yNjEsNyArMzE1LDYgQEAKICAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gImV4cGVjdCh7MH0pIikKICAgICAgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxPYmplY3RbXT4gZGF0YSgpIHsKICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdewotICAgICAgICAgICAgICAgICAgICB7InByb3BlcnR5VmFsdWVDYW5Ob3RCZU51bGwiLCAiayIsIG51bGwsIFByb3BlcnR5LkV4Y2VwdGlvbnMucHJvcGVydHlWYWx1ZUNhbk5vdEJlTnVsbCgpfSwKICAgICAgICAgICAgICAgICAgICAgeyJwcm9wZXJ0eUtleUNhbk5vdEJlTnVsbCIsIG51bGwsICJ2IiwgUHJvcGVydHkuRXhjZXB0aW9ucy5wcm9wZXJ0eUtleUNhbk5vdEJlTnVsbCgpfSwKICAgICAgICAgICAgICAgICAgICAgeyJwcm9wZXJ0eUtleUNhbk5vdEJlRW1wdHkiLCAiIiwgInYiLCBQcm9wZXJ0eS5FeGNlcHRpb25zLnByb3BlcnR5S2V5Q2FuTm90QmVFbXB0eSgpfSwKICAgICAgICAgICAgICAgICAgICAgeyJwcm9wZXJ0eUtleUNhbk5vdEJlQUhpZGRlbktleSIsIEdyYXBoLkhpZGRlbi5oaWRlKCJzeXN0ZW1LZXkiKSwgInZhbHVlIiwgUHJvcGVydHkuRXhjZXB0aW9ucy5wcm9wZXJ0eUtleUNhbk5vdEJlQUhpZGRlbktleShHcmFwaC5IaWRkZW4uaGlkZSgic3lzdGVtS2V5IikpfX0pOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvUmVtb3RlR3JhcGguamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL1JlbW90ZUdyYXBoLmphdmEKaW5kZXggOTU0MTE4Yi4uMDQ5OGRjMCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvUmVtb3RlR3JhcGguamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9SZW1vdGVHcmFwaC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLlByb3BlcnRpZXNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5idWlsZGVyLmZsdWVudC5Db25maWd1cmF0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS5SZW1vdGVDb25uZWN0aW9uOwpAQCAtNzksMTQgKzc5LDYgQEAKICAgICAgICAgbWV0aG9kID0gIioiLAogICAgICAgICByZWFzb24gPSAiUmVtb3RlR3JhcGggZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3QgR3JhcGguY29tcHV0ZSgpIGFjY2VzcyIpCiBAR3JhcGguT3B0T3V0KAotICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5idWxrbG9hZGluZy5CdWxrTG9hZGVyVmVydGV4UHJvZ3JhbVRlc3QiLAotICAgICAgICBtZXRob2QgPSAiKiIsCi0gICAgICAgIHJlYXNvbiA9ICJSZW1vdGVHcmFwaCBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdCBHcmFwaC5jb21wdXRlKCkgYWNjZXNzIikKLUBHcmFwaC5PcHRPdXQoCi0gICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmJ1bGtkdW1waW5nLkJ1bGtEdW1wZXJWZXJ0ZXhQcm9ncmFtVGVzdCIsCi0gICAgICAgIG1ldGhvZCA9ICIqIiwKLSAgICAgICAgcmVhc29uID0gIlJlbW90ZUdyYXBoIGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0IEdyYXBoLmNvbXB1dGUoKSBhY2Nlc3MiKQotQEdyYXBoLk9wdE91dCgKICAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuY2xvbmUuQ2xvbmVWZXJ0ZXhQcm9ncmFtVGVzdCIsCiAgICAgICAgIG1ldGhvZCA9ICIqIiwKICAgICAgICAgcmVhc29uID0gIlJlbW90ZUdyYXBoIGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0IEdyYXBoLmNvbXB1dGUoKSBhY2Nlc3MiKQpAQCAtMTAyLDYgKzk0LDE0IEBACiAgICAgICAgIHRlc3QgPSAib3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxJbnRlcnJ1cHRpb25Db21wdXRlclRlc3QiLAogICAgICAgICBtZXRob2QgPSAiKiIsCiAgICAgICAgIHJlYXNvbiA9ICJUaGUgaW50ZXJydXB0aW9uIG1vZGVsIGluIHRoZSB0ZXN0IGNhbid0IGd1YXJhbnRlZSBpbnRlcnJ1cHRpb24gYXQgdGhlIHJpZ2h0IHRpbWUgd2l0aCBSZW1vdGVHcmFwaC4iKQorQEdyYXBoLk9wdE91dCgKKyAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuQ29tcGxleFRlc3QiLAorICAgICAgICBtZXRob2QgPSAiY2xhc3NpY1JlY29tbWVuZGF0aW9uIiwKKyAgICAgICAgcmVhc29uID0gIlRlc3QgYXNzZXJ0cyB0cmF2ZXJzYWwgc2lkZS1lZmZlY3RzIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHJlbW90ZSB0cmF2ZXJzYWxzLiIpCitAR3JhcGguT3B0T3V0KAorICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0Lkdyb3VwVGVzdCIsCisgICAgICAgIG1ldGhvZCA9ICJnX1ZfZ3JvdXBfYnlYbGFiZWxYX2J5WGJvdGhFX2dyb3VwWGFYX2J5WGxhYmVsWF9ieVh3ZWlnaHRfc3VtWF93ZWlnaHRfc3VtWCIsCisgICAgICAgIHJlYXNvbiA9ICJUZXN0IGFzc2VydHMgdHJhdmVyc2FsIHNpZGUtZWZmZWN0cyB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieSByZW1vdGUgdHJhdmVyc2Fscy4iKQogcHVibGljIGNsYXNzIFJlbW90ZUdyYXBoIGltcGxlbWVudHMgR3JhcGggewogCiAgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVDb25uZWN0aW9uIGNvbm5lY3Rpb247CkBAIC0xMzYsNyArMTM2LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFJlbW90ZUdyYXBoIG9wZW4oZmluYWwgU3RyaW5nIGNvbmZpZ0ZpbGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gb3BlbihuZXcgUHJvcGVydGllc0NvbmZpZ3VyYXRpb24oY29uZmlnRmlsZSkpOworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9ucyBjb25maWdzID0gbmV3IENvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIHJldHVybiBvcGVuKGNvbmZpZ3MucHJvcGVydGllcygoY29uZmlnRmlsZSkpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL1RyYW5zYWN0aW9uVGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvVHJhbnNhY3Rpb25UZXN0LmphdmEKaW5kZXggZDdhNjUxYi4uYmFkNjkyZCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvVHJhbnNhY3Rpb25UZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvVHJhbnNhY3Rpb25UZXN0LmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkV4Y2VwdGlvbkNvdmVyYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uRmVhdHVyZVJlcXVpcmVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uRmVhdHVyZVJlcXVpcmVtZW50U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL1ZlcnRleFByb3BlcnR5VGVzdC5qYXZhIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvVmVydGV4UHJvcGVydHlUZXN0LmphdmEKaW5kZXggMDRiNDMxZC4uYzhiM2M2NiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvVmVydGV4UHJvcGVydHlUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvVmVydGV4UHJvcGVydHlUZXN0LmphdmEKQEAgLTExMSw3ICsxMTEsOCBAQAogICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9NRVRBX1BST1BFUlRJRVMpCiAgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX01VTFRJX1BST1BFUlRJRVMpCiAgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4UHJvcGVydHlGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMuRkVBVFVSRV9JTlRFR0VSX1ZBTFVFUykKLSAgICAgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlTGlzdFZlcnRleFByb3BlcnRpZXMoKSB7CisgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX05VTExfUFJPUEVSVFlfVkFMVUVTLCBzdXBwb3J0ZWQgPSBmYWxzZSkKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdWxkSGFuZGxlTGlzdFZlcnRleFByb3BlcnRpZXNXaXRob3V0TnVsbFByb3BlcnR5VmFsdWVzKCkgewogICAgICAgICAgICAgZmluYWwgVmVydGV4IHYgPSBncmFwaC5hZGRWZXJ0ZXgoIm5hbWUiLCAibWFya28iLCAiYWdlIiwgMzQpOwogICAgICAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBnIC0+IHsKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtvIiwgdi5wcm9wZXJ0eSgibmFtZSIpLnZhbHVlKCkpOwpAQCAtMTY5LDYgKzE3MCw5NSBAQAogCiAgICAgICAgICAgICAgICAgYXNzZXJ0VmVydGV4RWRnZUNvdW50cyhncmFwaCwgMSwgMCk7CiAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gbnVsbCBwcm9wZXJ0eSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgc28gdGhlIHZhbHVlIHNob3VsZCBub3QgYmUgYWRkZWQgYXMgc2V0IG9yIGxpc3QgY2FyZGluYWxpdHksCisgICAgICAgICAgICAvLyBidXQgc2luZ2xlIHdpbGwgcmVtb3ZlIGl0CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVmVydGV4UHJvcGVydHkuZW1wdHkoKSwgdi5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5saXN0LCAibmFtZSIsIG51bGwpKTsKKyAgICAgICAgICAgIHRyeUNvbW1pdChncmFwaCwgZyAtPiB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5wcm9wZXJ0aWVzKCJuYW1lIikpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNCwgSXRlcmF0b3JVdGlscy5jb3VudCh2LnByb3BlcnRpZXMoKSkpOworICAgICAgICAgICAgICAgIGFzc2VydFZlcnRleEVkZ2VDb3VudHMoZ3JhcGgsIDEsIDApOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVmVydGV4UHJvcGVydHkuZW1wdHkoKSwgdi5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5zaW5nbGUsICJuYW1lIiwgbnVsbCkpOworICAgICAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBnIC0+IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgSXRlcmF0b3JVdGlscy5jb3VudCh2LnByb3BlcnRpZXMoIm5hbWUiKSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KHYucHJvcGVydGllcygpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VmVydGV4RWRnZUNvdW50cyhncmFwaCwgMSwgMCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnRTZXQoRmVhdHVyZVJlcXVpcmVtZW50U2V0LlBhY2thZ2UuVkVSVElDRVNfT05MWSkKKyAgICAgICAgQEZlYXR1cmVSZXF1aXJlbWVudChmZWF0dXJlQ2xhc3MgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5jbGFzcywgZmVhdHVyZSA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLkZFQVRVUkVfTUVUQV9QUk9QRVJUSUVTKQorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9NVUxUSV9QUk9QRVJUSUVTKQorICAgICAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleFByb3BlcnR5RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzLkZFQVRVUkVfSU5URUdFUl9WQUxVRVMpCisgICAgICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX05VTExfUFJPUEVSVFlfVkFMVUVTKQorICAgICAgICBwdWJsaWMgdm9pZCBzaG91bGRIYW5kbGVMaXN0VmVydGV4UHJvcGVydGllc1dpdGhOdWxsUHJvcGVydHlWYWx1ZXMoKSB7CisgICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdiA9IGdyYXBoLmFkZFZlcnRleCgibmFtZSIsICJtYXJrbyIsICJhZ2UiLCAzNCk7CisgICAgICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGcgLT4geworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibWFya28iLCB2LnByb3BlcnR5KCJuYW1lIikudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXJrbyIsIHYudmFsdWUoIm5hbWUiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDM0LCB2LnByb3BlcnR5KCJhZ2UiKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzQsIHYuPEludGVnZXI+dmFsdWUoImFnZSIpLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KHYucHJvcGVydGllcygibmFtZSIpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5wcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRWZXJ0ZXhFZGdlQ291bnRzKGdyYXBoLCAxLCAwKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBmaW5hbCBWZXJ0ZXhQcm9wZXJ0eTxTdHJpbmc+IHByb3BlcnR5ID0gdi5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5saXN0LCAibmFtZSIsICJtYXJrbyBhLiByb2RyaWd1ZXoiKTsKKyAgICAgICAgICAgIHRyeUNvbW1pdChncmFwaCwgZyAtPiBhc3NlcnRFcXVhbHModiwgcHJvcGVydHkuZWxlbWVudCgpKSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdi5wcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIHRocm93IGE6ICIgKyBWZXJ0ZXguRXhjZXB0aW9ucy5tdWx0aXBsZVByb3BlcnRpZXNFeGlzdEZvclByb3ZpZGVkS2V5KCJuYW1lIikpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUV4Y2VwdGlvbihWZXJ0ZXguRXhjZXB0aW9ucy5tdWx0aXBsZVByb3BlcnRpZXNFeGlzdEZvclByb3ZpZGVkS2V5KCJuYW1lIiksIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKEl0ZXJhdG9yVXRpbHMubGlzdCh2LnZhbHVlcygibmFtZSIpKS5jb250YWlucygibWFya28iKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKEl0ZXJhdG9yVXRpbHMubGlzdCh2LnZhbHVlcygibmFtZSIpKS5jb250YWlucygibWFya28gYS4gcm9kcmlndWV6IikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5wcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBJdGVyYXRvclV0aWxzLmNvdW50KHYucHJvcGVydGllcygibmFtZSIpKSk7CisgICAgICAgICAgICBhc3NlcnRWZXJ0ZXhFZGdlQ291bnRzKGdyYXBoLCAxLCAwKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHYsIHYucHJvcGVydHkoVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkubGlzdCwgIm5hbWUiLCAibXJvZHJpZ3VleiIpLmVsZW1lbnQoKSk7CisgICAgICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGcgLT4geworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBJdGVyYXRvclV0aWxzLmNvdW50KHYucHJvcGVydGllcygibmFtZSIpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5wcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRWZXJ0ZXhFZGdlQ291bnRzKGdyYXBoLCAxLCAwKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB2LjxTdHJpbmc+cHJvcGVydGllcygibmFtZSIpLmZvckVhY2hSZW1haW5pbmcobWV0YSAtPiB7CisgICAgICAgICAgICAgICAgbWV0YS5wcm9wZXJ0eSgiY291bnRlciIsIG1ldGEudmFsdWUoKS5sZW5ndGgoKSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBnIC0+IHsKKyAgICAgICAgICAgICAgICB2LnByb3BlcnRpZXMoKS5mb3JFYWNoUmVtYWluaW5nKG1ldGEgLT4geworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWV0YS5rZXkoKSwgbWV0YS5sYWJlbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXRhLmlzUHJlc2VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHYsIG1ldGEuZWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEua2V5KCkuZXF1YWxzKCJhZ2UiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGEudmFsdWUoKSwgMzQpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEl0ZXJhdG9yVXRpbHMuY291bnQobWV0YS5wcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWV0YS5rZXkoKS5lcXVhbHMoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoU3RyaW5nKSBtZXRhLnZhbHVlKCkpLmxlbmd0aCgpLCBtZXRhLjxJbnRlZ2VyPnZhbHVlKCJjb3VudGVyIikuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudChtZXRhLnByb3BlcnRpZXMoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldGEua2V5cygpLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1ldGEua2V5cygpLmNvbnRhaW5zKCJjb3VudGVyIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRWZXJ0ZXhFZGdlQ291bnRzKGdyYXBoLCAxLCAwKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBudWxsIHByb3BlcnR5IHZhbHVlcyBhcmUgc3VwcG9ydGVkIHNvIHRoZSB2YWx1ZSBzaG91bGQgYmUgYWRkZWQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2LCB2LnByb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5Lmxpc3QsICJuYW1lIiwgbnVsbCkuZWxlbWVudCgpKTsKKyAgICAgICAgICAgIHRyeUNvbW1pdChncmFwaCwgZyAtPiB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIEl0ZXJhdG9yVXRpbHMuY291bnQodi5wcm9wZXJ0aWVzKCJuYW1lIikpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgSXRlcmF0b3JVdGlscy5jb3VudCh2LnByb3BlcnRpZXMoKSkpOworICAgICAgICAgICAgICAgIGFzc2VydFZlcnRleEVkZ2VDb3VudHMoZ3JhcGgsIDEsIDApOworICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KIAogICAgICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vSW9DdXN0b21UZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Jb0N1c3RvbVRlc3QuamF2YQppbmRleCBmNDA5MWUxLi5jYjVmM2M4IDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Jb0N1c3RvbVRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Jb0N1c3RvbVRlc3QuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkFic3RyYWN0R3JlbWxpblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5GZWF0dXJlUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL0lvR3JhcGhUZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Jb0dyYXBoVGVzdC5qYXZhCmluZGV4IGU4ODI1MDUuLmIzZWYzMzUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL0lvR3JhcGhUZXN0LmphdmEKKysrIGIvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vSW9HcmFwaFRlc3QuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkFic3RyYWN0R3JlbWxpblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5GZWF0dXJlUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vSW9UZXN0LmphdmEgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Jb1Rlc3QuamF2YQppbmRleCBmNGIyM2YyLi44ZmM0NjNkIDEwMDY0NAotLS0gYS9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Jb1Rlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Jb1Rlc3QuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkFic3RyYWN0R3JlbWxpblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5GZWF0dXJlUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9zdGFyL1N0YXJHcmFwaFRlc3QuamF2YSBiL2dyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL3V0aWwvc3Rhci9TdGFyR3JhcGhUZXN0LmphdmEKaW5kZXggNDc2MDRjMy4uN2QwNGQzOCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvdXRpbC9zdGFyL1N0YXJHcmFwaFRlc3QuamF2YQorKysgYi9ncmVtbGluLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS91dGlsL3N0YXIvU3RhckdyYXBoVGVzdC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5zdGFyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkFic3RyYWN0R3JlbWxpblRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5GZWF0dXJlUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoOwpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWJlbmNobWFyay9SRUFETUUuYXNjaWlkb2MgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4tYmVuY2htYXJrL1JFQURNRS5hc2NpaWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY4ZDVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWJlbmNobWFyay9SRUFETUUuYXNjaWlkb2MKQEAgLTAsMCArMSwzMSBAQAorLy8vLworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLy8vCis9PSBBcGFjaGUgVGlua2VyUG9wIEJlbmNobWFya3MKKworVGhpcyBtb2R1bGUgaXMgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIG9ubHkgYW5kIG5vIGNvbnZlbmllbmNlIGJpbmFyaWVzIGFyZSBwcm9kdWNlZCBmb3IgaXQuIFRoZSBjb21waWxhdGlvbgorb2YgdGhpcyBtb2R1bGUgcmVxdWlyZXM6CisKK1tzb3VyY2UseG1sXQorLS0tLQorPGRlcGVuZGVuY3k+CisgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorPC9kZXBlbmRlbmN5PgorLS0tLQorCitUaGUgc291cmNlIGZvciB0aGlzIHByb2plY3QgY2FuIGJlIGZvdW5kIGF0IGxpbms6amF2YWVlL2phdmF4LmFubm90YXRpb246aHR0cHM6Ly9naXRodWIuY29tL2phdmFlZS9qYXZheC5hbm5vdGF0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1iZW5jaG1hcmsvcG9tLnhtbCBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1iZW5jaG1hcmsvcG9tLnhtbAppbmRleCBjY2ExNWRmLi40ZGJjNzQyIDEwMDY0NAotLS0gYS9ncmVtbGluLXRvb2xzL2dyZW1saW4tYmVuY2htYXJrL3BvbS54bWwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWJlbmNobWFyay9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi10b29sczwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KIAogICAgIDxhcnRpZmFjdElkPmdyZW1saW4tYmVuY2htYXJrPC9hcnRpZmFjdElkPgpAQCAtNjAsNiArNjAsMTEgQEAKICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VyZ3JhcGgtZ3JlbWxpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5vcGVuamRrLmptaDwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPmptaC1jb3JlPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHZlcnNpb24+JHtqbWgudmVyc2lvbn08L3ZlcnNpb24+CkBAIC03Myw3ICs3OCw2IEBACiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgIDwvZGVwZW5kZW5jaWVzPgogICAgIDxidWlsZD4KZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1jb3ZlcmFnZS9wb20ueG1sIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWNvdmVyYWdlL3BvbS54bWwKaW5kZXggNmY2M2ExZi4uM2RmOWYyMCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWNvdmVyYWdlL3BvbS54bWwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWNvdmVyYWdlL3BvbS54bWwKQEAgLTYsNyArNiw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi10b29sczwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLWNvdmVyYWdlPC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogR3JlbWxpbiBDb3ZlcmFnZTwvbmFtZT4KZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3BvbS54bWwgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9wb20ueG1sCmluZGV4IDY4OTJmOGYuLmQ3NjA2ZjQgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3BvbS54bWwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3QvcG9tLnhtbApAQCAtNiw3ICs2LDcgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLXRvb2xzPC9hcnRpZmFjdElkPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxhcnRpZmFjdElkPmdyZW1saW4taW8tdGVzdDwvYXJ0aWZhY3RJZD4KICAgICA8bmFtZT5BcGFjaGUgVGlua2VyUG9wIDo6IEdyZW1saW4gSU8gVGVzdDwvbmFtZT4KZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NjcmlwdHMvZ2VuZXJhdGUtZ3JhcGhiaW5hcnktcmVzb3VyY2VzLmdyb292eSBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NjcmlwdHMvZ2VuZXJhdGUtZ3JhcGhiaW5hcnktcmVzb3VyY2VzLmdyb292eQppbmRleCBiZGU1NjYwLi4xMmVjYWRkIDEwMDY0NAotLS0gYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zY3JpcHRzL2dlbmVyYXRlLWdyYXBoYmluYXJ5LXJlc291cmNlcy5ncm9vdnkKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc2NyaXB0cy9nZW5lcmF0ZS1ncmFwaGJpbmFyeS1yZXNvdXJjZXMuZ3Jvb3Z5CkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuKgogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLioKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb24KIAogbmV3IEZpbGUoIiR7cHJvamVjdEJ1aWxkRGlyfS90ZXN0LWNhc2UtZGF0YS9pby9ncmFwaGJpbmFyeSIpLm1rZGlycygpCiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NjcmlwdHMvZ2VuZXJhdGUtZ3JhcGhzb24tcmVzb3VyY2VzLmdyb292eSBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NjcmlwdHMvZ2VuZXJhdGUtZ3JhcGhzb24tcmVzb3VyY2VzLmdyb292eQppbmRleCAwMzExMmVkLi4xZWE2OGUxIDEwMDY0NAotLS0gYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zY3JpcHRzL2dlbmVyYXRlLWdyYXBoc29uLXJlc291cmNlcy5ncm9vdnkKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc2NyaXB0cy9nZW5lcmF0ZS1ncmFwaHNvbi1yZXNvdXJjZXMuZ3Jvb3Z5CkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuKgogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLioKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5Nb2RlbAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uCiAKIG5ldyBGaWxlKCIke3Byb2plY3RCdWlsZERpcn0vZGV2LWRvY3MvIikubWtkaXJzKCkKIG5ldyBGaWxlKCIke3Byb2plY3RCdWlsZERpcn0vdGVzdC1jYXNlLWRhdGEvaW8vZ3JhcGhzb24vIikubWtkaXJzKCkKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NjcmlwdHMvZ2VuZXJhdGUtZ3J5by1yZXNvdXJjZXMuZ3Jvb3Z5IGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc2NyaXB0cy9nZW5lcmF0ZS1ncnlvLXJlc291cmNlcy5ncm9vdnkKaW5kZXggOTdkOTkxMS4uNzMwMWI0NCAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc2NyaXB0cy9nZW5lcmF0ZS1ncnlvLXJlc291cmNlcy5ncm9vdnkKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc2NyaXB0cy9nZW5lcmF0ZS1ncnlvLXJlc291cmNlcy5ncm9vdnkKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS4qCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uZ3J5by4qCiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uKgotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uCiAKIG5ldyBGaWxlKCIke3Byb2plY3RCdWlsZERpcn0vZGV2LWRvY3MvIikubWtkaXJzKCkKIG5ldyBGaWxlKCIke3Byb2plY3RCdWlsZERpcn0vdGVzdC1jYXNlLWRhdGEvaW8vZ3J5byIpLm1rZGlycygpCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL01vZGVsLmphdmEgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL01vZGVsLmphdmEKaW5kZXggYWZmMGYxYS4uODk1OWZhYSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9Nb2RlbC5qYXZhCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vTW9kZWwuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5kcml2ZXIubWVzc2FnZS5SZXF1ZXN0TWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmRyaXZlci5tZXNzYWdlLlJlc3BvbnNlTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkJ5dGVjb2RlOwpAQCAtMTIwLDYgKzEyMCwxMiBAQAogICAgICAgICAgICAgICAgIC5qb2luKENvbXBhdGliaWxpdGllcy53aXRoKEdyYXBoU09OQ29tcGF0aWJpbGl0eS5jbGFzcykuY29uZmlndXJlZEFzKCIuKm5vLXR5cGVzfHYxZDAiKQogICAgICAgICAgICAgICAgIC5qb2luKENvbXBhdGliaWxpdGllcy53aXRoKEdyYXBoU09OQ29tcGF0aWJpbGl0eS5jbGFzcykuYmVmb3JlUmVsZWFzZSgiMy40LjAiKSkpLm1hdGNoVG9BcnJheSgpOwogCisgICAgICAgIC8vIHRoZSBpbnZlcnNlIG9mIHRoaXMgZGVmaW5pdGlvbiBpcyBiYXNpY2FsbHkgMy41LjAgb3IgYmV0dGVyIGZvciBib3RoIEdyYXBoU09OIGFuZCBHcnlvIHdpdGggbm8gc3VwcG9ydCBmb3IKKyAgICAgICAgLy8gdW50eXBlZCBHcmFwaFNPTiBhbnl3aGVyZSBhbG9uZyB0aGUgd2F5CisgICAgICAgIGZpbmFsIENvbXBhdGliaWxpdHlbXSBiZWZvcmUzXzVfMCA9IENvbXBhdGliaWxpdGllcy53aXRoKEdyeW9Db21wYXRpYmlsaXR5LmNsYXNzKS5iZWZvcmVSZWxlYXNlKCIzLjUuMCIpCisgICAgICAgICAgICAgICAgLmpvaW4oQ29tcGF0aWJpbGl0aWVzLndpdGgoR3JhcGhTT05Db21wYXRpYmlsaXR5LmNsYXNzKS5jb25maWd1cmVkQXMoIi4qbm8tdHlwZXN8djFkMCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuam9pbihDb21wYXRpYmlsaXRpZXMud2l0aChHcmFwaFNPTkNvbXBhdGliaWxpdHkuY2xhc3MpLmJlZm9yZVJlbGVhc2UoIjMuNS4wIikpKS5tYXRjaFRvQXJyYXkoKTsKKwogICAgICAgICAvLyB0aGVyZSBpcyBubyBwb2ludCB0byB0ZXN0aW5nIGdyeW8gZm9yIGxpc3QvbWFwL3NldCBhcyB0aGV5IGFyZSBrcnlvIHByaW1pdGl2ZXMgZXNzZW50aWFsbHkKICAgICAgICAgZmluYWwgQ29tcGF0aWJpbGl0eVtdIG5vR3JhcGhTT05CZWZvcmVWM0FuZE5vR3J5byA9IENvbXBhdGliaWxpdGllcy53aXRoKEdyYXBoU09OQ29tcGF0aWJpbGl0eS5jbGFzcykuY29uZmlndXJlZEFzKCIuKnYyZDAtcGFydGlhbHx2MWQwfHYyZDAtbm8tdHlwZXMiKS5qb2luKENvbXBhdGliaWxpdGllcy5HUllPX09OTFkpLm1hdGNoVG9BcnJheSgpOwogCkBAIC0xNjksNyArMTc1LDcgQEAKICAgICAgICAgYWRkR3JhcGhQcm9jZXNzRW50cnkoQ29sdW1uLmtleXMsICJDb2x1bW4iLCAiIiwgQ29tcGF0aWJpbGl0aWVzLlVOVFlQRURfR1JBUEhTT04ubWF0Y2hUb0FycmF5KCkpOwogICAgICAgICBhZGRHcmFwaFByb2Nlc3NFbnRyeShEaXJlY3Rpb24uT1VULCAiRGlyZWN0aW9uIiwgIiIsIENvbXBhdGliaWxpdGllcy5VTlRZUEVEX0dSQVBIU09OLm1hdGNoVG9BcnJheSgpKTsKICAgICAgICAgYWRkR3JhcGhQcm9jZXNzRW50cnkoT3BlcmF0b3Iuc3VtLCAiT3BlcmF0b3IiLCAiIiwgQ29tcGF0aWJpbGl0aWVzLlVOVFlQRURfR1JBUEhTT04ubWF0Y2hUb0FycmF5KCkpOwotICAgICAgICBhZGRHcmFwaFByb2Nlc3NFbnRyeShPcmRlci5zaHVmZmxlLCAiT3JkZXIiLCAiIiwgQ29tcGF0aWJpbGl0aWVzLlVOVFlQRURfR1JBUEhTT04ubWF0Y2hUb0FycmF5KCkpOworICAgICAgICBhZGRHcmFwaFByb2Nlc3NFbnRyeShPcmRlci5zaHVmZmxlLCAiT3JkZXIiLCAiIiwgYmVmb3JlM181XzApOwogICAgICAgICBhZGRHcmFwaFByb2Nlc3NFbnRyeShUcmF2ZXJzYWxPcHRpb25QYXJlbnQuUGljay5hbnksICJQaWNrIiwgIiIsIENvbXBhdGliaWxpdGllcy5VTlRZUEVEX0dSQVBIU09OLm1hdGNoVG9BcnJheSgpKTsKICAgICAgICAgYWRkR3JhcGhQcm9jZXNzRW50cnkoUG9wLmFsbCwgIlBvcCIsICIiLCBDb21wYXRpYmlsaXRpZXMuVU5UWVBFRF9HUkFQSFNPTi5tYXRjaFRvQXJyYXkoKSk7CiAgICAgICAgIGFkZEdyYXBoUHJvY2Vzc0VudHJ5KG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5mdW5jdGlvbi5MYW1iZGEuZnVuY3Rpb24oInsgaXQuZ2V0KCkgfSIpLCAiTGFtYmRhIiwgIiIsIENvbXBhdGliaWxpdGllcy5VTlRZUEVEX0dSQVBIU09OLm1hdGNoVG9BcnJheSgpKTsKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvR3JhcGhCaW5hcnlDb21wYXRpYmlsaXR5LmphdmEgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L0dyYXBoQmluYXJ5Q29tcGF0aWJpbGl0eS5qYXZhCmluZGV4IGZiZTYyYmUuLjg4NTU4NzEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvR3JhcGhCaW5hcnlDb21wYXRpYmlsaXR5LmphdmEKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9HcmFwaEJpbmFyeUNvbXBhdGliaWxpdHkuamF2YQpAQCAtNTAsNyArNTAsOSBAQAogICAgIFYxXzNfNF82KCIzLjQuNiIsICIxLjAiLCAidjEiKSwKICAgICBWMV8zXzRfNygiMy40LjciLCAiMS4wIiwgInYxIiksCiAgICAgVjFfM180XzgoIjMuNC44IiwgIjEuMCIsICJ2MSIpLAotICAgIFYxXzNfNF85KCIzLjQuOSIsICIxLjAiLCAidjEiKTsKKyAgICBWMV8zXzRfOSgiMy40LjkiLCAiMS4wIiwgInYxIiksCisKKyAgICBWMV8zXzVfMCgiMy41LjAiLCAiMS4wIiwgInYxIik7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQID0gRmlsZS5zZXBhcmF0b3I7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05Db21wYXRpYmlsaXR5LmphdmEgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OQ29tcGF0aWJpbGl0eS5qYXZhCmluZGV4IDY2MWI0NGMuLjAzZTQ2OTUgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05Db21wYXRpYmlsaXR5LmphdmEKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9HcmFwaFNPTkNvbXBhdGliaWxpdHkuamF2YQpAQCAtMTM5LDcgKzEzOSwxMiBAQAogICAgIFYxRDBfM180XzkoIjMuNC45IiwgIjEuMCIsICJ2MWQwIiksCiAgICAgVjJEMF9QQVJUSUFMXzNfNF85KCIzLjQuOSIsICIyLjAiLCAidjJkMC1wYXJ0aWFsIiksCiAgICAgVjJEMF9OT19UWVBFXzNfNF85KCIzLjQuOSIsICIyLjAiLCAidjJkMC1uby10eXBlcyIpLAotICAgIFYzRDBfUEFSVElBTF8zXzRfOSgiMy40LjkiLCAiMy4wIiwgInYzZDAiKTsKKyAgICBWM0QwX1BBUlRJQUxfM180XzkoIjMuNC45IiwgIjMuMCIsICJ2M2QwIiksCisKKyAgICBWMUQwXzNfNV8wKCIzLjUuMCIsICIxLjAiLCAidjFkMCIpLAorICAgIFYyRDBfUEFSVElBTF8zXzVfMCgiMy41LjAiLCAiMi4wIiwgInYyZDAtcGFydGlhbCIpLAorICAgIFYyRDBfTk9fVFlQRV8zXzVfMCgiMy41LjAiLCAiMi4wIiwgInYyZDAtbm8tdHlwZXMiKSwKKyAgICBWM0QwX1BBUlRJQUxfM181XzAoIjMuNS4wIiwgIjMuMCIsICJ2M2QwIik7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQID0gRmlsZS5zZXBhcmF0b3I7CiAKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9HcnlvQ29tcGF0aWJpbGl0eS5qYXZhIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9Db21wYXRpYmlsaXR5LmphdmEKaW5kZXggZjQ5ZGY2Zi4uMWY2OWVjYyAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9Db21wYXRpYmlsaXR5LmphdmEKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9Db21wYXRpYmlsaXR5LmphdmEKQEAgLTk1LDcgKzk1LDEwIEBACiAgICAgVjFEMF8zXzRfOCgiMy40LjgiLCAiMS4wIiwgInYxZDAiKSwKICAgICBWM0QwXzNfNF84KCIzLjQuOCIsICIzLjAiLCAidjNkMCIpLAogICAgIFYxRDBfM180XzkoIjMuNC45IiwgIjEuMCIsICJ2MWQwIiksCi0gICAgVjNEMF8zXzRfOSgiMy40LjkiLCAiMy4wIiwgInYzZDAiKTsKKyAgICBWM0QwXzNfNF85KCIzLjQuOSIsICIzLjAiLCAidjNkMCIpLAorCisgICAgVjFEMF8zXzVfMCgiMy41LjAiLCAiMS4wIiwgInYxZDAiKSwKKyAgICBWM0QwXzNfNV8wKCIzLjUuMCIsICIzLjAiLCAidjNkMCIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9IEZpbGUuc2VwYXJhdG9yOwogCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L0dyYXBoQmluYXJ5Q29tcGF0aWJpbGl0eVRlc3QuamF2YSBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvR3JhcGhCaW5hcnlDb21wYXRpYmlsaXR5VGVzdC5qYXZhCmluZGV4IDU4OTk2ZTguLjBlNWQ0N2UgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvR3JhcGhCaW5hcnlDb21wYXRpYmlsaXR5VGVzdC5qYXZhCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvR3JhcGhCaW5hcnlDb21wYXRpYmlsaXR5VGVzdC5qYXZhCkBAIC01MSw3ICs1MSw5IEBACiAgICAgICAgICAgICAgICAge0dyYXBoQmluYXJ5Q29tcGF0aWJpbGl0eS5WMV8zXzRfNiwgcmVhZGVyVjEsIHdyaXRlclYxIH0sCiAgICAgICAgICAgICAgICAge0dyYXBoQmluYXJ5Q29tcGF0aWJpbGl0eS5WMV8zXzRfNywgcmVhZGVyVjEsIHdyaXRlclYxIH0sCiAgICAgICAgICAgICAgICAge0dyYXBoQmluYXJ5Q29tcGF0aWJpbGl0eS5WMV8zXzRfOCwgcmVhZGVyVjEsIHdyaXRlclYxIH0sCi0gICAgICAgICAgICAgICAge0dyYXBoQmluYXJ5Q29tcGF0aWJpbGl0eS5WMV8zXzRfOSwgcmVhZGVyVjEsIHdyaXRlclYxIH0KKyAgICAgICAgICAgICAgICB7R3JhcGhCaW5hcnlDb21wYXRpYmlsaXR5LlYxXzNfNF85LCByZWFkZXJWMSwgd3JpdGVyVjEgfSwKKworICAgICAgICAgICAgICAgIHtHcmFwaEJpbmFyeUNvbXBhdGliaWxpdHkuVjFfM181XzAsIHJlYWRlclYxLCB3cml0ZXJWMSB9CiAgICAgICAgIH0pOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9HcmFwaFNPTlR5cGVkQ29tcGF0aWJpbGl0eVRlc3QuamF2YSBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05UeXBlZENvbXBhdGliaWxpdHlUZXN0LmphdmEKaW5kZXggNmNhZjc4OC4uOTEzYjVmZiAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9HcmFwaFNPTlR5cGVkQ29tcGF0aWJpbGl0eVRlc3QuamF2YQorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OVHlwZWRDb21wYXRpYmlsaXR5VGVzdC5qYXZhCkBAIC0xMDEsNyArMTAxLDEwIEBACiAgICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WMkQwX1BBUlRJQUxfM180XzgsIG1hcHBlclYyIH0sCiAgICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WM0QwX1BBUlRJQUxfM180XzgsIG1hcHBlclYzIH0sCiAgICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WMkQwX1BBUlRJQUxfM180XzksIG1hcHBlclYyIH0sCi0gICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WM0QwX1BBUlRJQUxfM180XzksIG1hcHBlclYzIH0KKyAgICAgICAgICAgICAgICB7R3JhcGhTT05Db21wYXRpYmlsaXR5LlYzRDBfUEFSVElBTF8zXzRfOSwgbWFwcGVyVjMgfSwKKworICAgICAgICAgICAgICAgIHtHcmFwaFNPTkNvbXBhdGliaWxpdHkuVjJEMF9QQVJUSUFMXzNfNV8wLCBtYXBwZXJWMiB9LAorICAgICAgICAgICAgICAgIHtHcmFwaFNPTkNvbXBhdGliaWxpdHkuVjNEMF9QQVJUSUFMXzNfNV8wLCBtYXBwZXJWMyB9CiAgICAgICAgIH0pOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9HcmFwaFNPTlVudHlwZWRDb21wYXRpYmlsaXR5VGVzdC5qYXZhIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9HcmFwaFNPTlVudHlwZWRDb21wYXRpYmlsaXR5VGVzdC5qYXZhCmluZGV4IDdlOTAxNDAuLjYzNTY1MjEgMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vR3JhcGhTT05VbnR5cGVkQ29tcGF0aWJpbGl0eVRlc3QuamF2YQorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL0dyYXBoU09OVW50eXBlZENvbXBhdGliaWxpdHlUZXN0LmphdmEKQEAgLTEwOSw3ICsxMDksMTAgQEAKICAgICAgICAgICAgICAgICB7R3JhcGhTT05Db21wYXRpYmlsaXR5LlYxRDBfM180XzgsIG1hcHBlclYxIH0sCiAgICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WMkQwX05PX1RZUEVfM180XzgsIG1hcHBlclYyIH0sCiAgICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WMUQwXzNfNF85LCBtYXBwZXJWMSB9LAotICAgICAgICAgICAgICAgIHtHcmFwaFNPTkNvbXBhdGliaWxpdHkuVjJEMF9OT19UWVBFXzNfNF85LCBtYXBwZXJWMiB9CisgICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WMkQwX05PX1RZUEVfM180XzksIG1hcHBlclYyIH0sCisKKyAgICAgICAgICAgICAgICB7R3JhcGhTT05Db21wYXRpYmlsaXR5LlYxRDBfM181XzAsIG1hcHBlclYxIH0sCisgICAgICAgICAgICAgICAge0dyYXBoU09OQ29tcGF0aWJpbGl0eS5WMkQwX05PX1RZUEVfM181XzAsIG1hcHBlclYyIH0KICAgICAgICAgfSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vR3J5b0NvbXBhdGliaWxpdHlUZXN0LmphdmEgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vR3J5b0NvbXBhdGliaWxpdHlUZXN0LmphdmEKaW5kZXggNDhkMGZkYy4uYTk1M2I5ZSAxMDA2NDQKLS0tIGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9Db21wYXRpYmlsaXR5VGVzdC5qYXZhCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9HcnlvQ29tcGF0aWJpbGl0eVRlc3QuamF2YQpAQCAtOTgsNyArOTgsMTAgQEAKICAgICAgICAgICAgICAgICB7R3J5b0NvbXBhdGliaWxpdHkuVjFEMF8zXzRfOCwgbWFwcGVyVjEgfSwKICAgICAgICAgICAgICAgICB7R3J5b0NvbXBhdGliaWxpdHkuVjNEMF8zXzRfOCwgbWFwcGVyVjMgfSwKICAgICAgICAgICAgICAgICB7R3J5b0NvbXBhdGliaWxpdHkuVjFEMF8zXzRfOSwgbWFwcGVyVjEgfSwKLSAgICAgICAgICAgICAgICB7R3J5b0NvbXBhdGliaWxpdHkuVjNEMF8zXzRfOSwgbWFwcGVyVjMgfQorICAgICAgICAgICAgICAgIHtHcnlvQ29tcGF0aWJpbGl0eS5WM0QwXzNfNF85LCBtYXBwZXJWMyB9LAorCisgICAgICAgICAgICAgICAge0dyeW9Db21wYXRpYmlsaXR5LlYxRDBfM181XzAsIG1hcHBlclYxIH0sCisgICAgICAgICAgICAgICAge0dyeW9Db21wYXRpYmlsaXR5LlYzRDBfM181XzAsIG1hcHBlclYzIH0KICAgICAgICAgfSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JhcnJpZXItdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYmFycmllci12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JhcnJpZXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JpZ2RlY2ltYWwtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYmlnZGVjaW1hbC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWQ5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JpZ2RlY2ltYWwtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JpZ2ludGVnZXItdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYmlnaW50ZWdlci12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDFmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JpZ2ludGVnZXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JpbmRpbmctdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYmluZGluZy12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjIwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2JpbmRpbmctdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J1bGtzZXQtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYnVsa3NldC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDI5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J1bGtzZXQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J5dGUtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYnl0ZS12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTU0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J5dGUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J5dGVidWZmZXItdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYnl0ZWJ1ZmZlci12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzkzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J5dGVidWZmZXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J5dGVjb2RlLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2J5dGVjb2RlLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3NmMyZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvYnl0ZWNvZGUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2NhcmRpbmFsaXR5LXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2NhcmRpbmFsaXR5LXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4NzVhNQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvY2FyZGluYWxpdHktdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2NoYXItdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvY2hhci12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDk3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2NoYXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2NsYXNzLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2NsYXNzLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlMjcyZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvY2xhc3MtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2NvbHVtbi12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9jb2x1bW4tdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjgwNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9jb2x1bW4tdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2RhdGUtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvZGF0ZS12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OGUxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2RhdGUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2RpcmVjdGlvbi12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9kaXJlY3Rpb24tdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FhYmEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9kaXJlY3Rpb24tdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2RvdWJsZS12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9kb3VibGUtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM4YTYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9kb3VibGUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2R1cmF0aW9uLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2R1cmF0aW9uLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmYTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvZHVyYXRpb24tdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2VkZ2UtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvZWRnZS12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmU4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2VkZ2UtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2Zsb2F0LXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2Zsb2F0LXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyNzcyYwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvZmxvYXQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2luZXRhZGRyZXNzLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2luZXRhZGRyZXNzLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxM2RkYgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvaW5ldGFkZHJlc3MtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2luc3RhbnQtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvaW5zdGFudC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzU1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2luc3RhbnQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2ludGVnZXItdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvaW50ZWdlci12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzI0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2ludGVnZXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xhbWJkYS12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9sYW1iZGEtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU5OGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9sYW1iZGEtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xpc3QtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvbGlzdC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTQwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xpc3QtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xvY2FsZGF0ZS12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9sb2NhbGRhdGUtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzllMjExCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9sb2NhbGRhdGUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvbG9jYWxkYXRldGltZS12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGM4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xvY2FsdGltZS12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9sb2NhbHRpbWUtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTc4NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9sb2NhbHRpbWUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xvbmctdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvbG9uZy12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTAwODMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL2xvbmctdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL21hcC12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9tYXAtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNkOWUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9tYXAtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL21ldHJpY3MtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvbWV0cmljcy12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTc3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL21ldHJpY3MtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL21vbnRoZGF5LXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL21vbnRoZGF5LXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyODI2MwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvbW9udGhkYXktdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29mZnNldGRhdGV0aW1lLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29mZnNldGRhdGV0aW1lLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyYWFiYgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvb2Zmc2V0ZGF0ZXRpbWUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29mZnNldHRpbWUtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvb2Zmc2V0dGltZS12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzhjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29mZnNldHRpbWUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29wZXJhdG9yLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29wZXJhdG9yLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3MTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvb3BlcmF0b3ItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29yZGVyLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL29yZGVyLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExYjZhZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvb3JkZXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3AtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvcC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjA3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3AtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BhbmQtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvcGFuZC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzdjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BhbmQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BhdGgtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvcGF0aC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDc1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BhdGgtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BlcmlvZC12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9wZXJpb2QtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RhYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9wZXJpb2QtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BpY2stdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvcGljay12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWNhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BpY2stdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3BvcC12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9wb3AtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjk4Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9wb3AtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3Bvci12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9wb3ItdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBiM2FiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9wb3ItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3Byb3BlcnR5LXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3Byb3BlcnR5LXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjMzRlNQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvcHJvcGVydHktdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3B3aXRoaW4tdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvcHdpdGhpbi12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDMwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3B3aXRoaW4tdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3B3aXRob3V0LXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3B3aXRob3V0LXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxOTVkYgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvcHdpdGhvdXQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3Njb3BlLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3Njb3BlLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0Yjk1NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvc2NvcGUtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3NldC12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9zZXQtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRmMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC9zZXQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3Nob3J0LXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3Nob3J0LXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkMmQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvc2hvcnQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3QtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvdC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Mzc2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3QtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RleHRwLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RleHRwLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5NjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvdGV4dHAtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RpbWVzdGFtcC12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC90aW1lc3RhbXAtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM0ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC90aW1lc3RhbXAtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RpbmtlcmdyYXBoLXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RpbmtlcmdyYXBoLXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhNzZkMQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvdGlua2VyZ3JhcGgtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvdHJhdmVyc2FsbWV0cmljcy12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDdlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3RyYXZlcnNlci12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC90cmF2ZXJzZXItdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ3Y2MwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC90cmF2ZXJzZXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3V1aWQtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvdXVpZC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTc3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3V1aWQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3ZlcnRleC12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC92ZXJ0ZXgtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmI5ZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC92ZXJ0ZXgtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3ZlcnRleHByb3BlcnR5LXYxLmdiaW4gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3ZlcnRleHByb3BlcnR5LXYxLmdiaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmMDMyOQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvdmVydGV4cHJvcGVydHktdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3llYXItdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAveWVhci12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTBjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3llYXItdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3llYXJtb250aC12MS5nYmluIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC95ZWFybW9udGgtdjEuZ2JpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFhMTIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoYmluYXJ5L18zXzVfMC95ZWFybW9udGgtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3pvbmVvZmZzZXQtdjEuZ2JpbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaGJpbmFyeS9fM181XzAvem9uZW9mZnNldC12MS5nYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjdjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhiaW5hcnkvXzNfNV8wL3pvbmVvZmZzZXQtdjEuZ2JpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2F1dGhlbnRpY2F0aW9uY2hhbGxlbmdlLXYxZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25jaGFsbGVuZ2UtdjFkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNWI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2F1dGhlbnRpY2F0aW9uY2hhbGxlbmdlLXYxZDAuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisgICJyZXF1ZXN0SWQiIDogIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiIsCisgICJzdGF0dXMiIDogeworICAgICJtZXNzYWdlIiA6ICIiLAorICAgICJjb2RlIiA6IDQwNywKKyAgICAiYXR0cmlidXRlcyIgOiB7IH0KKyAgfSwKKyAgInJlc3VsdCIgOiB7CisgICAgImRhdGEiIDogbnVsbCwKKyAgICAibWV0YSIgOiB7IH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25jaGFsbGVuZ2UtdjJkMC1uby10eXBlcy5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbmNoYWxsZW5nZS12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1YjgyYwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25jaGFsbGVuZ2UtdjJkMC1uby10eXBlcy5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2IiwKKyAgInN0YXR1cyIgOiB7CisgICAgIm1lc3NhZ2UiIDogIiIsCisgICAgImNvZGUiIDogNDA3LAorICAgICJhdHRyaWJ1dGVzIiA6IHsgfQorICB9LAorICAicmVzdWx0IiA6IHsKKyAgICAiZGF0YSIgOiBudWxsLAorICAgICJtZXRhIiA6IHsgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbmNoYWxsZW5nZS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25jaGFsbGVuZ2UtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1YjgyYwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25jaGFsbGVuZ2UtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwxMiBAQAoreworICAicmVxdWVzdElkIiA6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiLAorICAic3RhdHVzIiA6IHsKKyAgICAibWVzc2FnZSIgOiAiIiwKKyAgICAiY29kZSIgOiA0MDcsCisgICAgImF0dHJpYnV0ZXMiIDogeyB9CisgIH0sCisgICJyZXN1bHQiIDogeworICAgICJkYXRhIiA6IG51bGwsCisgICAgIm1ldGEiIDogeyB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2F1dGhlbnRpY2F0aW9uY2hhbGxlbmdlLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25jaGFsbGVuZ2UtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzM0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2F1dGhlbnRpY2F0aW9uY2hhbGxlbmdlLXYzZDAuanNvbgpAQCAtMCwwICsxLDE4IEBACit7CisgICJyZXF1ZXN0SWQiIDogIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiIsCisgICJzdGF0dXMiIDogeworICAgICJtZXNzYWdlIiA6ICIiLAorICAgICJjb2RlIiA6IDQwNywKKyAgICAiYXR0cmlidXRlcyIgOiB7CisgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICJAdmFsdWUiIDogWyBdCisgICAgfQorICB9LAorICAicmVzdWx0IiA6IHsKKyAgICAiZGF0YSIgOiBudWxsLAorICAgICJtZXRhIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpNYXAiLAorICAgICAgIkB2YWx1ZSIgOiBbIF0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2F1dGhlbnRpY2F0aW9ucmVzcG9uc2UtdjFkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbnJlc3BvbnNlLXYxZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhlMWZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbnJlc3BvbnNlLXYxZDAuanNvbgpAQCAtMCwwICsxLDkgQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJhdXRoZW50aWNhdGlvbiIsCisgICJwcm9jZXNzb3IiIDogIiIsCisgICJhcmdzIiA6IHsKKyAgICAic2FzbE1lY2hhbmlzbSIgOiAiUExBSU4iLAorICAgICJzYXNsIiA6ICJBSE4wWlhCb2NHaGxiZ0J3WVhOemQyOXlaQT09IgorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbnJlc3BvbnNlLXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25yZXNwb25zZS12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4ZTFmZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25yZXNwb25zZS12MmQwLW5vLXR5cGVzLmpzb24KQEAgLTAsMCArMSw5IEBACit7CisgICJyZXF1ZXN0SWQiIDogImNiNjgyNTc4LTlkOTItNDQ5OS05ZWJjLTVjNmFhNzNjNTM5NyIsCisgICJvcCIgOiAiYXV0aGVudGljYXRpb24iLAorICAicHJvY2Vzc29yIiA6ICIiLAorICAiYXJncyIgOiB7CisgICAgInNhc2xNZWNoYW5pc20iIDogIlBMQUlOIiwKKyAgICAic2FzbCIgOiAiQUhOMFpYQm9jR2hsYmdCd1lYTnpkMjl5WkE9PSIKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25yZXNwb25zZS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYXV0aGVudGljYXRpb25yZXNwb25zZS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhlMWZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbnJlc3BvbnNlLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsOSBAQAoreworICAicmVxdWVzdElkIiA6ICJjYjY4MjU3OC05ZDkyLTQ0OTktOWViYy01YzZhYTczYzUzOTciLAorICAib3AiIDogImF1dGhlbnRpY2F0aW9uIiwKKyAgInByb2Nlc3NvciIgOiAiIiwKKyAgImFyZ3MiIDogeworICAgICJzYXNsTWVjaGFuaXNtIiA6ICJQTEFJTiIsCisgICAgInNhc2wiIDogIkFITjBaWEJvY0dobGJnQndZWE56ZDI5eVpBPT0iCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2F1dGhlbnRpY2F0aW9ucmVzcG9uc2UtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbnJlc3BvbnNlLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNlY2EyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9hdXRoZW50aWNhdGlvbnJlc3BvbnNlLXYzZDAuanNvbgpAQCAtMCwwICsxLDkgQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJhdXRoZW50aWNhdGlvbiIsCisgICJwcm9jZXNzb3IiIDogIiIsCisgICJhcmdzIiA6IHsKKyAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAiQHZhbHVlIiA6IFsgInNhc2xNZWNoYW5pc20iLCAiUExBSU4iLCAic2FzbCIsICJBSE4wWlhCb2NHaGxiZ0J3WVhOemQyOXlaQT09IiBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JhcnJpZXItdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JhcnJpZXItdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkY2NkZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYmFycmllci12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkJhcnJpZXIiLAorICAiQHZhbHVlIiA6ICJub3JtU2FjayIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JhcnJpZXItdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iYXJyaWVyLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRjY2RkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iYXJyaWVyLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkJhcnJpZXIiLAorICAiQHZhbHVlIiA6ICJub3JtU2FjayIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpZ2RlY2ltYWwtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpZ2RlY2ltYWwtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1MzM3YwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYmlnZGVjaW1hbC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpCaWdEZWNpbWFsIiwKKyAgIkB2YWx1ZSIgOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpZ2RlY2ltYWwtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iaWdkZWNpbWFsLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzUzMzdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iaWdkZWNpbWFsLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpCaWdEZWNpbWFsIiwKKyAgIkB2YWx1ZSIgOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpZ2ludGVnZXItdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpZ2ludGVnZXItdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlNjExNAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYmlnaW50ZWdlci12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpCaWdJbnRlZ2VyIiwKKyAgIkB2YWx1ZSIgOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpZ2ludGVnZXItdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iaWdpbnRlZ2VyLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU2MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iaWdpbnRlZ2VyLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpCaWdJbnRlZ2VyIiwKKyAgIkB2YWx1ZSIgOiAxMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODk5ODc2NTQzMjEKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpbmRpbmctdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpbmRpbmctdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5YjhjNwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYmluZGluZy12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDEwIEBACit7CisgICJAdHlwZSIgOiAiZzpCaW5kaW5nIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgImtleSIgOiAieCIsCisgICAgInZhbHVlIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDEKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2JpbmRpbmctdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iaW5kaW5nLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzliOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9iaW5kaW5nLXYzZDAuanNvbgpAQCAtMCwwICsxLDEwIEBACit7CisgICJAdHlwZSIgOiAiZzpCaW5kaW5nIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgImtleSIgOiAieCIsCisgICAgInZhbHVlIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDEKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2J1bGtzZXQtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2J1bGtzZXQtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0NDk3NQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnVsa3NldC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxIEBACitbICJtYXJrbyIsICJqb3NoIiwgImpvc2giIF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2J1bGtzZXQtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9idWxrc2V0LXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE2YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9idWxrc2V0LXYzZDAuanNvbgpAQCAtMCwwICsxLDEwIEBACit7CisgICJAdHlwZSIgOiAiZzpCdWxrU2V0IiwKKyAgIkB2YWx1ZSIgOiBbICJtYXJrbyIsIHsKKyAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICJAdmFsdWUiIDogMQorICB9LCAiam9zaCIsIHsKKyAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICJAdmFsdWUiIDogMgorICB9IF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2J5dGUtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2J5dGUtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5NjI1YgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnl0ZS12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpCeXRlIiwKKyAgIkB2YWx1ZSIgOiAxCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9ieXRlLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnl0ZS12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5NjI1YgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnl0ZS12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6Qnl0ZSIsCisgICJAdmFsdWUiIDogMQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnl0ZWJ1ZmZlci12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnl0ZWJ1ZmZlci12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI0MTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9ieXRlYnVmZmVyLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkJ5dGVCdWZmZXIiLAorICAiQHZhbHVlIiA6ICJjMjl0WlNCaWVYUmxjeUJtYjNJZ2VXOTEiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9ieXRlYnVmZmVyLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnl0ZWJ1ZmZlci12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyNDExNQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvYnl0ZWJ1ZmZlci12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6Qnl0ZUJ1ZmZlciIsCisgICJAdmFsdWUiIDogImMyOXRaU0JpZVhSbGN5Qm1iM0lnZVc5MSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2J5dGVjb2RlLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9ieXRlY29kZS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjlkMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9ieXRlY29kZS12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDYgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkJ5dGVjb2RlIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgInN0ZXAiIDogWyBbICJWIiBdLCBbICJoYXNMYWJlbCIsICJwZXJzb24iIF0sIFsgIm91dCIgXSwgWyAiaW4iIF0sIFsgInRyZWUiIF0gXQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9ieXRlY29kZS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2J5dGVjb2RlLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjlkMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9ieXRlY29kZS12M2QwLmpzb24KQEAgLTAsMCArMSw2IEBACit7CisgICJAdHlwZSIgOiAiZzpCeXRlY29kZSIsCisgICJAdmFsdWUiIDogeworICAgICJzdGVwIiA6IFsgWyAiViIgXSwgWyAiaGFzTGFiZWwiLCAicGVyc29uIiBdLCBbICJvdXQiIF0sIFsgImluIiBdLCBbICJ0cmVlIiBdIF0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY2FyZGluYWxpdHktdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NhcmRpbmFsaXR5LXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGU2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NhcmRpbmFsaXR5LXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6Q2FyZGluYWxpdHkiLAorICAiQHZhbHVlIiA6ICJsaXN0IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY2FyZGluYWxpdHktdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9jYXJkaW5hbGl0eS12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0ZTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY2FyZGluYWxpdHktdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6Q2FyZGluYWxpdHkiLAorICAiQHZhbHVlIiA6ICJsaXN0IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY2hhci12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY2hhci12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI3ZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9jaGFyLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkNoYXIiLAorICAiQHZhbHVlIiA6ICJ4IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY2hhci12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NoYXItdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjdlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NoYXItdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkNoYXIiLAorICAiQHZhbHVlIiA6ICJ4IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY2xhc3MtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NsYXNzLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjE1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NsYXNzLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6Q2xhc3MiLAorICAiQHZhbHVlIiA6ICJqYXZhLmlvLkZpbGUiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9jbGFzcy12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NsYXNzLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYxNWEyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9jbGFzcy12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpDbGFzcyIsCisgICJAdmFsdWUiIDogImphdmEuaW8uRmlsZSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NvbHVtbi12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvY29sdW1uLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiM2E1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NvbHVtbi12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkNvbHVtbiIsCisgICJAdmFsdWUiIDogImtleXMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9jb2x1bW4tdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9jb2x1bW4tdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiM2E1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2NvbHVtbi12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpDb2x1bW4iLAorICAiQHZhbHVlIiA6ICJrZXlzIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZGF0ZS12MmQwLW5vLXR5cGVzLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RhdGUtdjJkMC1uby10eXBlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjcxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RhdGUtdjJkMC1uby10eXBlcy5qc29uCkBAIC0wLDAgKzEgQEAKKzE0ODE3NTAwNzYyOTUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RhdGUtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RhdGUtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0MDA3YQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZGF0ZS12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkRhdGUiLAorICAiQHZhbHVlIiA6IDE0ODE3NTAwNzYyOTUKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RhdGUtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9kYXRlLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQwMDdhCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9kYXRlLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkRhdGUiLAorICAiQHZhbHVlIiA6IDE0ODE3NTAwNzYyOTUKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RpcmVjdGlvbi12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZGlyZWN0aW9uLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Y2I3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RpcmVjdGlvbi12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkRpcmVjdGlvbiIsCisgICJAdmFsdWUiIDogIk9VVCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RpcmVjdGlvbi12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RpcmVjdGlvbi12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjYjdlNAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZGlyZWN0aW9uLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOkRpcmVjdGlvbiIsCisgICJAdmFsdWUiIDogIk9VVCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RvdWJsZS12MmQwLW5vLXR5cGVzLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2RvdWJsZS12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3MmU2MgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZG91YmxlLXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxIEBACisxMDAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZG91YmxlLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9kb3VibGUtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlNDk2NAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZG91YmxlLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgIkB2YWx1ZSIgOiAxMDAuMAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZG91YmxlLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZG91YmxlLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWU0OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9kb3VibGUtdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgIkB2YWx1ZSIgOiAxMDAuMAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZHVyYXRpb24tdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2R1cmF0aW9uLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzBjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2R1cmF0aW9uLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkR1cmF0aW9uIiwKKyAgIkB2YWx1ZSIgOiAiUFQxMjBIIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZHVyYXRpb24tdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9kdXJhdGlvbi12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjMGNlOQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZHVyYXRpb24tdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkR1cmF0aW9uIiwKKyAgIkB2YWx1ZSIgOiAiUFQxMjBIIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZWRnZS12MWQwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2VkZ2UtdjFkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2YxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2VkZ2UtdjFkMC5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgImlkIiA6IDEzLAorICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgInR5cGUiIDogImVkZ2UiLAorICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgImluViIgOiAxMCwKKyAgIm91dFYiIDogMSwKKyAgInByb3BlcnRpZXMiIDogeworICAgICJzaW5jZSIgOiAyMDA5CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2VkZ2UtdjJkMC1uby10eXBlcy5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9lZGdlLXYyZDAtbm8tdHlwZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU3M2RiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9lZGdlLXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDE0IEBACit7CisgICJpZCIgOiAxMywKKyAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAiaW5WIiA6IDEwLAorICAib3V0ViIgOiAxLAorICAicHJvcGVydGllcyIgOiB7CisgICAgInNpbmNlIiA6IHsKKyAgICAgICJrZXkiIDogInNpbmNlIiwKKyAgICAgICJ2YWx1ZSIgOiAyMDA5CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9lZGdlLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9lZGdlLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWM1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2VkZ2UtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwzMiBAQAoreworICAiQHR5cGUiIDogImc6RWRnZSIsCisgICJAdmFsdWUiIDogeworICAgICJpZCIgOiB7CisgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgIkB2YWx1ZSIgOiAxMworICAgIH0sCisgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDEwCisgICAgfSwKKyAgICAib3V0ViIgOiB7CisgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgIkB2YWx1ZSIgOiAxCisgICAgfSwKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAic2luY2UiIDogeworICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDkKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2VkZ2UtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9lZGdlLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTFjNTJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9lZGdlLXYzZDAuanNvbgpAQCAtMCwwICsxLDMyIEBACit7CisgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgImlkIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDEzCisgICAgfSwKKyAgICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICJpblYiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICJAdmFsdWUiIDogMTAKKyAgICB9LAorICAgICJvdXRWIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDEKKyAgICB9LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJzaW5jZSIgOiB7CisgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICJrZXkiIDogInNpbmNlIiwKKyAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMjAwOQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvZmxvYXQtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2Zsb2F0LXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzlhYWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2Zsb2F0LXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6RmxvYXQiLAorICAiQHZhbHVlIiA6IDEwMC4wCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9mbG9hdC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2Zsb2F0LXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc5YWFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9mbG9hdC12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpGbG9hdCIsCisgICJAdmFsdWUiIDogMTAwLjAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2luZXRhZGRyZXNzLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9pbmV0YWRkcmVzcy12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE5OGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9pbmV0YWRkcmVzcy12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpJbmV0QWRkcmVzcyIsCisgICJAdmFsdWUiIDogImxvY2FsaG9zdCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2luZXRhZGRyZXNzLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvaW5ldGFkZHJlc3MtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTk4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2luZXRhZGRyZXNzLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpJbmV0QWRkcmVzcyIsCisgICJAdmFsdWUiIDogImxvY2FsaG9zdCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2luc3RhbnQtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2luc3RhbnQtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0OTc0MQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvaW5zdGFudC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpJbnN0YW50IiwKKyAgIkB2YWx1ZSIgOiAiMjAxNi0xMi0xNFQxNjozOToxOS4zNDlaIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvaW5zdGFudC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2luc3RhbnQtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDk3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2luc3RhbnQtdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4Okluc3RhbnQiLAorICAiQHZhbHVlIiA6ICIyMDE2LTEyLTE0VDE2OjM5OjE5LjM0OVoiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9pbnRlZ2VyLXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvaW50ZWdlci12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1ZDdkOQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvaW50ZWdlci12MmQwLW5vLXR5cGVzLmpzb24KQEAgLTAsMCArMSBAQAorMTAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9pbnRlZ2VyLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9pbnRlZ2VyLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGNlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2ludGVnZXItdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICJAdmFsdWUiIDogMTAwCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9pbnRlZ2VyLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvaW50ZWdlci12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwY2U3YQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvaW50ZWdlci12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICJAdmFsdWUiIDogMTAwCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sYW1iZGEtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xhbWJkYS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmUxNzliCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sYW1iZGEtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJAdHlwZSIgOiAiZzpMYW1iZGEiLAorICAiQHZhbHVlIiA6IHsKKyAgICAic2NyaXB0IiA6ICJ7IGl0LmdldCgpIH0iLAorICAgICJsYW5ndWFnZSIgOiAiZ3JlbWxpbi1ncm9vdnkiLAorICAgICJhcmd1bWVudHMiIDogMQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sYW1iZGEtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sYW1iZGEtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTE3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xhbWJkYS12M2QwLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJAdHlwZSIgOiAiZzpMYW1iZGEiLAorICAiQHZhbHVlIiA6IHsKKyAgICAic2NyaXB0IiA6ICJ7IGl0LmdldCgpIH0iLAorICAgICJsYW5ndWFnZSIgOiAiZ3JlbWxpbi1ncm9vdnkiLAorICAgICJhcmd1bWVudHMiIDogMQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9saXN0LXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbGlzdC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxNGUyZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbGlzdC12M2QwLmpzb24KQEAgLTAsMCArMSw3IEBACit7CisgICJAdHlwZSIgOiAiZzpMaXN0IiwKKyAgIkB2YWx1ZSIgOiBbIHsKKyAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICJAdmFsdWUiIDogMQorICB9LCAicGVyc29uIiwgdHJ1ZSBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sb2NhbGRhdGUtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xvY2FsZGF0ZS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmZiODFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sb2NhbGRhdGUtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6TG9jYWxEYXRlIiwKKyAgIkB2YWx1ZSIgOiAiMjAxNi0wMS0wMSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xvY2FsZGF0ZS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xvY2FsZGF0ZS12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmYjgxZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWxkYXRlLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpMb2NhbERhdGUiLAorICAiQHZhbHVlIiA6ICIyMDE2LTAxLTAxIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWxkYXRldGltZS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWxkYXRldGltZS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDgzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sb2NhbGRhdGV0aW1lLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkxvY2FsRGF0ZVRpbWUiLAorICAiQHZhbHVlIiA6ICIyMDE2LTAxLTAxVDEyOjMwIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWxkYXRldGltZS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkODM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkxvY2FsRGF0ZVRpbWUiLAorICAiQHZhbHVlIiA6ICIyMDE2LTAxLTAxVDEyOjMwIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWx0aW1lLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sb2NhbHRpbWUtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmNjVhNwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWx0aW1lLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkxvY2FsVGltZSIsCisgICJAdmFsdWUiIDogIjEyOjMwOjQ1IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWx0aW1lLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9jYWx0aW1lLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmY2NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sb2NhbHRpbWUtdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkxvY2FsVGltZSIsCisgICJAdmFsdWUiIDogIjEyOjMwOjQ1IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9uZy12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9uZy12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI5YTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9sb25nLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6SW50NjQiLAorICAiQHZhbHVlIiA6IDEwMAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbG9uZy12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xvbmctdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjlhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL2xvbmctdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6SW50NjQiLAorICAiQHZhbHVlIiA6IDEwMAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbWFwLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbWFwLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ1OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9tYXAtdjNkMC5qc29uCkBAIC0wLDAgKzEsMjUgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICJAdmFsdWUiIDogWyB7CisgICAgIkB0eXBlIiA6ICJnOkRhdGUiLAorICAgICJAdmFsdWUiIDogMTQ4MTc1MDA3NjI5NQorICB9LCAicmVkIiwgeworICAgICJAdHlwZSIgOiAiZzpMaXN0IiwKKyAgICAiQHZhbHVlIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICJAdmFsdWUiIDogMQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDIKKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgIkB2YWx1ZSIgOiAzCisgICAgfSBdCisgIH0sIHsKKyAgICAiQHR5cGUiIDogImc6RGF0ZSIsCisgICAgIkB2YWx1ZSIgOiAxNDgxNzUwMDc2Mjk1CisgIH0sICJ0ZXN0IiwgeworICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgIkB2YWx1ZSIgOiAxMjMKKyAgfSBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9tZXRyaWNzLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9tZXRyaWNzLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWU5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL21ldHJpY3MtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw1NCBAQAoreworICAiQHR5cGUiIDogImc6TWV0cmljcyIsCisgICJAdmFsdWUiIDogeworICAgICJkdXIiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkRvdWJsZSIsCisgICAgICAiQHZhbHVlIiA6IDEwMC4wCisgICAgfSwKKyAgICAiY291bnRzIiA6IHsKKyAgICAgICJ0cmF2ZXJzZXJDb3VudCIgOiB7CisgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICJAdmFsdWUiIDogNAorICAgICAgfSwKKyAgICAgICJlbGVtZW50Q291bnQiIDogeworICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAiQHZhbHVlIiA6IDQKKyAgICAgIH0KKyAgICB9LAorICAgICJuYW1lIiA6ICJUaW5rZXJHcmFwaFN0ZXAodmVydGV4LFt+bGFiZWwuZXEocGVyc29uKV0pIiwKKyAgICAiYW5ub3RhdGlvbnMiIDogeworICAgICAgInBlcmNlbnREdXIiIDogeworICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgIkB2YWx1ZSIgOiAyNS4wCisgICAgICB9CisgICAgfSwKKyAgICAiaWQiIDogIjcuMC4wKCkiLAorICAgICJtZXRyaWNzIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOk1ldHJpY3MiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJkdXIiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAwLjAKKyAgICAgICAgfSwKKyAgICAgICAgImNvdW50cyIgOiB7CisgICAgICAgICAgInRyYXZlcnNlckNvdW50IiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgICB9LAorICAgICAgICAgICJlbGVtZW50Q291bnQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm5hbWUiIDogIlZlcnRleFN0ZXAoT1VULHZlcnRleCkiLAorICAgICAgICAiYW5ub3RhdGlvbnMiIDogeworICAgICAgICAgICJwZXJjZW50RHVyIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAyNS4wCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaWQiIDogIjMuMC4wKCkiCisgICAgICB9CisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL21ldHJpY3MtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9tZXRyaWNzLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmU2NzhiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9tZXRyaWNzLXYzZDAuanNvbgpAQCAtMCwwICsxLDUyIEBACit7CisgICJAdHlwZSIgOiAiZzpNZXRyaWNzIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgIkB2YWx1ZSIgOiBbICJkdXIiLCB7CisgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICJAdmFsdWUiIDogMTAwLjAKKyAgICB9LCAiY291bnRzIiwgeworICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAiQHZhbHVlIiA6IFsgInRyYXZlcnNlckNvdW50IiwgeworICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAiQHZhbHVlIiA6IDQKKyAgICAgIH0sICJlbGVtZW50Q291bnQiLCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICJAdmFsdWUiIDogNAorICAgICAgfSBdCisgICAgfSwgIm5hbWUiLCAiVGlua2VyR3JhcGhTdGVwKHZlcnRleCxbfmxhYmVsLmVxKHBlcnNvbildKSIsICJhbm5vdGF0aW9ucyIsIHsKKyAgICAgICJAdHlwZSIgOiAiZzpNYXAiLAorICAgICAgIkB2YWx1ZSIgOiBbICJwZXJjZW50RHVyIiwgeworICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgIkB2YWx1ZSIgOiAyNS4wCisgICAgICB9IF0KKyAgICB9LCAiaWQiLCAiNy4wLjAoKSIsICJtZXRyaWNzIiwgeworICAgICAgIkB0eXBlIiA6ICJnOkxpc3QiLAorICAgICAgIkB2YWx1ZSIgOiBbIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOk1ldHJpY3MiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IFsgImR1ciIsIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMDAuMAorICAgICAgICAgIH0sICJjb3VudHMiLCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogWyAidHJhdmVyc2VyQ291bnQiLCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICAgICAgfSwgImVsZW1lbnRDb3VudCIsIHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA3CisgICAgICAgICAgICB9IF0KKyAgICAgICAgICB9LCAibmFtZSIsICJWZXJ0ZXhTdGVwKE9VVCx2ZXJ0ZXgpIiwgImFubm90YXRpb25zIiwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IFsgInBlcmNlbnREdXIiLCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDI1LjAKKyAgICAgICAgICAgIH0gXQorICAgICAgICAgIH0sICJpZCIsICIzLjAuMCgpIiBdCisgICAgICAgIH0KKyAgICAgIH0gXQorICAgIH0gXQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9tb250aGRheS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbW9udGhkYXktdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhNTkxNAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbW9udGhkYXktdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6TW9udGhEYXkiLAorICAiQHZhbHVlIiA6ICItLTAxLTAxIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbW9udGhkYXktdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9tb250aGRheS12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhNTkxNAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvbW9udGhkYXktdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4Ok1vbnRoRGF5IiwKKyAgIkB2YWx1ZSIgOiAiLS0wMS0wMSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL29mZnNldGRhdGV0aW1lLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vZmZzZXRkYXRldGltZS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y0NWNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vZmZzZXRkYXRldGltZS12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpPZmZzZXREYXRlVGltZSIsCisgICJAdmFsdWUiIDogIjIwMDctMTItMDNUMTA6MTU6MzArMDE6MDAiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vZmZzZXRkYXRldGltZS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL29mZnNldGRhdGV0aW1lLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y0NWNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vZmZzZXRkYXRldGltZS12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6T2Zmc2V0RGF0ZVRpbWUiLAorICAiQHZhbHVlIiA6ICIyMDA3LTEyLTAzVDEwOjE1OjMwKzAxOjAwIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb2Zmc2V0dGltZS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb2Zmc2V0dGltZS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTI0OTUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vZmZzZXR0aW1lLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4Ok9mZnNldFRpbWUiLAorICAiQHZhbHVlIiA6ICIxMDoxNTozMCswMTowMCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL29mZnNldHRpbWUtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vZmZzZXR0aW1lLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTI0OTUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vZmZzZXR0aW1lLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpPZmZzZXRUaW1lIiwKKyAgIkB2YWx1ZSIgOiAiMTA6MTU6MzArMDE6MDAiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vcGVyYXRvci12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb3BlcmF0b3ItdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjMTQwMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb3BlcmF0b3ItdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpPcGVyYXRvciIsCisgICJAdmFsdWUiIDogInN1bSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL29wZXJhdG9yLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb3BlcmF0b3ItdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzE0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL29wZXJhdG9yLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOk9wZXJhdG9yIiwKKyAgIkB2YWx1ZSIgOiAic3VtIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb3JkZXItdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL29yZGVyLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTA0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL29yZGVyLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6T3JkZXIiLAorICAiQHZhbHVlIiA6ICJzaHVmZmxlIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb3JkZXItdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9vcmRlci12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlMDQzMgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvb3JkZXItdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6T3JkZXIiLAorICAiQHZhbHVlIiA6ICJzaHVmZmxlIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRmYjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlAiLAorICAiQHZhbHVlIiA6IHsKKyAgICAicHJlZGljYXRlIiA6ICJndCIsCisgICAgInZhbHVlIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDAKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3AtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRmYjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wLXYzZDAuanNvbgpAQCAtMCwwICsxLDEwIEBACit7CisgICJAdHlwZSIgOiAiZzpQIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgInByZWRpY2F0ZSIgOiAiZ3QiLAorICAgICJ2YWx1ZSIgOiB7CisgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgIkB2YWx1ZSIgOiAwCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYW5kLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYW5kLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzE5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BhbmQtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwyNSBAQAoreworICAiQHR5cGUiIDogImc6UCIsCisgICJAdmFsdWUiIDogeworICAgICJwcmVkaWNhdGUiIDogImFuZCIsCisgICAgInZhbHVlIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOlAiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJwcmVkaWNhdGUiIDogImd0IiwKKyAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMAorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOlAiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJwcmVkaWNhdGUiIDogImx0IiwKKyAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gXQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYW5kLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGFuZC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3MTk1OAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGFuZC12M2QwLmpzb24KQEAgLTAsMCArMSwyNSBAQAoreworICAiQHR5cGUiIDogImc6UCIsCisgICJAdmFsdWUiIDogeworICAgICJwcmVkaWNhdGUiIDogImFuZCIsCisgICAgInZhbHVlIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOlAiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJwcmVkaWNhdGUiIDogImd0IiwKKyAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMAorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOlAiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJwcmVkaWNhdGUiIDogImx0IiwKKyAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gXQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYXRoLXYxZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGF0aC12MWQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlZTg4MwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGF0aC12MWQwLmpzb24KQEAgLTAsMCArMSw2MiBAQAoreworICAibGFiZWxzIiA6IFsgWyBdLCBbIF0sIFsgXSBdLAorICAib2JqZWN0cyIgOiBbIHsKKyAgICAiaWQiIDogMSwKKyAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgInR5cGUiIDogInZlcnRleCIsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICJpZCIgOiAwLAorICAgICAgICAidmFsdWUiIDogIm1hcmtvIgorICAgICAgfSBdLAorICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAiaWQiIDogNiwKKyAgICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAxOTk3LAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDEKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogNywKKyAgICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzdGFydFRpbWUiIDogMjAwMSwKKyAgICAgICAgICAiZW5kVGltZSIgOiAyMDA0CisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgImlkIiA6IDgsCisgICAgICAgICJ2YWx1ZSIgOiAiYnJ1c3NlbHMiLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA0LAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDUKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogOSwKKyAgICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDUKKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDEwLAorICAgICJsYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJ0eXBlIiA6ICJ2ZXJ0ZXgiLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAiaWQiIDogNCwKKyAgICAgICAgInZhbHVlIiA6ICJncmVtbGluIgorICAgICAgfSBdCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDExLAorICAgICJsYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJ0eXBlIiA6ICJ2ZXJ0ZXgiLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAiaWQiIDogNSwKKyAgICAgICAgInZhbHVlIiA6ICJ0aW5rZXJncmFwaCIKKyAgICAgIH0gXQorICAgIH0KKyAgfSBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYXRoLXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGF0aC12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MmQyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGF0aC12MmQwLW5vLXR5cGVzLmpzb24KQEAgLTAsMCArMSwxMyBAQAoreworICAibGFiZWxzIiA6IFsgWyBdLCBbIF0sIFsgXSBdLAorICAib2JqZWN0cyIgOiBbIHsKKyAgICAiaWQiIDogMSwKKyAgICAibGFiZWwiIDogInBlcnNvbiIKKyAgfSwgeworICAgICJpZCIgOiAxMCwKKyAgICAibGFiZWwiIDogInNvZnR3YXJlIgorICB9LCB7CisgICAgImlkIiA6IDExLAorICAgICJsYWJlbCIgOiAic29mdHdhcmUiCisgIH0gXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGF0aC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGF0aC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2NhYTAwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYXRoLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsMzQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlBhdGgiLAorICAiQHZhbHVlIiA6IHsKKyAgICAibGFiZWxzIiA6IFsgWyBdLCBbIF0sIFsgXSBdLAorICAgICJvYmplY3RzIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInBlcnNvbiIKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMAorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInNvZnR3YXJlIgorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXgiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDExCisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAic29mdHdhcmUiCisgICAgICB9CisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BhdGgtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYXRoLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTZiMzkzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wYXRoLXYzZDAuanNvbgpAQCAtMCwwICsxLDQ5IEBACit7CisgICJAdHlwZSIgOiAiZzpQYXRoIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgImxhYmVscyIgOiB7CisgICAgICAiQHR5cGUiIDogImc6TGlzdCIsCisgICAgICAiQHZhbHVlIiA6IFsgeworICAgICAgICAiQHR5cGUiIDogImc6U2V0IiwKKyAgICAgICAgIkB2YWx1ZSIgOiBbIF0KKyAgICAgIH0sIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlNldCIsCisgICAgICAgICJAdmFsdWUiIDogWyBdCisgICAgICB9LCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpTZXQiLAorICAgICAgICAiQHZhbHVlIiA6IFsgXQorICAgICAgfSBdCisgICAgfSwKKyAgICAib2JqZWN0cyIgOiB7CisgICAgICAiQHR5cGUiIDogImc6TGlzdCIsCisgICAgICAiQHZhbHVlIiA6IFsgeworICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgICAgICB9LAorICAgICAgICAgICJsYWJlbCIgOiAicGVyc29uIgorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXgiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgICB9LAorICAgICAgICAgICJsYWJlbCIgOiAic29mdHdhcmUiCisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICAgIH0sCisgICAgICAgICAgImxhYmVsIiA6ICJzb2Z0d2FyZSIKKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wZXJpb2QtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BlcmlvZC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQzOGExCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wZXJpb2QtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6UGVyaW9kIiwKKyAgIkB2YWx1ZSIgOiAiUDFZNk0xNUQiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wZXJpb2QtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wZXJpb2QtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDM4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BlcmlvZC12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6UGVyaW9kIiwKKyAgIkB2YWx1ZSIgOiAiUDFZNk0xNUQiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9waWNrLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9waWNrLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTJmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BpY2stdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpQaWNrIiwKKyAgIkB2YWx1ZSIgOiAiYW55IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcGljay12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BpY2stdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTJmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BpY2stdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6UGljayIsCisgICJAdmFsdWUiIDogImFueSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BvcC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcG9wLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTUxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BvcC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlBvcCIsCisgICJAdmFsdWUiIDogImFsbCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BvcC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3BvcC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNTE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcG9wLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlBvcCIsCisgICJAdmFsdWUiIDogImFsbCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Bvci12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcG9yLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmNiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Bvci12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDMxIEBACit7CisgICJAdHlwZSIgOiAiZzpQIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgInByZWRpY2F0ZSIgOiAib3IiLAorICAgICJ2YWx1ZSIgOiBbIHsKKyAgICAgICJAdHlwZSIgOiAiZzpQIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAicHJlZGljYXRlIiA6ICJndCIsCisgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpQIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAicHJlZGljYXRlIiA6ICJ3aXRoaW4iLAorICAgICAgICAidmFsdWUiIDogWyB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IC0xCisgICAgICAgIH0sIHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogLTEwCisgICAgICAgIH0sIHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogLTEwMAorICAgICAgICB9IF0KKyAgICAgIH0KKyAgICB9IF0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcG9yLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcG9yLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzFiMWNmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wb3ItdjNkMC5qc29uCkBAIC0wLDAgKzEsMzQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlAiLAorICAiQHZhbHVlIiA6IHsKKyAgICAicHJlZGljYXRlIiA6ICJvciIsCisgICAgInZhbHVlIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOlAiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJwcmVkaWNhdGUiIDogImd0IiwKKyAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMAorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOlAiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJwcmVkaWNhdGUiIDogIndpdGhpbiIsCisgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkxpc3QiLAorICAgICAgICAgICJAdmFsdWUiIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAtMQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IC0xMAorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IC0xMDAKKyAgICAgICAgICB9IF0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gXQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wcm9wZXJ0eS12MWQwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Byb3BlcnR5LXYxZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDUxYzBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wcm9wZXJ0eS12MWQwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJrZXkiIDogInNpbmNlIiwKKyAgInZhbHVlIiA6IDIwMDkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Byb3BlcnR5LXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcHJvcGVydHktdjJkMC1uby10eXBlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTFjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Byb3BlcnR5LXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgImtleSIgOiAic2luY2UiLAorICAidmFsdWUiIDogMjAwOQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcHJvcGVydHktdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Byb3BlcnR5LXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmZlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Byb3BlcnR5LXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgImtleSIgOiAic2luY2UiLAorICAgICJ2YWx1ZSIgOiB7CisgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgIkB2YWx1ZSIgOiAyMDA5CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wcm9wZXJ0eS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Byb3BlcnR5LXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTZmZTMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wcm9wZXJ0eS12M2QwLmpzb24KQEAgLTAsMCArMSwxMCBAQAoreworICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAiQHZhbHVlIiA6IHsKKyAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgInZhbHVlIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDIwMDkKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3B3aXRoaW4tdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3B3aXRoaW4tdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMzgyNgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcHdpdGhpbi12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDEwIEBACit7CisgICJAdHlwZSIgOiAiZzpQIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgInByZWRpY2F0ZSIgOiAid2l0aGluIiwKKyAgICAidmFsdWUiIDogWyB7CisgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgIkB2YWx1ZSIgOiAxCisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3B3aXRoaW4tdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wd2l0aGluLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2Y5OWNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wd2l0aGluLXYzZDAuanNvbgpAQCAtMCwwICsxLDEzIEBACit7CisgICJAdHlwZSIgOiAiZzpQIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgInByZWRpY2F0ZSIgOiAid2l0aGluIiwKKyAgICAidmFsdWUiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkxpc3QiLAorICAgICAgIkB2YWx1ZSIgOiBbIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICB9IF0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3B3aXRob3V0LXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wd2l0aG91dC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIyOTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wd2l0aG91dC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDEzIEBACit7CisgICJAdHlwZSIgOiAiZzpQIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgInByZWRpY2F0ZSIgOiAid2l0aG91dCIsCisgICAgInZhbHVlIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICJAdmFsdWUiIDogMQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDIKKyAgICB9IF0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcHdpdGhvdXQtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9wd2l0aG91dC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExNjg5MAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvcHdpdGhvdXQtdjNkMC5qc29uCkBAIC0wLDAgKzEsMTYgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlAiLAorICAiQHZhbHVlIiA6IHsKKyAgICAicHJlZGljYXRlIiA6ICJ3aXRob3V0IiwKKyAgICAidmFsdWUiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkxpc3QiLAorICAgICAgIkB2YWx1ZSIgOiBbIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICB9LCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICJAdmFsdWUiIDogMgorICAgICAgfSBdCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zY29wZS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2NvcGUtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3NGFmMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2NvcGUtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpTY29wZSIsCisgICJAdmFsdWUiIDogImxvY2FsIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2NvcGUtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zY29wZS12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3NGFmMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2NvcGUtdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImc6U2NvcGUiLAorICAiQHZhbHVlIiA6ICJsb2NhbCIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12MWQwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12MWQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4MjVlOAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmNsb3NlLXYxZDAuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJjbG9zZSIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgInNlc3Npb24iIDogInVuaXF1ZS1zZXNzaW9uLWlkZW50aWZpZXIiCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12MmQwLW5vLXR5cGVzLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4MjVlOAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmNsb3NlLXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJjbG9zZSIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgInNlc3Npb24iIDogInVuaXF1ZS1zZXNzaW9uLWlkZW50aWZpZXIiCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmNsb3NlLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjODI1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJjbG9zZSIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgInNlc3Npb24iIDogInVuaXF1ZS1zZXNzaW9uLWlkZW50aWZpZXIiCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25jbG9zZS12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlMWNjZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmNsb3NlLXYzZDAuanNvbgpAQCAtMCwwICsxLDkgQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJjbG9zZSIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgIkB2YWx1ZSIgOiBbICJzZXNzaW9uIiwgInVuaXF1ZS1zZXNzaW9uLWlkZW50aWZpZXIiIF0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWwtdjFkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9uZXZhbC12MWQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjZTgyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWwtdjFkMC5qc29uCkBAIC0wLDAgKzEsMTMgQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJldmFsIiwKKyAgInByb2Nlc3NvciIgOiAic2Vzc2lvbiIsCisgICJhcmdzIiA6IHsKKyAgICAiZ3JlbWxpbiIgOiAiZy5WKHgpIiwKKyAgICAibGFuZ3VhZ2UiIDogImdyZW1saW4tZ3Jvb3Z5IiwKKyAgICAic2Vzc2lvbiIgOiAidW5pcXVlLXNlc3Npb24taWRlbnRpZmllciIsCisgICAgImJpbmRpbmdzIiA6IHsKKyAgICAgICJ4IiA6IDEKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsLXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWwtdjJkMC1uby10eXBlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiY2U4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsLXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDEzIEBACit7CisgICJyZXF1ZXN0SWQiIDogImNiNjgyNTc4LTlkOTItNDQ5OS05ZWJjLTVjNmFhNzNjNTM5NyIsCisgICJvcCIgOiAiZXZhbCIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgImdyZW1saW4iIDogImcuVih4KSIsCisgICAgImxhbmd1YWdlIiA6ICJncmVtbGluLWdyb292eSIsCisgICAgInNlc3Npb24iIDogInVuaXF1ZS1zZXNzaW9uLWlkZW50aWZpZXIiLAorICAgICJiaW5kaW5ncyIgOiB7CisgICAgICAieCIgOiAxCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9uZXZhbC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWwtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmOGI5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWwtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwxNiBAQAoreworICAicmVxdWVzdElkIiA6ICJjYjY4MjU3OC05ZDkyLTQ0OTktOWViYy01YzZhYTczYzUzOTciLAorICAib3AiIDogImV2YWwiLAorICAicHJvY2Vzc29yIiA6ICJzZXNzaW9uIiwKKyAgImFyZ3MiIDogeworICAgICJncmVtbGluIiA6ICJnLlYoeCkiLAorICAgICJsYW5ndWFnZSIgOiAiZ3JlbWxpbi1ncm9vdnkiLAorICAgICJzZXNzaW9uIiA6ICJ1bmlxdWUtc2Vzc2lvbi1pZGVudGlmaWVyIiwKKyAgICAiYmluZGluZ3MiIDogeworICAgICAgIngiIDogeworICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgIH0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWwtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWMzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsLXYzZDAuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJyZXF1ZXN0SWQiIDogImNiNjgyNTc4LTlkOTItNDQ5OS05ZWJjLTVjNmFhNzNjNTM5NyIsCisgICJvcCIgOiAiZXZhbCIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgIkB2YWx1ZSIgOiBbICJncmVtbGluIiwgImcuVih4KSIsICJsYW5ndWFnZSIsICJncmVtbGluLWdyb292eSIsICJzZXNzaW9uIiwgInVuaXF1ZS1zZXNzaW9uLWlkZW50aWZpZXIiLCAiYmluZGluZ3MiLCB7CisgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICJAdmFsdWUiIDogWyAieCIsIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICB9IF0KKyAgICB9IF0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWxhbGlhc2VkLXYxZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWxhbGlhc2VkLXYxZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjRlZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9uZXZhbGFsaWFzZWQtdjFkMC5qc29uCkBAIC0wLDAgKzEsMTYgQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJldmFsIiwKKyAgInByb2Nlc3NvciIgOiAic2Vzc2lvbiIsCisgICJhcmdzIiA6IHsKKyAgICAiZ3JlbWxpbiIgOiAic29jaWFsLlYoeCkiLAorICAgICJsYW5ndWFnZSIgOiAiZ3JlbWxpbi1ncm9vdnkiLAorICAgICJhbGlhc2VzIiA6IHsKKyAgICAgICJnIiA6ICJzb2NpYWwiCisgICAgfSwKKyAgICAic2Vzc2lvbiIgOiAidW5pcXVlLXNlc3Npb24taWRlbnRpZmllciIsCisgICAgImJpbmRpbmdzIiA6IHsKKyAgICAgICJ4IiA6IDEKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsYWxpYXNlZC12MmQwLW5vLXR5cGVzLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsYWxpYXNlZC12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0ZWY0NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWxhbGlhc2VkLXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisgICJyZXF1ZXN0SWQiIDogImNiNjgyNTc4LTlkOTItNDQ5OS05ZWJjLTVjNmFhNzNjNTM5NyIsCisgICJvcCIgOiAiZXZhbCIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgImdyZW1saW4iIDogInNvY2lhbC5WKHgpIiwKKyAgICAibGFuZ3VhZ2UiIDogImdyZW1saW4tZ3Jvb3Z5IiwKKyAgICAiYWxpYXNlcyIgOiB7CisgICAgICAiZyIgOiAic29jaWFsIgorICAgIH0sCisgICAgInNlc3Npb24iIDogInVuaXF1ZS1zZXNzaW9uLWlkZW50aWZpZXIiLAorICAgICJiaW5kaW5ncyIgOiB7CisgICAgICAieCIgOiAxCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9uZXZhbGFsaWFzZWQtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsYWxpYXNlZC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTRlNWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9uZXZhbGFsaWFzZWQtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwxOSBAQAoreworICAicmVxdWVzdElkIiA6ICJjYjY4MjU3OC05ZDkyLTQ0OTktOWViYy01YzZhYTczYzUzOTciLAorICAib3AiIDogImV2YWwiLAorICAicHJvY2Vzc29yIiA6ICJzZXNzaW9uIiwKKyAgImFyZ3MiIDogeworICAgICJncmVtbGluIiA6ICJzb2NpYWwuVih4KSIsCisgICAgImxhbmd1YWdlIiA6ICJncmVtbGluLWdyb292eSIsCisgICAgImFsaWFzZXMiIDogeworICAgICAgImciIDogInNvY2lhbCIKKyAgICB9LAorICAgICJzZXNzaW9uIiA6ICJ1bmlxdWUtc2Vzc2lvbi1pZGVudGlmaWVyIiwKKyAgICAiYmluZGluZ3MiIDogeworICAgICAgIngiIDogeworICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgIH0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsYWxpYXNlZC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25ldmFsYWxpYXNlZC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0ODE2MAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmV2YWxhbGlhc2VkLXYzZDAuanNvbgpAQCAtMCwwICsxLDE4IEBACit7CisgICJyZXF1ZXN0SWQiIDogImNiNjgyNTc4LTlkOTItNDQ5OS05ZWJjLTVjNmFhNzNjNTM5NyIsCisgICJvcCIgOiAiZXZhbCIsCisgICJwcm9jZXNzb3IiIDogInNlc3Npb24iLAorICAiYXJncyIgOiB7CisgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgIkB2YWx1ZSIgOiBbICJncmVtbGluIiwgInNvY2lhbC5WKHgpIiwgImxhbmd1YWdlIiwgImdyZW1saW4tZ3Jvb3Z5IiwgImFsaWFzZXMiLCB7CisgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICJAdmFsdWUiIDogWyAiZyIsICJzb2NpYWwiIF0KKyAgICB9LCAic2Vzc2lvbiIsICJ1bmlxdWUtc2Vzc2lvbi1pZGVudGlmaWVyIiwgImJpbmRpbmdzIiwgeworICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAiQHZhbHVlIiA6IFsgIngiLCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgfSBdCisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbC12MWQwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbC12MWQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5YTgwNwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsLXYxZDAuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisgICJyZXF1ZXN0SWQiIDogImNiNjgyNTc4LTlkOTItNDQ5OS05ZWJjLTVjNmFhNzNjNTM5NyIsCisgICJvcCIgOiAiZXZhbCIsCisgICJwcm9jZXNzb3IiIDogIiIsCisgICJhcmdzIiA6IHsKKyAgICAiZ3JlbWxpbiIgOiAiZy5WKHgpIiwKKyAgICAibGFuZ3VhZ2UiIDogImdyZW1saW4tZ3Jvb3Z5IiwKKyAgICAiYmluZGluZ3MiIDogeworICAgICAgIngiIDogMQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsLXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsLXYyZDAtbm8tdHlwZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzlhODA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWwtdjJkMC1uby10eXBlcy5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJldmFsIiwKKyAgInByb2Nlc3NvciIgOiAiIiwKKyAgImFyZ3MiIDogeworICAgICJncmVtbGluIiA6ICJnLlYoeCkiLAorICAgICJsYW5ndWFnZSIgOiAiZ3JlbWxpbi1ncm9vdnkiLAorICAgICJiaW5kaW5ncyIgOiB7CisgICAgICAieCIgOiAxCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWwtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWUyZjZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWwtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworICAicmVxdWVzdElkIiA6ICJjYjY4MjU3OC05ZDkyLTQ0OTktOWViYy01YzZhYTczYzUzOTciLAorICAib3AiIDogImV2YWwiLAorICAicHJvY2Vzc29yIiA6ICIiLAorICAiYXJncyIgOiB7CisgICAgImdyZW1saW4iIDogImcuVih4KSIsCisgICAgImxhbmd1YWdlIiA6ICJncmVtbGluLWdyb292eSIsCisgICAgImJpbmRpbmdzIiA6IHsKKyAgICAgICJ4IiA6IHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICB9CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWwtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWwtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOGM4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbC12M2QwLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworICAicmVxdWVzdElkIiA6ICJjYjY4MjU3OC05ZDkyLTQ0OTktOWViYy01YzZhYTczYzUzOTciLAorICAib3AiIDogImV2YWwiLAorICAicHJvY2Vzc29yIiA6ICIiLAorICAiYXJncyIgOiB7CisgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgIkB2YWx1ZSIgOiBbICJncmVtbGluIiwgImcuVih4KSIsICJsYW5ndWFnZSIsICJncmVtbGluLWdyb292eSIsICJiaW5kaW5ncyIsIHsKKyAgICAgICJAdHlwZSIgOiAiZzpNYXAiLAorICAgICAgIkB2YWx1ZSIgOiBbICJ4IiwgeworICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgIH0gXQorICAgIH0gXQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWxhbGlhc2VkLXYxZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsYWxpYXNlZC12MWQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmMGM2YwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsYWxpYXNlZC12MWQwLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworICAicmVxdWVzdElkIiA6ICJjYjY4MjU3OC05ZDkyLTQ0OTktOWViYy01YzZhYTczYzUzOTciLAorICAib3AiIDogImV2YWwiLAorICAicHJvY2Vzc29yIiA6ICIiLAorICAiYXJncyIgOiB7CisgICAgImdyZW1saW4iIDogInNvY2lhbC5WKHgpIiwKKyAgICAibGFuZ3VhZ2UiIDogImdyZW1saW4tZ3Jvb3Z5IiwKKyAgICAiYWxpYXNlcyIgOiB7CisgICAgICAiZyIgOiAic29jaWFsIgorICAgIH0sCisgICAgImJpbmRpbmdzIiA6IHsKKyAgICAgICJ4IiA6IDEKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbGFsaWFzZWQtdjJkMC1uby10eXBlcy5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWxhbGlhc2VkLXYyZDAtbm8tdHlwZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWYwYzZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWxhbGlhc2VkLXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJyZXF1ZXN0SWQiIDogImNiNjgyNTc4LTlkOTItNDQ5OS05ZWJjLTVjNmFhNzNjNTM5NyIsCisgICJvcCIgOiAiZXZhbCIsCisgICJwcm9jZXNzb3IiIDogIiIsCisgICJhcmdzIiA6IHsKKyAgICAiZ3JlbWxpbiIgOiAic29jaWFsLlYoeCkiLAorICAgICJsYW5ndWFnZSIgOiAiZ3JlbWxpbi1ncm9vdnkiLAorICAgICJhbGlhc2VzIiA6IHsKKyAgICAgICJnIiA6ICJzb2NpYWwiCisgICAgfSwKKyAgICAiYmluZGluZ3MiIDogeworICAgICAgIngiIDogMQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsYWxpYXNlZC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsYWxpYXNlZC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjZhNTRlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zZXNzaW9ubGVzc2V2YWxhbGlhc2VkLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsMTggQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJldmFsIiwKKyAgInByb2Nlc3NvciIgOiAiIiwKKyAgImFyZ3MiIDogeworICAgICJncmVtbGluIiA6ICJzb2NpYWwuVih4KSIsCisgICAgImxhbmd1YWdlIiA6ICJncmVtbGluLWdyb292eSIsCisgICAgImFsaWFzZXMiIDogeworICAgICAgImciIDogInNvY2lhbCIKKyAgICB9LAorICAgICJiaW5kaW5ncyIgOiB7CisgICAgICAieCIgOiB7CisgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgfQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2Vzc2lvbmxlc3NldmFsYWxpYXNlZC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbGFsaWFzZWQtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDNhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbGFsaWFzZWQtdjNkMC5qc29uCkBAIC0wLDAgKzEsMTggQEAKK3sKKyAgInJlcXVlc3RJZCIgOiAiY2I2ODI1NzgtOWQ5Mi00NDk5LTllYmMtNWM2YWE3M2M1Mzk3IiwKKyAgIm9wIiA6ICJldmFsIiwKKyAgInByb2Nlc3NvciIgOiAiIiwKKyAgImFyZ3MiIDogeworICAgICJAdHlwZSIgOiAiZzpNYXAiLAorICAgICJAdmFsdWUiIDogWyAiZ3JlbWxpbiIsICJzb2NpYWwuVih4KSIsICJsYW5ndWFnZSIsICJncmVtbGluLWdyb292eSIsICJhbGlhc2VzIiwgeworICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAiQHZhbHVlIiA6IFsgImciLCAic29jaWFsIiBdCisgICAgfSwgImJpbmRpbmdzIiwgeworICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAiQHZhbHVlIiA6IFsgIngiLCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgfSBdCisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3NldC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3NldC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkZWVhMgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2V0LXYzZDAuanNvbgpAQCAtMCwwICsxLDcgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlNldCIsCisgICJAdmFsdWUiIDogWyB7CisgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAiQHZhbHVlIiA6IDEKKyAgfSwgInBlcnNvbiIsIHRydWUgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2hvcnQtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nob3J0LXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OGY1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nob3J0LXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OkludDE2IiwKKyAgIkB2YWx1ZSIgOiAxMDAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nob3J0LXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc2hvcnQtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OGY1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3Nob3J0LXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpJbnQxNiIsCisgICJAdmFsdWUiIDogMTAwCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zdGFuZGFyZHJlc3VsdC12MWQwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3N0YW5kYXJkcmVzdWx0LXYxZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjkzNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zdGFuZGFyZHJlc3VsdC12MWQwLmpzb24KQEAgLTAsMCArMSw1MCBAQAoreworICAicmVxdWVzdElkIiA6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiLAorICAic3RhdHVzIiA6IHsKKyAgICAibWVzc2FnZSIgOiAiIiwKKyAgICAiY29kZSIgOiAyMDAsCisgICAgImF0dHJpYnV0ZXMiIDogeyB9CisgIH0sCisgICJyZXN1bHQiIDogeworICAgICJkYXRhIiA6IFsgeworICAgICAgImlkIiA6IDEsCisgICAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgICAidHlwZSIgOiAidmVydGV4IiwKKyAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICAgImlkIiA6IDAsCisgICAgICAgICAgInZhbHVlIiA6ICJtYXJrbyIKKyAgICAgICAgfSBdLAorICAgICAgICAibG9jYXRpb24iIDogWyB7CisgICAgICAgICAgImlkIiA6IDYsCisgICAgICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICJzdGFydFRpbWUiIDogMTk5NywKKyAgICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDEKKyAgICAgICAgICB9CisgICAgICAgIH0sIHsKKyAgICAgICAgICAiaWQiIDogNywKKyAgICAgICAgICAidmFsdWUiIDogInNhbnRhIGNydXoiLAorICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICJzdGFydFRpbWUiIDogMjAwMSwKKyAgICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDQKKyAgICAgICAgICB9CisgICAgICAgIH0sIHsKKyAgICAgICAgICAiaWQiIDogOCwKKyAgICAgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDQsCisgICAgICAgICAgICAiZW5kVGltZSIgOiAyMDA1CisgICAgICAgICAgfQorICAgICAgICB9LCB7CisgICAgICAgICAgImlkIiA6IDksCisgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA1CisgICAgICAgICAgfQorICAgICAgICB9IF0KKyAgICAgIH0KKyAgICB9IF0sCisgICAgIm1ldGEiIDogeyB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3N0YW5kYXJkcmVzdWx0LXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zdGFuZGFyZHJlc3VsdC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTdjNmRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC9zdGFuZGFyZHJlc3VsdC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDExMSBAQAoreworICAicmVxdWVzdElkIiA6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiLAorICAic3RhdHVzIiA6IHsKKyAgICAibWVzc2FnZSIgOiAiIiwKKyAgICAiY29kZSIgOiAyMDAsCisgICAgImF0dHJpYnV0ZXMiIDogeyB9CisgIH0sCisgICJyZXN1bHQiIDogeworICAgICJkYXRhIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogIm1hcmtvIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJuYW1lIgorICAgICAgICAgICAgfQorICAgICAgICAgIH0gXSwKKyAgICAgICAgICAibG9jYXRpb24iIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDYKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTk5NworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogInNhbnRhIGNydXoiLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogOAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDkKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IF0sCisgICAgIm1ldGEiIDogeyB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3N0YW5kYXJkcmVzdWx0LXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvc3RhbmRhcmRyZXN1bHQtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2E0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3N0YW5kYXJkcmVzdWx0LXYzZDAuanNvbgpAQCAtMCwwICsxLDEyMCBAQAoreworICAicmVxdWVzdElkIiA6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiLAorICAic3RhdHVzIiA6IHsKKyAgICAibWVzc2FnZSIgOiAiIiwKKyAgICAiY29kZSIgOiAyMDAsCisgICAgImF0dHJpYnV0ZXMiIDogeworICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAiQHZhbHVlIiA6IFsgXQorICAgIH0KKyAgfSwKKyAgInJlc3VsdCIgOiB7CisgICAgImRhdGEiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkxpc3QiLAorICAgICAgIkB2YWx1ZSIgOiBbIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICAgICAgfSwKKyAgICAgICAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAidmFsdWUiIDogIm1hcmtvIiwKKyAgICAgICAgICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gXSwKKyAgICAgICAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDYKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2FuIGRpZWdvIiwKKyAgICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxOTk3CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDEKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2FudGEgY3J1eiIsCisgICAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA0CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA0CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2FudGEgZmUiLAorICAgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gXQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfSwKKyAgICAibWV0YSIgOiB7CisgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICJAdmFsdWUiIDogWyBdCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90LXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90LXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTM5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3QtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpUIiwKKyAgIkB2YWx1ZSIgOiAibGFiZWwiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90LXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5Mzk4MwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdC12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpUIiwKKyAgIkB2YWx1ZSIgOiAibGFiZWwiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90ZXh0cC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdGV4dHAtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyMDk4OQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdGV4dHAtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw3IEBACit7CisgICJAdHlwZSIgOiAiZzpUZXh0UCIsCisgICJAdmFsdWUiIDogeworICAgICJwcmVkaWNhdGUiIDogImNvbnRhaW5pbmciLAorICAgICJ2YWx1ZSIgOiAiYXJrIgorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90ZXh0cC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RleHRwLXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODIwOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90ZXh0cC12M2QwLmpzb24KQEAgLTAsMCArMSw3IEBACit7CisgICJAdHlwZSIgOiAiZzpUZXh0UCIsCisgICJAdmFsdWUiIDogeworICAgICJwcmVkaWNhdGUiIDogImNvbnRhaW5pbmciLAorICAgICJ2YWx1ZSIgOiAiYXJrIgorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90aW1lc3RhbXAtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbWVzdGFtcC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2EwZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90aW1lc3RhbXAtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpUaW1lc3RhbXAiLAorICAiQHZhbHVlIiA6IDE0ODE3NTAwNzYyOTUKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbWVzdGFtcC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbWVzdGFtcC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhMGUxNwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdGltZXN0YW1wLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlRpbWVzdGFtcCIsCisgICJAdmFsdWUiIDogMTQ4MTc1MDA3NjI5NQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdGlua2VyZ3JhcGgtdjFkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90aW5rZXJncmFwaC12MWQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3MTlmNgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdGlua2VyZ3JhcGgtdjFkMC5qc29uCkBAIC0wLDAgKzEsMzEzIEBACit7CisgICJ2ZXJ0aWNlcyIgOiBbIHsKKyAgICAiaWQiIDogMSwKKyAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgInR5cGUiIDogInZlcnRleCIsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICJpZCIgOiAwLAorICAgICAgICAidmFsdWUiIDogIm1hcmtvIgorICAgICAgfSBdLAorICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAiaWQiIDogNiwKKyAgICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAxOTk3LAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDEKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogNywKKyAgICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzdGFydFRpbWUiIDogMjAwMSwKKyAgICAgICAgICAiZW5kVGltZSIgOiAyMDA0CisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgImlkIiA6IDgsCisgICAgICAgICJ2YWx1ZSIgOiAiYnJ1c3NlbHMiLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA0LAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDUKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogOSwKKyAgICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDUKKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDcsCisgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICJ0eXBlIiA6ICJ2ZXJ0ZXgiLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAiaWQiIDogMSwKKyAgICAgICAgInZhbHVlIiA6ICJzdGVwaGVuIgorICAgICAgfSBdLAorICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAiaWQiIDogMTAsCisgICAgICAgICJ2YWx1ZSIgOiAiY2VudHJldmlsbGUiLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAxOTkwLAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDAKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogMTEsCisgICAgICAgICJ2YWx1ZSIgOiAiZHVsbGVzIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzdGFydFRpbWUiIDogMjAwMCwKKyAgICAgICAgICAiZW5kVGltZSIgOiAyMDA2CisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgImlkIiA6IDEyLAorICAgICAgICAidmFsdWUiIDogInB1cmNlbGx2aWxsZSIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDYKKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDgsCisgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICJ0eXBlIiA6ICJ2ZXJ0ZXgiLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAiaWQiIDogMiwKKyAgICAgICAgInZhbHVlIiA6ICJtYXR0aGlhcyIKKyAgICAgIH0gXSwKKyAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgImlkIiA6IDEzLAorICAgICAgICAidmFsdWUiIDogImJyZW1lbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDQsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAwNworICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiAxNCwKKyAgICAgICAgInZhbHVlIiA6ICJiYWx0aW1vcmUiLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA3LAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMTEKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogMTUsCisgICAgICAgICJ2YWx1ZSIgOiAib2FrbGFuZCIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMTEsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAxNAorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiAxNiwKKyAgICAgICAgInZhbHVlIiA6ICJzZWF0dGxlIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzdGFydFRpbWUiIDogMjAxNAorICAgICAgICB9CisgICAgICB9IF0KKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogOSwKKyAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgInR5cGUiIDogInZlcnRleCIsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICJpZCIgOiAzLAorICAgICAgICAidmFsdWUiIDogImRhbmllbCIKKyAgICAgIH0gXSwKKyAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgImlkIiA6IDE3LAorICAgICAgICAidmFsdWUiIDogInNwcmVtYmVyZyIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDE5ODIsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAwNQorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiAxOCwKKyAgICAgICAgInZhbHVlIiA6ICJrYWlzZXJzbGF1dGVybiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDUsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAwOQorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiAxOSwKKyAgICAgICAgInZhbHVlIiA6ICJhYWNoZW4iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA5CisgICAgICAgIH0KKyAgICAgIH0gXQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAxMCwKKyAgICAibGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAidHlwZSIgOiAidmVydGV4IiwKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgImlkIiA6IDQsCisgICAgICAgICJ2YWx1ZSIgOiAiZ3JlbWxpbiIKKyAgICAgIH0gXQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAxMSwKKyAgICAibGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAidHlwZSIgOiAidmVydGV4IiwKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgImlkIiA6IDUsCisgICAgICAgICJ2YWx1ZSIgOiAidGlua2VyZ3JhcGgiCisgICAgICB9IF0KKyAgICB9CisgIH0gXSwKKyAgImVkZ2VzIiA6IFsgeworICAgICJpZCIgOiAxMywKKyAgICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgICAidHlwZSIgOiAiZWRnZSIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDEsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNpbmNlIiA6IDIwMDkKKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMTQsCisgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMSwKKyAgICAib3V0ViIgOiAxLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJzaW5jZSIgOiAyMDEwCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDE1LAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMCwKKyAgICAib3V0ViIgOiAxLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiA0CisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDE2LAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMSwKKyAgICAib3V0ViIgOiAxLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiA1CisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDE3LAorICAgICJsYWJlbCIgOiAiZGV2ZWxvcHMiLAorICAgICJ0eXBlIiA6ICJlZGdlIiwKKyAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICJpblYiIDogMTAsCisgICAgIm91dFYiIDogNywKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAic2luY2UiIDogMjAxMAorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAxOCwKKyAgICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgICAidHlwZSIgOiAiZWRnZSIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDExLAorICAgICJvdXRWIiA6IDcsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNpbmNlIiA6IDIwMTEKKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMTksCisgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAidHlwZSIgOiAiZWRnZSIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDcsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNraWxsIiA6IDUKKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMjAsCisgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAidHlwZSIgOiAiZWRnZSIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDExLAorICAgICJvdXRWIiA6IDcsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNraWxsIiA6IDQKKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMjEsCisgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMCwKKyAgICAib3V0ViIgOiA4LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJzaW5jZSIgOiAyMDEyCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDIyLAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMCwKKyAgICAib3V0ViIgOiA4LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiAzCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDIzLAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMSwKKyAgICAib3V0ViIgOiA4LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiAzCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDI0LAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMCwKKyAgICAib3V0ViIgOiA5LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiA1CisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDI1LAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgInR5cGUiIDogImVkZ2UiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMSwKKyAgICAib3V0ViIgOiA5LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiAzCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDI2LAorICAgICJsYWJlbCIgOiAidHJhdmVyc2VzIiwKKyAgICAidHlwZSIgOiAiZWRnZSIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJpblYiIDogMTEsCisgICAgIm91dFYiIDogMTAKKyAgfSBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90aW5rZXJncmFwaC12MmQwLW5vLXR5cGVzLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbmtlcmdyYXBoLXYyZDAtbm8tdHlwZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGFkMDYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90aW5rZXJncmFwaC12MmQwLW5vLXR5cGVzLmpzb24KQEAgLTAsMCArMSwzNTIgQEAKK3sKKyAgInZlcnRpY2VzIiA6IFsgeworICAgICJpZCIgOiAxLAorICAgICJsYWJlbCIgOiAicGVyc29uIiwKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgImlkIiA6IDAsCisgICAgICAgICJ2YWx1ZSIgOiAibWFya28iLAorICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICB9IF0sCisgICAgICAibG9jYXRpb24iIDogWyB7CisgICAgICAgICJpZCIgOiA2LAorICAgICAgICAidmFsdWUiIDogInNhbiBkaWVnbyIsCisgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAxOTk3LAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDEKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogNywKKyAgICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDEsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAwNAorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiA4LAorICAgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDQsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAwNQorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiA5LAorICAgICAgICAidmFsdWUiIDogInNhbnRhIGZlIiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDUKKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDcsCisgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAiaWQiIDogMSwKKyAgICAgICAgInZhbHVlIiA6ICJzdGVwaGVuIiwKKyAgICAgICAgImxhYmVsIiA6ICJuYW1lIgorICAgICAgfSBdLAorICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAiaWQiIDogMTAsCisgICAgICAgICJ2YWx1ZSIgOiAiY2VudHJldmlsbGUiLAorICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzdGFydFRpbWUiIDogMTk5MCwKKyAgICAgICAgICAiZW5kVGltZSIgOiAyMDAwCisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgImlkIiA6IDExLAorICAgICAgICAidmFsdWUiIDogImR1bGxlcyIsCisgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAyMDAwLAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDYKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogMTIsCisgICAgICAgICJ2YWx1ZSIgOiAicHVyY2VsbHZpbGxlIiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDYKKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDgsCisgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAiaWQiIDogMiwKKyAgICAgICAgInZhbHVlIiA6ICJtYXR0aGlhcyIsCisgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgIH0gXSwKKyAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgImlkIiA6IDEzLAorICAgICAgICAidmFsdWUiIDogImJyZW1lbiIsCisgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA0LAorICAgICAgICAgICJlbmRUaW1lIiA6IDIwMDcKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiaWQiIDogMTQsCisgICAgICAgICJ2YWx1ZSIgOiAiYmFsdGltb3JlIiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDcsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAxMQorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiAxNSwKKyAgICAgICAgInZhbHVlIiA6ICJvYWtsYW5kIiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMTEsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAxNAorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiAxNiwKKyAgICAgICAgInZhbHVlIiA6ICJzZWF0dGxlIiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMTQKKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDksCisgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAiaWQiIDogMywKKyAgICAgICAgInZhbHVlIiA6ICJkYW5pZWwiLAorICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICB9IF0sCisgICAgICAibG9jYXRpb24iIDogWyB7CisgICAgICAgICJpZCIgOiAxNywKKyAgICAgICAgInZhbHVlIiA6ICJzcHJlbWJlcmciLAorICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzdGFydFRpbWUiIDogMTk4MiwKKyAgICAgICAgICAiZW5kVGltZSIgOiAyMDA1CisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgImlkIiA6IDE4LAorICAgICAgICAidmFsdWUiIDogImthaXNlcnNsYXV0ZXJuIiwKKyAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDUsCisgICAgICAgICAgImVuZFRpbWUiIDogMjAwOQorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJpZCIgOiAxOSwKKyAgICAgICAgInZhbHVlIiA6ICJhYWNoZW4iLAorICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzdGFydFRpbWUiIDogMjAwOQorICAgICAgICB9CisgICAgICB9IF0KKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMTAsCisgICAgImxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICJpZCIgOiA0LAorICAgICAgICAidmFsdWUiIDogImdyZW1saW4iLAorICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICB9IF0KKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMTEsCisgICAgImxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICJpZCIgOiA1LAorICAgICAgICAidmFsdWUiIDogInRpbmtlcmdyYXBoIiwKKyAgICAgICAgImxhYmVsIiA6ICJuYW1lIgorICAgICAgfSBdCisgICAgfQorICB9IF0sCisgICJlZGdlcyIgOiBbIHsKKyAgICAiaWQiIDogMTMsCisgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDEsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNpbmNlIiA6IHsKKyAgICAgICAgImtleSIgOiAic2luY2UiLAorICAgICAgICAidmFsdWUiIDogMjAwOQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAxNCwKKyAgICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICJpblYiIDogMTEsCisgICAgIm91dFYiIDogMSwKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAic2luY2UiIDogeworICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICJ2YWx1ZSIgOiAyMDEwCisgICAgICB9CisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDE1LAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDEsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAidmFsdWUiIDogNAorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAxNiwKKyAgICAibGFiZWwiIDogInVzZXMiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMSwKKyAgICAib3V0ViIgOiAxLAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiB7CisgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgInZhbHVlIiA6IDUKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMTcsCisgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDcsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNpbmNlIiA6IHsKKyAgICAgICAgImtleSIgOiAic2luY2UiLAorICAgICAgICAidmFsdWUiIDogMjAxMAorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAxOCwKKyAgICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICJpblYiIDogMTEsCisgICAgIm91dFYiIDogNywKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAic2luY2UiIDogeworICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICJ2YWx1ZSIgOiAyMDExCisgICAgICB9CisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDE5LAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDcsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAidmFsdWUiIDogNQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAyMCwKKyAgICAibGFiZWwiIDogInVzZXMiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMSwKKyAgICAib3V0ViIgOiA3LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiB7CisgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgInZhbHVlIiA6IDQKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMjEsCisgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDgsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNpbmNlIiA6IHsKKyAgICAgICAgImtleSIgOiAic2luY2UiLAorICAgICAgICAidmFsdWUiIDogMjAxMgorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAyMiwKKyAgICAibGFiZWwiIDogInVzZXMiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMCwKKyAgICAib3V0ViIgOiA4LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiB7CisgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgInZhbHVlIiA6IDMKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMjMsCisgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICJpblYiIDogMTEsCisgICAgIm91dFYiIDogOCwKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAic2tpbGwiIDogeworICAgICAgICAia2V5IiA6ICJza2lsbCIsCisgICAgICAgICJ2YWx1ZSIgOiAzCisgICAgICB9CisgICAgfQorICB9LCB7CisgICAgImlkIiA6IDI0LAorICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAiaW5WIiA6IDEwLAorICAgICJvdXRWIiA6IDksCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAidmFsdWUiIDogNQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgICJpZCIgOiAyNSwKKyAgICAibGFiZWwiIDogInVzZXMiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgImluViIgOiAxMSwKKyAgICAib3V0ViIgOiA5LAorICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICJza2lsbCIgOiB7CisgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgInZhbHVlIiA6IDMKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICAiaWQiIDogMjYsCisgICAgImxhYmVsIiA6ICJ0cmF2ZXJzZXMiLAorICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICJvdXRWTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAiaW5WIiA6IDExLAorICAgICJvdXRWIiA6IDEwCisgIH0gXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdGlua2VyZ3JhcGgtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbmtlcmdyYXBoLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTk1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbmtlcmdyYXBoLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsODI5IEBACit7CisgICJAdHlwZSIgOiAidGlua2VyOmdyYXBoIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgInZlcnRpY2VzIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogIm1hcmtvIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJuYW1lIgorICAgICAgICAgICAgfQorICAgICAgICAgIH0gXSwKKyAgICAgICAgICAibG9jYXRpb24iIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDYKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTk5NworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogInNhbnRhIGNydXoiLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogOAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDkKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA3CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic3RlcGhlbiIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0sCisgICAgICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImNlbnRyZXZpbGxlIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE5OTAKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDExCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAiZHVsbGVzIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDAKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDEyCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAicHVyY2VsbHZpbGxlIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXgiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDgKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJtYXR0aGlhcyIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0sCisgICAgICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMworICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImJyZW1lbiIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA3CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxNAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImJhbHRpbW9yZSIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA3CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDExCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxNQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogIm9ha2xhbmQiLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAxMQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAxNAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTYKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzZWF0dGxlIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMTQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXgiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDkKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDMKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJkYW5pZWwiLAorICAgICAgICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdLAorICAgICAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTcKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzcHJlbWJlcmciLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTk4MgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTgKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJrYWlzZXJzbGF1dGVybiIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA1CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxOQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImFhY2hlbiIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMAorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA0CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAiZ3JlbWxpbiIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXgiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDExCisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDUKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJ0aW5rZXJncmFwaCIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gXSwKKyAgICAiZWRnZXMiIDogWyB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTMKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2luY2UiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDkKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxNAorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJpblYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICB9LAorICAgICAgICAib3V0ViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgICAgfSwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzaW5jZSIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJrZXkiIDogInNpbmNlIiwKKyAgICAgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAxMAorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDE1CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2tpbGwiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJza2lsbCIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDQKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxNgorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInVzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDExCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA1CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTcKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA3CisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2luY2UiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMTAKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxOAorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogImRldmVsb3BzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJpblYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICB9LAorICAgICAgICAib3V0ViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgfSwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJzaW5jZSIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJrZXkiIDogInNpbmNlIiwKKyAgICAgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAxMQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDE5CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA3CisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2tpbGwiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJza2lsbCIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDUKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAyMAorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInVzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDExCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA0CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMjEKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA4CisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2luY2UiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMTIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAyMgorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInVzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogOAorICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAzCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMjMKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJpblYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICB9LAorICAgICAgICAib3V0ViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDgKKyAgICAgICAgfSwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJza2lsbCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDI0CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA5CisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2tpbGwiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJza2lsbCIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDUKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAyNQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInVzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDExCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogOQorICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAzCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMjYKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJ0cmF2ZXJzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTEKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMAorICAgICAgICB9CisgICAgICB9CisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbmtlcmdyYXBoLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdGlua2VyZ3JhcGgtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTk1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RpbmtlcmdyYXBoLXYzZDAuanNvbgpAQCAtMCwwICsxLDgyOSBAQAoreworICAiQHR5cGUiIDogInRpbmtlcjpncmFwaCIsCisgICJAdmFsdWUiIDogeworICAgICJ2ZXJ0aWNlcyIgOiBbIHsKKyAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXgiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDAKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJtYXJrbyIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0sCisgICAgICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA2CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2FuIGRpZWdvIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE5OTcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDEKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDgKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJicnVzc2VscyIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA5CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2FudGEgZmUiLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gXQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogInN0ZXBoZW4iLAorICAgICAgICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdLAorICAgICAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJjZW50cmV2aWxsZSIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxOTkwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImR1bGxlcyIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDAwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA2CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMgorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogInB1cmNlbGx2aWxsZSIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA2CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA4CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAibWF0dGhpYXMiLAorICAgICAgICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdLAorICAgICAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTMKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJicmVtZW4iLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTQKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJiYWx0aW1vcmUiLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAxMQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTUKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJvYWtsYW5kIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMTEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMTQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE2CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2VhdHRsZSIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDE0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA5CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAzCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAiZGFuaWVsIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJuYW1lIgorICAgICAgICAgICAgfQorICAgICAgICAgIH0gXSwKKyAgICAgICAgICAibG9jYXRpb24iIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE3CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic3ByZW1iZXJnIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE5ODIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE4CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAia2Fpc2Vyc2xhdXRlcm4iLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwOQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTkKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJhYWNoZW4iLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwOQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gXQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogNAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImdyZW1saW4iLAorICAgICAgICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJuYW1lIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA1CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAidGlua2VyZ3JhcGgiLAorICAgICAgICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IF0sCisgICAgImVkZ2VzIiA6IFsgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEzCisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAiZGV2ZWxvcHMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNpbmNlIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2luY2UiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA5CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTQKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTEKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2luY2UiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMTAKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxNQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInVzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA0CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTYKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJpblYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICB9LAorICAgICAgICAib3V0ViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgICAgfSwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJza2lsbCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogNQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDE3CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAiZGV2ZWxvcHMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNpbmNlIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2luY2UiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDEwCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTgKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJkZXZlbG9wcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTEKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA3CisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2luY2UiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJzaW5jZSIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMTEKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxOQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInVzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA1CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMjAKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJpblYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICB9LAorICAgICAgICAib3V0ViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgfSwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJza2lsbCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogNAorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDIxCisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAiZGV2ZWxvcHMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogOAorICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNpbmNlIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2luY2UiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDEyCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMjIKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJpblYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMAorICAgICAgICB9LAorICAgICAgICAib3V0ViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDgKKyAgICAgICAgfSwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJza2lsbCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDIzCisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAidXNlcyIsCisgICAgICAgICJpblZMYWJlbCIgOiAic29mdHdhcmUiLAorICAgICAgICAib3V0VkxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAiaW5WIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTEKKyAgICAgICAgfSwKKyAgICAgICAgIm91dFYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiA4CisgICAgICAgIH0sCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAic2tpbGwiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAia2V5IiA6ICJza2lsbCIsCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDMKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpFZGdlIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiaWQiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAyNAorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInVzZXMiLAorICAgICAgICAiaW5WTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgIm91dFZMYWJlbCIgOiAicGVyc29uIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogOQorICAgICAgICB9LAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgInNraWxsIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImtleSIgOiAic2tpbGwiLAorICAgICAgICAgICAgICAidmFsdWUiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA1CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6RWRnZSIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMjUKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJ1c2VzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJpblYiIDogeworICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMQorICAgICAgICB9LAorICAgICAgICAib3V0ViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDkKKyAgICAgICAgfSwKKyAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICJza2lsbCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJrZXkiIDogInNraWxsIiwKKyAgICAgICAgICAgICAgInZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAgIkB0eXBlIiA6ICJnOkVkZ2UiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDI2CisgICAgICAgIH0sCisgICAgICAgICJsYWJlbCIgOiAidHJhdmVyc2VzIiwKKyAgICAgICAgImluVkxhYmVsIiA6ICJzb2Z0d2FyZSIsCisgICAgICAgICJvdXRWTGFiZWwiIDogInNvZnR3YXJlIiwKKyAgICAgICAgImluViIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDExCisgICAgICAgIH0sCisgICAgICAgICJvdXRWIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMTAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gXQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90cmF2ZXJzYWxtZXRyaWNzLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90cmF2ZXJzYWxtZXRyaWNzLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDE4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwxMTQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlRyYXZlcnNhbE1ldHJpY3MiLAorICAiQHZhbHVlIiA6IHsKKyAgICAiZHVyIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgIkB2YWx1ZSIgOiAwLjAwNAorICAgIH0sCisgICAgIm1ldHJpY3MiIDogWyB7CisgICAgICAiQHR5cGUiIDogImc6TWV0cmljcyIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImR1ciIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkRvdWJsZSIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMDAuMAorICAgICAgICB9LAorICAgICAgICAiY291bnRzIiA6IHsKKyAgICAgICAgICAidHJhdmVyc2VyQ291bnQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogNAorICAgICAgICAgIH0sCisgICAgICAgICAgImVsZW1lbnRDb3VudCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiA0CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibmFtZSIgOiAiVGlua2VyR3JhcGhTdGVwKHZlcnRleCxbfmxhYmVsLmVxKHBlcnNvbildKSIsCisgICAgICAgICJhbm5vdGF0aW9ucyIgOiB7CisgICAgICAgICAgInBlcmNlbnREdXIiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkRvdWJsZSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDI1LjAKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpZCIgOiAiNy4wLjAoKSIKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiQHR5cGUiIDogImc6TWV0cmljcyIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImR1ciIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkRvdWJsZSIsCisgICAgICAgICAgIkB2YWx1ZSIgOiAxMDAuMAorICAgICAgICB9LAorICAgICAgICAiY291bnRzIiA6IHsKKyAgICAgICAgICAidHJhdmVyc2VyQ291bnQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMTMKKyAgICAgICAgICB9LAorICAgICAgICAgICJlbGVtZW50Q291bnQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMTMKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJuYW1lIiA6ICJWZXJ0ZXhTdGVwKE9VVCx2ZXJ0ZXgpIiwKKyAgICAgICAgImFubm90YXRpb25zIiA6IHsKKyAgICAgICAgICAicGVyY2VudER1ciIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMjUuMAorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlkIiA6ICIyLjAuMCgpIgorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpNZXRyaWNzIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiZHVyIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwMC4wCisgICAgICAgIH0sCisgICAgICAgICJjb3VudHMiIDogeworICAgICAgICAgICJ0cmF2ZXJzZXJDb3VudCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiA3CisgICAgICAgICAgfSwKKyAgICAgICAgICAiZWxlbWVudENvdW50IiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJuYW1lIiA6ICJWZXJ0ZXhTdGVwKE9VVCx2ZXJ0ZXgpIiwKKyAgICAgICAgImFubm90YXRpb25zIiA6IHsKKyAgICAgICAgICAicGVyY2VudER1ciIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMjUuMAorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlkIiA6ICIzLjAuMCgpIgorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJAdHlwZSIgOiAiZzpNZXRyaWNzIiwKKyAgICAgICJAdmFsdWUiIDogeworICAgICAgICAiZHVyIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEwMC4wCisgICAgICAgIH0sCisgICAgICAgICJjb3VudHMiIDogeworICAgICAgICAgICJ0cmF2ZXJzZXJDb3VudCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZWxlbWVudENvdW50IiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJuYW1lIiA6ICJUcmVlU3RlcCIsCisgICAgICAgICJhbm5vdGF0aW9ucyIgOiB7CisgICAgICAgICAgInBlcmNlbnREdXIiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkRvdWJsZSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDI1LjAKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpZCIgOiAiNC4wLjAoKSIKKyAgICAgIH0KKyAgICB9IF0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdHJhdmVyc2FsbWV0cmljcy12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Zjc2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjNkMC5qc29uCkBAIC0wLDAgKzEsMTA5IEBACit7CisgICJAdHlwZSIgOiAiZzpUcmF2ZXJzYWxNZXRyaWNzIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgIkB2YWx1ZSIgOiBbICJkdXIiLCB7CisgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICJAdmFsdWUiIDogMC4wMDQKKyAgICB9LCAibWV0cmljcyIsIHsKKyAgICAgICJAdHlwZSIgOiAiZzpMaXN0IiwKKyAgICAgICJAdmFsdWUiIDogWyB7CisgICAgICAgICJAdHlwZSIgOiAiZzpNZXRyaWNzIiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAgICAgIkB2YWx1ZSIgOiBbICJkdXIiLCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMTAwLjAKKyAgICAgICAgICB9LCAiY291bnRzIiwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IFsgInRyYXZlcnNlckNvdW50IiwgeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDQKKyAgICAgICAgICAgIH0sICJlbGVtZW50Q291bnQiLCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogNAorICAgICAgICAgICAgfSBdCisgICAgICAgICAgfSwgIm5hbWUiLCAiVGlua2VyR3JhcGhTdGVwKHZlcnRleCxbfmxhYmVsLmVxKHBlcnNvbildKSIsICJhbm5vdGF0aW9ucyIsIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpNYXAiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiBbICJwZXJjZW50RHVyIiwgeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyNS4wCisgICAgICAgICAgICB9IF0KKyAgICAgICAgICB9LCAiaWQiLCAiNy4wLjAoKSIgXQorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpNZXRyaWNzIiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAgICAgIkB2YWx1ZSIgOiBbICJkdXIiLCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogMTAwLjAKKyAgICAgICAgICB9LCAiY291bnRzIiwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IFsgInRyYXZlcnNlckNvdW50IiwgeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDEzCisgICAgICAgICAgICB9LCAiZWxlbWVudENvdW50IiwgeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDEzCisgICAgICAgICAgICB9IF0KKyAgICAgICAgICB9LCAibmFtZSIsICJWZXJ0ZXhTdGVwKE9VVCx2ZXJ0ZXgpIiwgImFubm90YXRpb25zIiwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IFsgInBlcmNlbnREdXIiLCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDI1LjAKKyAgICAgICAgICAgIH0gXQorICAgICAgICAgIH0sICJpZCIsICIyLjAuMCgpIiBdCisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOk1ldHJpY3MiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IFsgImR1ciIsIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMDAuMAorICAgICAgICAgIH0sICJjb3VudHMiLCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogWyAidHJhdmVyc2VyQ291bnQiLCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICAgICAgfSwgImVsZW1lbnRDb3VudCIsIHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA3CisgICAgICAgICAgICB9IF0KKyAgICAgICAgICB9LCAibmFtZSIsICJWZXJ0ZXhTdGVwKE9VVCx2ZXJ0ZXgpIiwgImFubm90YXRpb25zIiwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOk1hcCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IFsgInBlcmNlbnREdXIiLCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDI1LjAKKyAgICAgICAgICAgIH0gXQorICAgICAgICAgIH0sICJpZCIsICIzLjAuMCgpIiBdCisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOk1ldHJpY3MiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IFsgImR1ciIsIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpEb3VibGUiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAxMDAuMAorICAgICAgICAgIH0sICJjb3VudHMiLCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6TWFwIiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogWyAidHJhdmVyc2VyQ291bnQiLCB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICAgICAgfSwgImVsZW1lbnRDb3VudCIsIHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxCisgICAgICAgICAgICB9IF0KKyAgICAgICAgICB9LCAibmFtZSIsICJUcmVlU3RlcCIsICJhbm5vdGF0aW9ucyIsIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpNYXAiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiBbICJwZXJjZW50RHVyIiwgeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6RG91YmxlIiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyNS4wCisgICAgICAgICAgICB9IF0KKyAgICAgICAgICB9LCAiaWQiLCAiNC4wLjAoKSIgXQorICAgICAgICB9CisgICAgICB9IF0KKyAgICB9IF0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdHJhdmVyc2VyLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC90cmF2ZXJzZXItdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5YTI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdHJhdmVyc2VyLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsMTA5IEBACit7CisgICJAdHlwZSIgOiAiZzpUcmF2ZXJzZXIiLAorICAiQHZhbHVlIiA6IHsKKyAgICAiYnVsayIgOiB7CisgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgIkB2YWx1ZSIgOiAxCisgICAgfSwKKyAgICAidmFsdWUiIDogeworICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICJAdmFsdWUiIDogMQorICAgICAgICB9LAorICAgICAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogIm1hcmtvIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJuYW1lIgorICAgICAgICAgICAgfQorICAgICAgICAgIH0gXSwKKyAgICAgICAgICAibG9jYXRpb24iIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDYKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMTk5NworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogInNhbnRhIGNydXoiLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgICAgICJAdmFsdWUiIDogOAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDkKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBdCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RyYXZlcnNlci12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3RyYXZlcnNlci12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5YTI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdHJhdmVyc2VyLXYzZDAuanNvbgpAQCAtMCwwICsxLDEwOSBAQAoreworICAiQHR5cGUiIDogImc6VHJhdmVyc2VyIiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgImJ1bGsiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICJAdmFsdWUiIDogMQorICAgIH0sCisgICAgInZhbHVlIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXgiLAorICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAiQHZhbHVlIiA6IDEKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVsIiA6ICJwZXJzb24iLAorICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDAKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJtYXJrbyIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IF0sCisgICAgICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA2CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2FuIGRpZWdvIiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE5OTcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDEKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICAgICAiQHZhbHVlIiA6IDgKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgInZhbHVlIiA6ICJicnVzc2VscyIsCisgICAgICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAgICAgIkB2YWx1ZSIgOiA5CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJ2YWx1ZSIgOiAic2FudGEgZmUiLAorICAgICAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gXQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC91dWlkLXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdXVpZC12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZmY5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdXVpZC12MmQwLW5vLXR5cGVzLmpzb24KQEAgLTAsMCArMSBAQAorIjQxZDJlMjhhLTIwYTQtNGFiMC1iMzc5LWQ4MTBkZWRlMzc4NiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3V1aWQtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3V1aWQtdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmMDlmMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdXVpZC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlVVSUQiLAorICAiQHZhbHVlIiA6ICI0MWQyZTI4YS0yMGE0LTRhYjAtYjM3OS1kODEwZGVkZTM3ODYiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC91dWlkLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdXVpZC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmMDlmMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdXVpZC12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZzpVVUlEIiwKKyAgIkB2YWx1ZSIgOiAiNDFkMmUyOGEtMjBhNC00YWIwLWIzNzktZDgxMGRlZGUzNzg2IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4LXYxZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4LXYxZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg1ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC92ZXJ0ZXgtdjFkMC5qc29uCkBAIC0wLDAgKzEsMzkgQEAKK3sKKyAgImlkIiA6IDEsCisgICJsYWJlbCIgOiAicGVyc29uIiwKKyAgInR5cGUiIDogInZlcnRleCIsCisgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAibmFtZSIgOiBbIHsKKyAgICAgICJpZCIgOiAwLAorICAgICAgInZhbHVlIiA6ICJtYXJrbyIKKyAgICB9IF0sCisgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgImlkIiA6IDYsCisgICAgICAidmFsdWUiIDogInNhbiBkaWVnbyIsCisgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICJzdGFydFRpbWUiIDogMTk5NywKKyAgICAgICAgImVuZFRpbWUiIDogMjAwMQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJpZCIgOiA3LAorICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgInN0YXJ0VGltZSIgOiAyMDAxLAorICAgICAgICAiZW5kVGltZSIgOiAyMDA0CisgICAgICB9CisgICAgfSwgeworICAgICAgImlkIiA6IDgsCisgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA0LAorICAgICAgICAiZW5kVGltZSIgOiAyMDA1CisgICAgICB9CisgICAgfSwgeworICAgICAgImlkIiA6IDksCisgICAgICAidmFsdWUiIDogInNhbnRhIGZlIiwKKyAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA1CisgICAgICB9CisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleC12MmQwLW5vLXR5cGVzLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleC12MmQwLW5vLXR5cGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4LXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDQzIEBACit7CisgICJpZCIgOiAxLAorICAibGFiZWwiIDogInBlcnNvbiIsCisgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAibmFtZSIgOiBbIHsKKyAgICAgICJpZCIgOiAwLAorICAgICAgInZhbHVlIiA6ICJtYXJrbyIsCisgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgfSBdLAorICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICJpZCIgOiA2LAorICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICJzdGFydFRpbWUiIDogMTk5NywKKyAgICAgICAgImVuZFRpbWUiIDogMjAwMQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJpZCIgOiA3LAorICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAic3RhcnRUaW1lIiA6IDIwMDEsCisgICAgICAgICJlbmRUaW1lIiA6IDIwMDQKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICAiaWQiIDogOCwKKyAgICAgICJ2YWx1ZSIgOiAiYnJ1c3NlbHMiLAorICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICJzdGFydFRpbWUiIDogMjAwNCwKKyAgICAgICAgImVuZFRpbWUiIDogMjAwNQorICAgICAgfQorICAgIH0sIHsKKyAgICAgICJpZCIgOiA5LAorICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgInN0YXJ0VGltZSIgOiAyMDA1CisgICAgICB9CisgICAgfSBdCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4LXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDIyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleC12MmQwLXBhcnRpYWwuanNvbgpAQCAtMCwwICsxLDEwMCBAQAoreworICAiQHR5cGUiIDogImc6VmVydGV4IiwKKyAgIkB2YWx1ZSIgOiB7CisgICAgImlkIiA6IHsKKyAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAiQHZhbHVlIiA6IDEKKyAgICB9LAorICAgICJsYWJlbCIgOiAicGVyc29uIiwKKyAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAibmFtZSIgOiBbIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDAKKyAgICAgICAgICB9LAorICAgICAgICAgICJ2YWx1ZSIgOiAibWFya28iLAorICAgICAgICAgICJsYWJlbCIgOiAibmFtZSIKKyAgICAgICAgfQorICAgICAgfSBdLAorICAgICAgImxvY2F0aW9uIiA6IFsgeworICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogNgorICAgICAgICAgIH0sCisgICAgICAgICAgInZhbHVlIiA6ICJzYW4gZGllZ28iLAorICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDE5OTcKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogNworICAgICAgICAgIH0sCisgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBjcnV6IiwKKyAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDgKKyAgICAgICAgICB9LAorICAgICAgICAgICJ2YWx1ZSIgOiAiYnJ1c3NlbHMiLAorICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZW5kVGltZSIgOiB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAgICAgICAiQHZhbHVlIiA6IHsKKyAgICAgICAgICAiaWQiIDogeworICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICAgICAgICJAdmFsdWUiIDogOQorICAgICAgICAgIH0sCisgICAgICAgICAgInZhbHVlIiA6ICJzYW50YSBmZSIsCisgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwNQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBdCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC92ZXJ0ZXgtdjNkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC92ZXJ0ZXgtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDIyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleC12M2QwLmpzb24KQEAgLTAsMCArMSwxMDAgQEAKK3sKKyAgIkB0eXBlIiA6ICJnOlZlcnRleCIsCisgICJAdmFsdWUiIDogeworICAgICJpZCIgOiB7CisgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgIkB2YWx1ZSIgOiAxCisgICAgfSwKKyAgICAibGFiZWwiIDogInBlcnNvbiIsCisgICAgInByb3BlcnRpZXMiIDogeworICAgICAgIm5hbWUiIDogWyB7CisgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiAwCisgICAgICAgICAgfSwKKyAgICAgICAgICAidmFsdWUiIDogIm1hcmtvIiwKKyAgICAgICAgICAibGFiZWwiIDogIm5hbWUiCisgICAgICAgIH0KKyAgICAgIH0gXSwKKyAgICAgICJsb2NhdGlvbiIgOiBbIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDYKKyAgICAgICAgICB9LAorICAgICAgICAgICJ2YWx1ZSIgOiAic2FuIGRpZWdvIiwKKyAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAxOTk3CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDEKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDcKKyAgICAgICAgICB9LAorICAgICAgICAgICJ2YWx1ZSIgOiAic2FudGEgY3J1eiIsCisgICAgICAgICAgImxhYmVsIiA6ICJsb2NhdGlvbiIsCisgICAgICAgICAgInByb3BlcnRpZXMiIDogeworICAgICAgICAgICAgInN0YXJ0VGltZSIgOiB7CisgICAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQzMiIsCisgICAgICAgICAgICAgICJAdmFsdWUiIDogMjAwMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJlbmRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA0CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LCB7CisgICAgICAgICJAdHlwZSIgOiAiZzpWZXJ0ZXhQcm9wZXJ0eSIsCisgICAgICAgICJAdmFsdWUiIDogeworICAgICAgICAgICJpZCIgOiB7CisgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50NjQiLAorICAgICAgICAgICAgIkB2YWx1ZSIgOiA4CisgICAgICAgICAgfSwKKyAgICAgICAgICAidmFsdWUiIDogImJydXNzZWxzIiwKKyAgICAgICAgICAibGFiZWwiIDogImxvY2F0aW9uIiwKKyAgICAgICAgICAicHJvcGVydGllcyIgOiB7CisgICAgICAgICAgICAic3RhcnRUaW1lIiA6IHsKKyAgICAgICAgICAgICAgIkB0eXBlIiA6ICJnOkludDMyIiwKKyAgICAgICAgICAgICAgIkB2YWx1ZSIgOiAyMDA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImVuZFRpbWUiIDogeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIHsKKyAgICAgICAgIkB0eXBlIiA6ICJnOlZlcnRleFByb3BlcnR5IiwKKyAgICAgICAgIkB2YWx1ZSIgOiB7CisgICAgICAgICAgImlkIiA6IHsKKyAgICAgICAgICAgICJAdHlwZSIgOiAiZzpJbnQ2NCIsCisgICAgICAgICAgICAiQHZhbHVlIiA6IDkKKyAgICAgICAgICB9LAorICAgICAgICAgICJ2YWx1ZSIgOiAic2FudGEgZmUiLAorICAgICAgICAgICJsYWJlbCIgOiAibG9jYXRpb24iLAorICAgICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgICAgICJzdGFydFRpbWUiIDogeworICAgICAgICAgICAgICAiQHR5cGUiIDogImc6SW50MzIiLAorICAgICAgICAgICAgICAiQHZhbHVlIiA6IDIwMDUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gXQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4cHJvcGVydHktdjFkMC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC92ZXJ0ZXhwcm9wZXJ0eS12MWQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwMjVhOAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4cHJvcGVydHktdjFkMC5qc29uCkBAIC0wLDAgKzEsNSBAQAoreworICAiaWQiIDogMCwKKyAgInZhbHVlIiA6ICJtYXJrbyIsCisgICJsYWJlbCIgOiAibmFtZSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleHByb3BlcnR5LXYyZDAtbm8tdHlwZXMuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4cHJvcGVydHktdjJkMC1uby10eXBlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDI1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleHByb3BlcnR5LXYyZDAtbm8tdHlwZXMuanNvbgpAQCAtMCwwICsxLDUgQEAKK3sKKyAgImlkIiA6IDAsCisgICJ2YWx1ZSIgOiAibWFya28iLAorICAibGFiZWwiIDogIm5hbWUiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC92ZXJ0ZXhwcm9wZXJ0eS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4cHJvcGVydHktdjJkMC1wYXJ0aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxODRiMQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvdmVydGV4cHJvcGVydHktdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAiQHZhbHVlIiA6IHsKKyAgICAiaWQiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICJAdmFsdWUiIDogMAorICAgIH0sCisgICAgInZhbHVlIiA6ICJtYXJrbyIsCisgICAgImxhYmVsIiA6ICJuYW1lIgorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC92ZXJ0ZXhwcm9wZXJ0eS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3ZlcnRleHByb3BlcnR5LXYzZDAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjE4NGIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC92ZXJ0ZXhwcm9wZXJ0eS12M2QwLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAiQHR5cGUiIDogImc6VmVydGV4UHJvcGVydHkiLAorICAiQHZhbHVlIiA6IHsKKyAgICAiaWQiIDogeworICAgICAgIkB0eXBlIiA6ICJnOkludDY0IiwKKyAgICAgICJAdmFsdWUiIDogMAorICAgIH0sCisgICAgInZhbHVlIiA6ICJtYXJrbyIsCisgICAgImxhYmVsIiA6ICJuYW1lIgorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC95ZWFyLXYyZDAtcGFydGlhbC5qc29uIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC95ZWFyLXYyZDAtcGFydGlhbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDIwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3llYXItdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6WWVhciIsCisgICJAdmFsdWUiIDogIjIwMTYiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC95ZWFyLXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAveWVhci12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MjBiYwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAveWVhci12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6WWVhciIsCisgICJAdmFsdWUiIDogIjIwMTYiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC95ZWFybW9udGgtdjJkMC1wYXJ0aWFsLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3llYXJtb250aC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE1ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC95ZWFybW9udGgtdjJkMC1wYXJ0aWFsLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6WWVhck1vbnRoIiwKKyAgIkB2YWx1ZSIgOiAiMjAxNi0wNiIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3llYXJtb250aC12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3llYXJtb250aC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNWUyNwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAveWVhcm1vbnRoLXYzZDAuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIkB0eXBlIiA6ICJneDpZZWFyTW9udGgiLAorICAiQHZhbHVlIiA6ICIyMDE2LTA2IgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvem9uZWRkYXRldGltZS12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvem9uZWRkYXRldGltZS12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdmYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC96b25lZGRhdGV0aW1lLXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OlpvbmVkRGF0ZVRpbWUiLAorICAiQHZhbHVlIiA6ICIyMDE2LTEyLTIzVDEyOjEyOjI0LjAwMDAwMDAzNiswMjowMFtHTVQrMDI6MDBdIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvem9uZWRkYXRldGltZS12M2QwLmpzb24gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3pvbmVkZGF0ZXRpbWUtdjNkMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2N2ZjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vXzNfNV8wL3pvbmVkZGF0ZXRpbWUtdjNkMC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OlpvbmVkRGF0ZVRpbWUiLAorICAiQHZhbHVlIiA6ICIyMDE2LTEyLTIzVDEyOjEyOjI0LjAwMDAwMDAzNiswMjowMFtHTVQrMDI6MDBdIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvem9uZW9mZnNldC12MmQwLXBhcnRpYWwuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvem9uZW9mZnNldC12MmQwLXBhcnRpYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTkxNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC96b25lb2Zmc2V0LXYyZDAtcGFydGlhbC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAiQHR5cGUiIDogImd4OlpvbmVPZmZzZXQiLAorICAiQHZhbHVlIiA6ICIrMDM6MDY6MDkiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyYXBoc29uL18zXzVfMC96b25lb2Zmc2V0LXYzZDAuanNvbiBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvem9uZW9mZnNldC12M2QwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5MTc5NAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9fM181XzAvem9uZW9mZnNldC12M2QwLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJAdHlwZSIgOiAiZ3g6Wm9uZU9mZnNldCIsCisgICJAdmFsdWUiIDogIiswMzowNjowOSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYXV0aGVudGljYXRpb25jaGFsbGVuZ2UtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2F1dGhlbnRpY2F0aW9uY2hhbGxlbmdlLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY5MWFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2F1dGhlbnRpY2F0aW9uY2hhbGxlbmdlLXYzZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYXV0aGVudGljYXRpb25yZXNwb25zZS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYXV0aGVudGljYXRpb25yZXNwb25zZS12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5OWYyYQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9hdXRoZW50aWNhdGlvbnJlc3BvbnNlLXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBActoJXidkkSZnrxcaqc8U5eBYXV0aGVudGljYXRpb+4BAgMBc2FzbE1lY2hhbmlz7QMBUExBSc4DAXNhc+wDAUFITjBaWEJvY0dobGJnQndZWE56ZDI5eVpBPb0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmFycmllci12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmFycmllci12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9iYXJyaWVyLXYxZDAua3J5bwpAQCAtMCwwICsxIEBACisBAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9iYXJyaWVyLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9iYXJyaWVyLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGZkZWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JhcnJpZXItdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpZ2RlY2ltYWwtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpZ2RlY2ltYWwtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjQwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmlnZGVjaW1hbC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpZ2RlY2ltYWwtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpZ2RlY2ltYWwtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjQwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmlnZGVjaW1hbC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpZ2ludGVnZXItdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpZ2ludGVnZXItdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjRhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmlnaW50ZWdlci12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorARAXxuPC/dGCWs99AkR2+rEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmlnaW50ZWdlci12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmlnaW50ZWdlci12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyNGFjNgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9iaWdpbnRlZ2VyLXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBEBfG48L90YJaz30CRHb6sQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9iaW5kaW5nLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9iaW5kaW5nLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDMxNDNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpbmRpbmctdjFkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwGCeAICClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpbmRpbmctdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2JpbmRpbmctdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMzE0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYmluZGluZy12M2QwLmtyeW8KQEAgLTAsMCArMSBAQAorAYJ4AgIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnVsa3NldC12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnVsa3NldC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkYTI3YQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9idWxrc2V0LXYxZDAua3J5bwpAQCAtMCwwICsxIEBACisBAwMBbWFya+8DAWpvc+gDBApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9idWxrc2V0LXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9idWxrc2V0LXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmRhMjdhCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J1bGtzZXQtdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEDAwFtYXJr7wMBam9z6AMEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J5dGUtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J5dGUtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmFhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnl0ZS12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9ieXRlLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9ieXRlLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjJhYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J5dGUtdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnl0ZWJ1ZmZlci12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnl0ZWJ1ZmZlci12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5NGI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9ieXRlYnVmZmVyLXYxZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnl0ZWJ1ZmZlci12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnl0ZWJ1ZmZlci12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5NGI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9ieXRlYnVmZmVyLXYzZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnl0ZWNvZGUtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J5dGVjb2RlLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGY4ZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J5dGVjb2RlLXYxZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvYnl0ZWNvZGUtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J5dGVjb2RlLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGY4ZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2J5dGVjb2RlLXYzZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY2FyZGluYWxpdHktdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NhcmRpbmFsaXR5LXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJkNjNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NhcmRpbmFsaXR5LXYxZDAua3J5bwpAQCAtMCwwICsxIEBACisBAgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9jYXJkaW5hbGl0eS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY2FyZGluYWxpdHktdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmQ2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY2FyZGluYWxpdHktdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwECClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NoYXItdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NoYXItdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxODg4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY2hhci12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NoYXItdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NoYXItdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxODg4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY2hhci12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NsYXNzLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9jbGFzcy12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiNjVhZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9jbGFzcy12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAWphdmEuaW8uRmls5QpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9jbGFzcy12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY2xhc3MtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjY1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY2xhc3MtdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwFqYXZhLmlvLkZpbOUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY29sdW1uLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9jb2x1bW4tdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmRlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvY29sdW1uLXYxZDAua3J5bwpAQCAtMCwwICsxIEBACisBAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9jb2x1bW4tdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2NvbHVtbi12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9jb2x1bW4tdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RhdGUtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RhdGUtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmY5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvZGF0ZS12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAYe3v/mPKwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kYXRlLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kYXRlLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODZmOThmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RhdGUtdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwGHt7/5jysKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvZGlyZWN0aW9uLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kaXJlY3Rpb24tdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmRlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvZGlyZWN0aW9uLXYxZDAua3J5bwpAQCAtMCwwICsxIEBACisBAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kaXJlY3Rpb24tdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RpcmVjdGlvbi12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kaXJlY3Rpb24tdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RvdWJsZS12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvZG91YmxlLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUwNmFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RvdWJsZS12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RvdWJsZS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvZG91YmxlLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUwNmFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2RvdWJsZS12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2R1cmF0aW9uLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kdXJhdGlvbi12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0MGFlMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kdXJhdGlvbi12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2R1cmF0aW9uLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kdXJhdGlvbi12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0MGFlMAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9kdXJhdGlvbi12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2VkZ2UtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2VkZ2UtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTI0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvZWRnZS12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2VkZ2UtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2VkZ2UtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZmJlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvZWRnZS12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2Zsb2F0LXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9mbG9hdC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhODg2NQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9mbG9hdC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2Zsb2F0LXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9mbG9hdC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhODg2NQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9mbG9hdC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2luZXRhZGRyZXNzLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbmV0YWRkcmVzcy12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3OTdhNQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbmV0YWRkcmVzcy12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAWxvY2FsaG9z9ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbmV0YWRkcmVzcy12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW5ldGFkZHJlc3MtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzk3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW5ldGFkZHJlc3MtdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwFsb2NhbGhvc/QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW5zdGFudC12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW5zdGFudC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0NjZjZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbnN0YW50LXYxZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW5zdGFudC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW5zdGFudC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0NjZjZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbnN0YW50LXYzZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW50ZWdlci12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvaW50ZWdlci12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyODMzNgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbnRlZ2VyLXYxZDAua3J5bwpAQCAtMCwwICsxIEBACivIAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbnRlZ2VyLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9pbnRlZ2VyLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjI4MzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2ludGVnZXItdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKK8gBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xhbWJkYS12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbGFtYmRhLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM2NjFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xhbWJkYS12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xhbWJkYS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbGFtYmRhLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM2NjFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xhbWJkYS12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZS12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9jYWxkYXRlLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJkZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZS12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9jYWxkYXRlLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJkZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZS12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWFlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9jYWxkYXRldGltZS12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsZGF0ZXRpbWUtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWFlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9jYWxkYXRldGltZS12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsdGltZS12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9jYWx0aW1lLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjViZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsdGltZS12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsdGltZS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9jYWx0aW1lLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjViZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvY2FsdGltZS12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvbmctdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL2xvbmctdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjgzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9uZy12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAoryAEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9uZy12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbG9uZy12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyODMzNgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9sb25nLXYzZDAua3J5bwpAQCAtMCwwICsxIEBACivIAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9tZXRyaWNzLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9tZXRyaWNzLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRjZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL21ldHJpY3MtdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9tZXRyaWNzLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9tZXRyaWNzLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkZDYzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL21ldHJpY3MtdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9tb250aGRheS12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbW9udGhkYXktdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2FiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbW9udGhkYXktdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9tb250aGRheS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbW9udGhkYXktdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2FiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvbW9udGhkYXktdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vZmZzZXRkYXRldGltZS12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb2Zmc2V0ZGF0ZXRpbWUtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjkyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb2Zmc2V0ZGF0ZXRpbWUtdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vZmZzZXRkYXRldGltZS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb2Zmc2V0ZGF0ZXRpbWUtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjkyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb2Zmc2V0ZGF0ZXRpbWUtdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vZmZzZXR0aW1lLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vZmZzZXR0aW1lLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYyMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL29mZnNldHRpbWUtdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vZmZzZXR0aW1lLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vZmZzZXR0aW1lLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYyMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL29mZnNldHRpbWUtdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vcGVyYXRvci12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb3BlcmF0b3ItdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmRlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb3BlcmF0b3ItdjFkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL29wZXJhdG9yLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vcGVyYXRvci12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vcGVyYXRvci12M2QwLmtyeW8KQEAgLTAsMCArMSBAQAorAQEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb3JkZXItdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL29yZGVyLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGZkZWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL29yZGVyLXYxZDAua3J5bwpAQCAtMCwwICsxIEBACisBAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9vcmRlci12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb3JkZXItdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmRlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvb3JkZXItdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3AtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3AtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjc2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3AtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3AtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjc2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhbmQtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhbmQtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzdlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGFuZC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhbmQtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhbmQtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzdlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGFuZC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhdGgtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhdGgtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzIwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGF0aC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhdGgtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BhdGgtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzIwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGF0aC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BlcmlvZC12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGVyaW9kLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDRlOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BlcmlvZC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BlcmlvZC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGVyaW9kLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDRlOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BlcmlvZC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BpY2stdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BpY2stdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmRlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGljay12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAQEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGljay12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcGljay12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9waWNrLXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wb3AtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BvcC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjNzgxMQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wb3AtdjFkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BvcC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcG9wLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM3ODExCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3BvcC12M2QwLmtyeW8KQEAgLTAsMCArMSBAQAorAQMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcG9yLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wb3ItdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGViYjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcG9yLXYxZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcG9yLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wb3ItdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGViYjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcG9yLXYzZDAua3J5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcHJvcGVydHktdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Byb3BlcnR5LXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNhYzZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Byb3BlcnR5LXYxZDAua3J5bwpAQCAtMCwwICsxIEBACisBFAEBc2luY+UCsh8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcHJvcGVydHktdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Byb3BlcnR5LXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Q5YzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Byb3BlcnR5LXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBc2luY+UCsh8CGmRldmVsb3DzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3B3aXRoaW4tdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3B3aXRoaW4tdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGZlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcHdpdGhpbi12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3B3aXRoaW4tdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3B3aXRoaW4tdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGZlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvcHdpdGhpbi12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3B3aXRob3V0LXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wd2l0aG91dC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmMTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wd2l0aG91dC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3B3aXRob3V0LXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wd2l0aG91dC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmMTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9wd2l0aG91dC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Njb3BlLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zY29wZS12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiZDYzZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zY29wZS12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAQIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvc2NvcGUtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Njb3BlLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJkNjNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Njb3BlLXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBAgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zZXNzaW9uY2xvc2UtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25jbG9zZS12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhZDZhMQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zZXNzaW9uY2xvc2UtdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwEBy2gleJ2SRJmevFxqpzxTl3Nlc3Npb+5jbG9z5QEBAwFzZXNzaW/uAwF1bmlxdWUtc2Vzc2lvbi1pZGVudGlmaWXyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25ldmFsLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zZXNzaW9uZXZhbC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1MWI5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zZXNzaW9uZXZhbC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25ldmFsYWxpYXNlZC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvc2Vzc2lvbmV2YWxhbGlhc2VkLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI1ODg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25ldmFsYWxpYXNlZC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvc2Vzc2lvbmxlc3NldmFsLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDg0ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbGFsaWFzZWQtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nlc3Npb25sZXNzZXZhbGFsaWFzZWQtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzQ1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvc2Vzc2lvbmxlc3NldmFsYWxpYXNlZC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nob3J0LXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zaG9ydC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2MGI4OQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zaG9ydC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3Nob3J0LXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zaG9ydC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2MGI4OQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zaG9ydC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3N0YW5kYXJkcmVzdWx0LXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zdGFuZGFyZHJlc3VsdC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNWQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC9zdGFuZGFyZHJlc3VsdC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3N0YXJncmFwaC12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvc3RhcmdyYXBoLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ3ODQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3N0YXJncmFwaC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3N0YXJncmFwaC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvc3RhcmdyYXBoLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ3ODQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3N0YXJncmFwaC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3QtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3QtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmRlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdC12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAQEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90LXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBAQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90ZXh0cC12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdGV4dHAtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWViMGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdGV4dHAtdjFkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwFjb250YWluaW7nAWFy6wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90ZXh0cC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdGV4dHAtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWViMGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdGV4dHAtdjNkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwFjb250YWluaW7nAWFy6wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90aW1lc3RhbXAtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RpbWVzdGFtcC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2Zjk4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90aW1lc3RhbXAtdjFkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwGHt7/5jysKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdGltZXN0YW1wLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90aW1lc3RhbXAtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmY5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdGltZXN0YW1wLXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBh7e/+Y8rClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RpbmtlcmdyYXBoLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90aW5rZXJncmFwaC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc4OTk4NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90aW5rZXJncmFwaC12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RpbmtlcmdyYXBoLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90aW5rZXJncmFwaC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc4OTk4NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC90aW5rZXJncmFwaC12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjhiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdHJhdmVyc2FsbWV0cmljcy12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNhbG1ldHJpY3MtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzQ0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdHJhdmVyc2FsbWV0cmljcy12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNlci12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdHJhdmVyc2VyLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzAxOWYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNlci12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNlci12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdHJhdmVyc2VyLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFmYjBkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyYXZlcnNlci12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyZWUtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyZWUtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjUyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdHJlZS12MWQwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyZWUtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3RyZWUtdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTlkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdHJlZS12M2QwLmtyeW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3V1aWQtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3V1aWQtdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmMzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdXVpZC12MWQwLmtyeW8KQEAgLTAsMCArMSBAQAorAUHS4oogpEqws3nYEN7eN4YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdXVpZC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdXVpZC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmYzM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC91dWlkLXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBQdLiiiCkSrCzedgQ3t43hgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC92ZXJ0ZXgtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3ZlcnRleC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4YWM0NgotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC92ZXJ0ZXgtdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC92ZXJ0ZXgtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3ZlcnRleC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2NDAzOQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC92ZXJ0ZXgtdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC92ZXJ0ZXhwcm9wZXJ0eS12MWQwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdmVydGV4cHJvcGVydHktdjFkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzRkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdmVydGV4cHJvcGVydHktdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC92ZXJ0ZXhwcm9wZXJ0eS12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdmVydGV4cHJvcGVydHktdjNkMC5rcnlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjhiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvdmVydGV4cHJvcGVydHktdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFyLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFyLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWMyZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3llYXItdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFyLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFyLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWMyZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3llYXItdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFybW9udGgtdjFkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3llYXJtb250aC12MWQwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlM2EzZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFybW9udGgtdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFybW9udGgtdjNkMC5rcnlvIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3llYXJtb250aC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlM2EzZQotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC95ZWFybW9udGgtdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC96b25lZGRhdGV0aW1lLXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC96b25lZGRhdGV0aW1lLXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJiY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3pvbmVkZGF0ZXRpbWUtdjFkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC96b25lZGRhdGV0aW1lLXYzZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC96b25lZGRhdGV0aW1lLXYzZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJiY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3pvbmVkZGF0ZXRpbWUtdjNkMC5rcnlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC96b25lb2Zmc2V0LXYxZDAua3J5byBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC96b25lb2Zmc2V0LXYxZDAua3J5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDM0ZjljCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlbWxpbi10b29scy9ncmVtbGluLWlvLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3RydWN0dXJlL2lvL2dyeW8vXzNfNV8wL3pvbmVvZmZzZXQtdjFkMC5rcnlvCkBAIC0wLDAgKzEgQEAKKwErMDM6MDY6MLkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvem9uZW9mZnNldC12M2QwLmtyeW8gYi9ncmVtbGluLXRvb2xzL2dyZW1saW4taW8tdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zdHJ1Y3R1cmUvaW8vZ3J5by9fM181XzAvem9uZW9mZnNldC12M2QwLmtyeW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzNGY5YwotLS0gL2Rldi9udWxsCisrKyBiL2dyZW1saW4tdG9vbHMvZ3JlbWxpbi1pby10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3N0cnVjdHVyZS9pby9ncnlvL18zXzVfMC96b25lb2Zmc2V0LXYzZDAua3J5bwpAQCAtMCwwICsxIEBACisBKzAzOjA2OjC5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JlbWxpbi10b29scy9wb20ueG1sIGIvZ3JlbWxpbi10b29scy9wb20ueG1sCmluZGV4IDFlOGIxYTcuLjc2YTQ5MjggMTAwNjQ0Ci0tLSBhL2dyZW1saW4tdG9vbHMvcG9tLnhtbAorKysgYi9ncmVtbGluLXRvb2xzL3BvbS54bWwKQEAgLTYsNyArNiw3IEBACiAgICAgPHBhcmVudD4KICAgICAgICAgPGFydGlmYWN0SWQ+dGlua2VycG9wPC9hcnRpZmFjdElkPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KLSAgICAgICAgPHZlcnNpb24+My40LjktU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogCiAgICAgPGFydGlmYWN0SWQ+Z3JlbWxpbi10b29sczwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2hhZG9vcC1ncmVtbGluL3BvbS54bWwgYi9oYWRvb3AtZ3JlbWxpbi9wb20ueG1sCmluZGV4IDJkMTRmMDcuLjNlNTAwOTEgMTAwNjQ0Ci0tLSBhL2hhZG9vcC1ncmVtbGluL3BvbS54bWwKKysrIGIvaGFkb29wLWdyZW1saW4vcG9tLnhtbApAQCAtMjEsNyArMjEsNyBAQAogICAgIDxwYXJlbnQ+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD50aW5rZXJwb3A8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KICAgICA8YXJ0aWZhY3RJZD5oYWRvb3AtZ3JlbWxpbjwvYXJ0aWZhY3RJZD4KICAgICA8bmFtZT5BcGFjaGUgVGlua2VyUG9wIDo6IEhhZG9vcCBHcmVtbGluPC9uYW1lPgpAQCAtMTAwLDI1ICsxMDAsNDcgQEAKICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CiAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbXByZXNzPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICBzcGFyayAzLjAvc2NhbGEgMi4xMiB1c2VzIHBhcmFuYW1lciAyLjggYW5kIGhhZG9vcCBpcyBzdHVjayB3aXRoIGFuIG9sZGVyIHZlcnNpb24uIHdpdGhvdXQgMi44IHlvdSBnZXQKKyAgICAgICAgICAgICAgICBTUEFSSy0xNDIyMAorICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS50aG91Z2h0d29ya3MucGFyYW5hbWVyPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXJhbmFtZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CiAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgICAgICAgICA8IS0tPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4tLT4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8IS0tIGNvbnNpc3RlbnQgZGVwZW5kZW5jaWVzIC0tPgogICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50aG91Z2h0d29ya3MucGFyYW5hbWVyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGFyYW5hbWVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi44PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zPC92ZXJzaW9uPgorICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9wcm9jZXNzL2NvbXB1dGVyL0hhZG9vcENvbWJpbmUuamF2YSBiL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3AvcHJvY2Vzcy9jb21wdXRlci9IYWRvb3BDb21iaW5lLmphdmEKaW5kZXggMDY3NzhlNi4uMDUyY2FlNiAxMDA2NDQKLS0tIGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9wcm9jZXNzL2NvbXB1dGVyL0hhZG9vcENvbWJpbmUuamF2YQorKysgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3Byb2Nlc3MvY29tcHV0ZXIvSGFkb29wQ29tYmluZS5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AucHJvY2Vzcy5jb21wdXRlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlJlZHVjZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLkhhZG9vcEdyYXBoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5pby5IYWRvb3BQb29sczsKZGlmZiAtLWdpdCBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3AvcHJvY2Vzcy9jb21wdXRlci9IYWRvb3BNYXAuamF2YSBiL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3AvcHJvY2Vzcy9jb21wdXRlci9IYWRvb3BNYXAuamF2YQppbmRleCA1ZmM3MDI2Li45M2E4NmMwIDEwMDY0NAotLS0gYS9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3Byb2Nlc3MvY29tcHV0ZXIvSGFkb29wTWFwLmphdmEKKysrIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9wcm9jZXNzL2NvbXB1dGVyL0hhZG9vcE1hcC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AucHJvY2Vzcy5jb21wdXRlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTnVsbFdyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5NYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLkhhZG9vcEdyYXBoOwpkaWZmIC0tZ2l0IGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9wcm9jZXNzL2NvbXB1dGVyL0hhZG9vcFJlZHVjZS5qYXZhIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9wcm9jZXNzL2NvbXB1dGVyL0hhZG9vcFJlZHVjZS5qYXZhCmluZGV4IDZjYTdiOGYuLjhiNGVkYTUgMTAwNjQ0Ci0tLSBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3AvcHJvY2Vzcy9jb21wdXRlci9IYWRvb3BSZWR1Y2UuamF2YQorKysgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3Byb2Nlc3MvY29tcHV0ZXIvSGFkb29wUmVkdWNlLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5wcm9jZXNzLmNvbXB1dGVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVkdWNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5zdHJ1Y3R1cmUuSGFkb29wR3JhcGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvLkhhZG9vcFBvb2xzOwpkaWZmIC0tZ2l0IGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9wcm9jZXNzL2NvbXB1dGVyL3V0aWwvTWFwUmVkdWNlSGVscGVyLmphdmEgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9NYXBSZWR1Y2VIZWxwZXIuamF2YQppbmRleCA4ODQ3NGIyLi5mNDQ5NTgxIDEwMDY0NAotLS0gYS9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9NYXBSZWR1Y2VIZWxwZXIuamF2YQorKysgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3Byb2Nlc3MvY29tcHV0ZXIvdXRpbC9NYXBSZWR1Y2VIZWxwZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnByb2Nlc3MuY29tcHV0ZXIudXRpbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOwpAQCAtNjUsNyArNjUsNiBAQAogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbi51bnNldChDb25zdGFudHMuR1JFTUxJTl9IQURPT1BfR1JBUEhfRklMVEVSKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBCYXNlQ29uZmlndXJhdGlvbiBhcGFjaGVDb25maWd1cmF0aW9uID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFwYWNoZUNvbmZpZ3VyYXRpb24uc2V0RGVsaW1pdGVyUGFyc2luZ0Rpc2FibGVkKHRydWUpOwogICAgICAgICBtYXBSZWR1Y2Uuc3RvcmVTdGF0ZShhcGFjaGVDb25maWd1cmF0aW9uKTsKICAgICAgICAgQ29uZlV0aWwubWVyZ2VBcGFjaGVJbnRvSGFkb29wQ29uZmlndXJhdGlvbihhcGFjaGVDb25maWd1cmF0aW9uLCBuZXdDb25maWd1cmF0aW9uKTsKIApkaWZmIC0tZ2l0IGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvSGFkb29wQ29uZmlndXJhdGlvbi5qYXZhIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvSGFkb29wQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IGE4MTI1ZWEuLjYxMGYwNzMgMTAwNjQ0Ci0tLSBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL0hhZG9vcENvbmZpZ3VyYXRpb24uamF2YQorKysgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9IYWRvb3BDb25maWd1cmF0aW9uLmphdmEKQEAgLTE4LDEzICsxOCw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQWJzdHJhY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTnVsbFdyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuT3V0cHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5BYnN0cmFjdENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5pby5WZXJ0ZXhXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuaXRlcmF0b3IuSXRlcmF0b3JVdGlsczsKIGltcG9ydCBvcmcuamF2YXR1cGxlcy5QYWlyOwogCkBAIC00Miw3ICszOCw2IEBACiAKICAgICBwdWJsaWMgSGFkb29wQ29uZmlndXJhdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc3VwZXIuc2V0RGVsaW1pdGVyUGFyc2luZ0Rpc2FibGVkKHRydWUpOwogICAgIH0KIAogICAgIHB1YmxpYyBIYWRvb3BDb25maWd1cmF0aW9uKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewpAQCAtNTEsNiArNDYsMjYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBnZXRLZXlzSW50ZXJuYWwoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eUludGVybmFsKGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldChzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5SW50ZXJuYWwoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0tleUludGVybmFsKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5RGlyZWN0KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSkgewogICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwogICAgIH0KQEAgLTYwLDI2ICs3NSw2IEBACiAgICAgICAgIHRoaXMucHJvcGVydGllcy5yZW1vdmUoa2V5KTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShmaW5hbCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRLZXlzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgfQotCiAgICAgLy8vLy8vLwogCiAgICAgcHVibGljIDxBPiBDbGFzczxBPiBnZXRHcmFwaFJlYWRlcigpIHsKZGlmZiAtLWdpdCBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL0hhZG9vcEdyYXBoLmphdmEgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9IYWRvb3BHcmFwaC5qYXZhCmluZGV4IDllYzBjZmQuLmY0NzIyZWEgMTAwNjQ0Ci0tLSBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL0hhZG9vcEdyYXBoLmphdmEKKysrIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvSGFkb29wR3JhcGguamF2YQpAQCAtMTgsMTAgKzE4LDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLlByb3BlcnRpZXNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuYnVpbGRlci5mbHVlbnQuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLmV4LkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnByb2Nlc3MuY29tcHV0ZXIuQWJzdHJhY3RIYWRvb3BHcmFwaENvbXB1dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0cmF0ZWd5LkhhZG9vcElvU3RyYXRlZ3k7CkBAIC0xODgsNyArMTg4LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgSGFkb29wR3JhcGggb3BlbihmaW5hbCBTdHJpbmcgY29uZmlndXJhdGlvbkZpbGUpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgPT0gY29uZmlndXJhdGlvbkZpbGUpIHRocm93IEdyYXBoLkV4Y2VwdGlvbnMuYXJndW1lbnRDYW5Ob3RCZU51bGwoImNvbmZpZ3VyYXRpb25GaWxlIik7Ci0gICAgICAgIHJldHVybiBvcGVuKG5ldyBQcm9wZXJ0aWVzQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uRmlsZSkpOworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9ucyBjb25maWdzID0gbmV3IENvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIHJldHVybiBvcGVuKGNvbmZpZ3MucHJvcGVydGllcyhjb25maWd1cmF0aW9uRmlsZSkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vRmlsZVN5c3RlbVN0b3JhZ2UuamF2YSBiL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL2lvL0ZpbGVTeXN0ZW1TdG9yYWdlLmphdmEKaW5kZXggYjA4NDdmMS4uZTcxOGYyMCAxMDA2NDQKLS0tIGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vRmlsZVN5c3RlbVN0b3JhZ2UuamF2YQorKysgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9pby9GaWxlU3lzdGVtU3RvcmFnZS5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFJbnB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFPdXRwdXRTdHJlYW07CkBAIC0xODEsNyArMTgxLDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJdGVyYXRvcjxWZXJ0ZXg+IGhlYWQoZmluYWwgU3RyaW5nIGxvY2F0aW9uLCBmaW5hbCBDbGFzcyByZWFkZXJDbGFzcywgZmluYWwgaW50IHRvdGFsTGluZXMpIHsKLSAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQmFzZUNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShDb25zdGFudHMuR1JFTUxJTl9IQURPT1BfSU5QVVRfTE9DQVRJT04sIENvbnN0YW50cy5nZXRTZWFyY2hHcmFwaExvY2F0aW9uKGxvY2F0aW9uLCB0aGlzKS5nZXQoKSk7CiAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLkdSRU1MSU5fSEFET09QX0dSQVBIX1JFQURFUiwgcmVhZGVyQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL2lvL0dyYXBoRmlsdGVyQXdhcmUuamF2YSBiL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL2lvL0dyYXBoRmlsdGVyQXdhcmUuamF2YQppbmRleCBmZjI4ZDg2Li5jYmY3MzViIDEwMDY0NAotLS0gYS9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9pby9HcmFwaEZpbHRlckF3YXJlLmphdmEKKysrIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vR3JhcGhGaWx0ZXJBd2FyZS5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoRmlsdGVyOwpkaWZmIC0tZ2l0IGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vSGFkb29wUG9vbFNoaW1TZXJ2aWNlLmphdmEgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9pby9IYWRvb3BQb29sU2hpbVNlcnZpY2UuamF2YQppbmRleCBkYjc5ZDk3Li40MGM3M2EyIDEwMDY0NAotLS0gYS9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9pby9IYWRvb3BQb29sU2hpbVNlcnZpY2UuamF2YQorKysgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9pby9IYWRvb3BQb29sU2hpbVNlcnZpY2UuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uZ3J5by5rcnlvc2hpbS5LcnlvU2hpbVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3Auc2hhZGVkLmtyeW8uaW8uSW5wdXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3Auc2hhZGVkLmtyeW8uaW8uT3V0cHV0OwpkaWZmIC0tZ2l0IGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vSGFkb29wUG9vbHMuamF2YSBiL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL2lvL0hhZG9vcFBvb2xzLmphdmEKaW5kZXggZWE3MzQzMS4uNjlmMTc2ZiAxMDA2NDQKLS0tIGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vSGFkb29wUG9vbHMuamF2YQorKysgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9pby9IYWRvb3BQb29scy5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb25VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5zdHJ1Y3R1cmUuSGFkb29wR3JhcGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLnV0aWwuQ29uZlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uSW9SZWdpc3RyeTsKZGlmZiAtLWdpdCBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL2lvL0lucHV0T3V0cHV0SGVscGVyLmphdmEgYi9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS9pby9JbnB1dE91dHB1dEhlbHBlci5qYXZhCmluZGV4IGViYjlmNzcuLjM4MWM3ODQgMTAwNjQ0Ci0tLSBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL2lvL0lucHV0T3V0cHV0SGVscGVyLmphdmEKKysrIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vSW5wdXRPdXRwdXRIZWxwZXIuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLk51bGxXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk91dHB1dEZvcm1hdDsKZGlmZiAtLWdpdCBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL2lvL09iamVjdFdyaXRhYmxlQ29tcGFyYXRvci5qYXZhIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vT2JqZWN0V3JpdGFibGVDb21wYXJhdG9yLmphdmEKaW5kZXggOTc2NTE4Zi4uZTI4ODRjYyAxMDA2NDQKLS0tIGEvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vT2JqZWN0V3JpdGFibGVDb21wYXJhdG9yLmphdmEKKysrIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvaW8vT2JqZWN0V3JpdGFibGVDb21wYXJhdG9yLmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbmYoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CiAgICAgICAgICAgICBzdXBlci5zZXRDb25mKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiBhcGFjaGVDb25maWd1cmF0aW9uID0gQ29uZlV0aWwubWFrZUFwYWNoZUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbiBhcGFjaGVDb25maWd1cmF0aW9uID0gQ29uZlV0aWwubWFrZUFwYWNoZUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CiAgICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBNYXBSZWR1Y2UuPE1hcFJlZHVjZTw/LD8sPyw/LD8+PmNyZWF0ZU1hcFJlZHVjZShIYWRvb3BHcmFwaC5vcGVuKGFwYWNoZUNvbmZpZ3VyYXRpb24pLGFwYWNoZUNvbmZpZ3VyYXRpb24pLmdldE1hcEtleVNvcnQoKS5nZXQoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbmYoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CiAgICAgICAgICAgICBzdXBlci5zZXRDb25mKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiBhcGFjaGVDb25maWd1cmF0aW9uID0gQ29uZlV0aWwubWFrZUFwYWNoZUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbiBhcGFjaGVDb25maWd1cmF0aW9uID0gQ29uZlV0aWwubWFrZUFwYWNoZUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CiAgICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBNYXBSZWR1Y2UuPE1hcFJlZHVjZTw/LD8sPyw/LD8+PmNyZWF0ZU1hcFJlZHVjZShIYWRvb3BHcmFwaC5vcGVuKGFwYWNoZUNvbmZpZ3VyYXRpb24pLGFwYWNoZUNvbmZpZ3VyYXRpb24pLmdldFJlZHVjZUtleVNvcnQoKS5nZXQoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL3V0aWwvQ29uZlV0aWwuamF2YSBiL2hhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9oYWRvb3Avc3RydWN0dXJlL3V0aWwvQ29uZlV0aWwuamF2YQppbmRleCAwZTFlZmI3Li5iNTY4NWVhIDEwMDY0NAotLS0gYS9oYWRvb3AtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vaGFkb29wL3N0cnVjdHVyZS91dGlsL0NvbmZVdGlsLmphdmEKKysrIGIvaGFkb29wLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL2hhZG9vcC9zdHJ1Y3R1cmUvdXRpbC9Db25mVXRpbC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLnV0aWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLk51bGxXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRGb3JtYXQ7CkBAIC0zMywxNCArMzMsMTMgQEAKICAgICBwcml2YXRlIENvbmZVdGlsKCkgewogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiBtYWtlQXBhY2hlQ29uZmlndXJhdGlvbihmaW5hbCBDb25maWd1cmF0aW9uIGhhZG9vcENvbmZpZ3VyYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uIG1ha2VBcGFjaGVDb25maWd1cmF0aW9uKGZpbmFsIENvbmZpZ3VyYXRpb24gaGFkb29wQ29uZmlndXJhdGlvbikgewogICAgICAgICBmaW5hbCBCYXNlQ29uZmlndXJhdGlvbiBhcGFjaGVDb25maWd1cmF0aW9uID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFwYWNoZUNvbmZpZ3VyYXRpb24uc2V0RGVsaW1pdGVyUGFyc2luZ0Rpc2FibGVkKHRydWUpOwogICAgICAgICBoYWRvb3BDb25maWd1cmF0aW9uLml0ZXJhdG9yKCkuZm9yRWFjaFJlbWFpbmluZyhlIC0+IGFwYWNoZUNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKSk7CiAgICAgICAgIHJldHVybiBhcGFjaGVDb25maWd1cmF0aW9uOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbiBtYWtlSGFkb29wQ29uZmlndXJhdGlvbihmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uIGFwYWNoZUNvbmZpZ3VyYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb24gbWFrZUhhZG9vcENvbmZpZ3VyYXRpb24oZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb24gYXBhY2hlQ29uZmlndXJhdGlvbikgewogICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGhhZG9vcENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgICAgICBhcGFjaGVDb25maWd1cmF0aW9uLmdldEtleXMoKS5mb3JFYWNoUmVtYWluaW5nKGtleSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqZWN0ID0gYXBhY2hlQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShrZXkpOwpAQCAtNDksNyArNDgsNyBAQAogICAgICAgICByZXR1cm4gaGFkb29wQ29uZmlndXJhdGlvbjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2VBcGFjaGVJbnRvSGFkb29wQ29uZmlndXJhdGlvbihmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uIGFwYWNoZUNvbmZpZ3VyYXRpb24sIGZpbmFsIENvbmZpZ3VyYXRpb24gaGFkb29wQ29uZmlndXJhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZUFwYWNoZUludG9IYWRvb3BDb25maWd1cmF0aW9uKGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uIGFwYWNoZUNvbmZpZ3VyYXRpb24sIGZpbmFsIENvbmZpZ3VyYXRpb24gaGFkb29wQ29uZmlndXJhdGlvbikgewogICAgICAgICBhcGFjaGVDb25maWd1cmF0aW9uLmdldEtleXMoKS5mb3JFYWNoUmVtYWluaW5nKGtleSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqZWN0ID0gYXBhY2hlQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShrZXkpOwogICAgICAgICAgICAgaGFkb29wQ29uZmlndXJhdGlvbi5zZXQoa2V5LCBvYmplY3QudG9TdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3BvbS54bWwgYi9uZW80ai1ncmVtbGluL3BvbS54bWwKaW5kZXggNmVhNWJmMC4uZDljOTU5YiAxMDA2NDQKLS0tIGEvbmVvNGotZ3JlbWxpbi9wb20ueG1sCisrKyBiL25lbzRqLWdyZW1saW4vcG9tLnhtbApAQCAtMjEsNyArMjEsNyBAQAogICAgIDxwYXJlbnQ+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD50aW5rZXJwb3A8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KICAgICA8YXJ0aWZhY3RJZD5uZW80ai1ncmVtbGluPC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogTmVvNGogR3JlbWxpbjwvbmFtZT4KQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubmVvNGo8L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZW80ai10aW5rZXJwb3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MC4xPC92ZXJzaW9uPgorICAgICAgICAgICAgPHZlcnNpb24+MC4xLjE8L3ZlcnNpb24+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPCEtLSBURVNUSU5HIC0tPgogICAgICAgICA8ZGVwZW5kZW5jeT4KQEAgLTQyLDYgKzQyLDEzIEBACiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLXRlc3Q8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8IS0tIGNvbmZsaWN0IGZyb20ga2lyYnkgLS0+IAorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KQEAgLTg5LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+CiAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxHcmVtbGluLVBsdWdpbi1EZXBlbmRlbmNpZXM+b3JnLm5lbzRqOm5lbzRqLXRpbmtlcnBvcC1hcGktaW1wbDowLjctMy4yLjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8R3JlbWxpbi1QbHVnaW4tRGVwZW5kZW5jaWVzPm9yZy5uZW80ajpuZW80ai10aW5rZXJwb3AtYXBpLWltcGw6MC45LTMuNC4wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9HcmVtbGluLVBsdWdpbi1EZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgpAQCAtMTE3LDcgKzEyNCw3IEBACiAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5uZW80ajwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVvNGotdGlua2VycG9wLWFwaS1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjctMy4yLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjAuOS0zLjQuMDwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CkBAIC0xMjksNiArMTM2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy10ZXh0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuYmVuLW1hbmVzLmNhZmZlaW5lPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNhZmZlaW5lPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CkBAIC0xNDgsOSArMTU5LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLW5vcDwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmx1Y2VuZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sdWNlbmUtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5pby5kcm9wd2l6YXJkLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWV0cmljcy1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CiAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy10ZXh0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjg8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zY2FsYS1sYW5nPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1saWJyYXJ5PC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjExLjg8L3ZlcnNpb24+CkBAIC0xNjgsMTEgKzE5MywyMiBAQAogICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8IS0tIHNlbGYtY29uZmxpY3Qgd2l0aCBuZW80ai1ncmFwaC1tYXRjaGluZyAtLT4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5sdWNlbmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmx1Y2VuZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj41LjUuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjQuMC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubmVvNGo8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lbzRqLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4yLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNC4xMTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgICAgICA8IS0tICoqKiBXQVJOSU5HICoqKiAtLT4KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3Byb2Nlc3MvdHJhdmVyc2FsL3N0ZXAvc2lkZUVmZmVjdC9OZW80akdyYXBoU3RlcC5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L05lbzRqR3JhcGhTdGVwLmphdmEKaW5kZXggZjE5NmE4ZC4uNDNkY2QzOSAxMDA2NDQKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L05lbzRqR3JhcGhTdGVwLmphdmEKKysrIGIvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovcHJvY2Vzcy90cmF2ZXJzYWwvc3RlcC9zaWRlRWZmZWN0L05lbzRqR3JhcGhTdGVwLmphdmEKQEAgLTE4LDIzICsxOCwzMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGoucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5wcm9jZXNzLnRyYXZlcnNhbC5MYWJlbFA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80alZlcnRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkNvbXBhcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5QOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuSGFzQ29udGFpbmVySG9sZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuR3JhcGhTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkhhc0NvbnRhaW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuQW5kUDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5TdHJpbmdGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5pdGVyYXRvci5JdGVyYXRvclV0aWxzOworaW1wb3J0IG9yZy5uZW80ai50aW5rZXJwb3AuYXBpLk5lbzRqR3JhcGhBUEk7CitpbXBvcnQgb3JnLm5lbzRqLnRpbmtlcnBvcC5hcGkuTmVvNGpOb2RlOworaW1wb3J0IG9yZy5uZW80ai50aW5rZXJwb3AuYXBpLk5lbzRqU3RyaW5nU2VhcmNoTW9kZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CiAKIC8qKgogICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCkBAIC02MSw3ICs3MSw1OSBAQAogICAgICAgICBpZiAobnVsbCA9PSB0aGlzLmlkcykKICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUl0ZXJhdG9yKCk7CiAgICAgICAgIGZpbmFsIE5lbzRqR3JhcGggZ3JhcGggPSAoTmVvNGpHcmFwaCkgdGhpcy5nZXRUcmF2ZXJzYWwoKS5nZXRHcmFwaCgpLmdldCgpOwotICAgICAgICByZXR1cm4gZ3JhcGguZ2V0VHJhaXQoKS5sb29rdXBWZXJ0aWNlcyhncmFwaCwgdGhpcy5oYXNDb250YWluZXJzLCB0aGlzLmlkcyk7CisKKyAgICAgICAgLy8gaWRzIGFyZSBwcmVzZW50LCBmaWx0ZXIgb24gdGhlbSBmaXJzdAorICAgICAgICBpZiAoaWRzLmxlbmd0aCA+IDApCisgICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JVdGlscy5maWx0ZXIoZ3JhcGgudmVydGljZXMoaWRzKSwgdmVydGV4IC0+IEhhc0NvbnRhaW5lci50ZXN0QWxsKHZlcnRleCwgaGFzQ29udGFpbmVycykpOworICAgICAgICAvLy8vLy8gZG8gaW5kZXggbG9va3VwcyAvLy8vLy8KKyAgICAgICAgZ3JhcGgudHgoKS5yZWFkV3JpdGUoKTsKKyAgICAgICAgLy8gZ2V0IGEgbGFiZWwgYmVpbmcgc2VhcmNoIG9uCisgICAgICAgIE9wdGlvbmFsPFN0cmluZz4gbGFiZWwgPSBoYXNDb250YWluZXJzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihoYXNDb250YWluZXIgLT4gaGFzQ29udGFpbmVyLmdldEtleSgpLmVxdWFscyhULmxhYmVsLmdldEFjY2Vzc29yKCkpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoaGFzQ29udGFpbmVyIC0+IENvbXBhcmUuZXEgPT0gaGFzQ29udGFpbmVyLmdldEJpUHJlZGljYXRlKCkpCisgICAgICAgICAgICAgICAgLm1hcChoYXNDb250YWluZXIgLT4gKFN0cmluZykgaGFzQ29udGFpbmVyLmdldFZhbHVlKCkpCisgICAgICAgICAgICAgICAgLmZpbmRBbnkoKTsKKyAgICAgICAgaWYgKCFsYWJlbC5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgIGxhYmVsID0gaGFzQ29udGFpbmVycy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGhhc0NvbnRhaW5lciAtPiBoYXNDb250YWluZXIuZ2V0S2V5KCkuZXF1YWxzKFQubGFiZWwuZ2V0QWNjZXNzb3IoKSkpCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaGFzQ29udGFpbmVyIC0+IGhhc0NvbnRhaW5lci5nZXRQcmVkaWNhdGUoKSBpbnN0YW5jZW9mIExhYmVsUCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcChoYXNDb250YWluZXIgLT4gKFN0cmluZykgaGFzQ29udGFpbmVyLmdldFZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgIC5maW5kQW55KCk7CisKKyAgICAgICAgaWYgKGxhYmVsLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAvLyBmaW5kIGEgdmVydGV4IGJ5IGxhYmVsIGFuZCBrZXkvdmFsdWUKKyAgICAgICAgICAgIFN0cmluZyBsYWJlbFZhbHVlID0gbGFiZWwuZ2V0KCk7CisgICAgICAgICAgICBOZW80akdyYXBoQVBJIGJhc2VHcmFwaCA9IGdyYXBoLmdldEJhc2VHcmFwaCgpOworICAgICAgICAgICAgZm9yIChmaW5hbCBIYXNDb250YWluZXIgaGFzQ29udGFpbmVyIDogaGFzQ29udGFpbmVycykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBoYXNDb250YWluZXIuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaGFzQ29udGFpbmVyLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFrZXkuZXF1YWxzKFQubGFiZWwuZ2V0QWNjZXNzb3IoKSkgJiYgYmFzZUdyYXBoLmhhc1NjaGVtYUluZGV4KGxhYmVsVmFsdWUsIGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQmlQcmVkaWNhdGU8PywgPz4gcHJlZGljYXRlID0gaGFzQ29udGFpbmVyLmdldEJpUHJlZGljYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhYmxlPE5lbzRqTm9kZT4gbm9kZXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoQ29tcGFyZS5lcSA9PSBwcmVkaWNhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzID0gYmFzZUdyYXBoLmZpbmROb2RlcyhsYWJlbFZhbHVlLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUZXh0LmNvbnRhaW5pbmcgPT0gcHJlZGljYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlcyA9IGJhc2VHcmFwaC5maW5kTm9kZXMobGFiZWxWYWx1ZSwga2V5LCB2YWx1ZS50b1N0cmluZygpLCBOZW80alN0cmluZ1NlYXJjaE1vZGUuQ09OVEFJTlMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRleHQuc3RhcnRpbmdXaXRoID09IHByZWRpY2F0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMgPSBiYXNlR3JhcGguZmluZE5vZGVzKGxhYmVsVmFsdWUsIGtleSwgdmFsdWUudG9TdHJpbmcoKSwgTmVvNGpTdHJpbmdTZWFyY2hNb2RlLlBSRUZJWCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVGV4dC5lbmRpbmdXaXRoID09IHByZWRpY2F0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMgPSBiYXNlR3JhcGguZmluZE5vZGVzKGxhYmVsVmFsdWUsIGtleSwgdmFsdWUudG9TdHJpbmcoKSwgTmVvNGpTdHJpbmdTZWFyY2hNb2RlLlNVRkZJWCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRvclV0aWxzLnN0cmVhbShub2RlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChub2RlIC0+IChWZXJ0ZXgpIG5ldyBOZW80alZlcnRleChub2RlLCBncmFwaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodmVydGV4IC0+IEhhc0NvbnRhaW5lci50ZXN0QWxsKHZlcnRleCwgaGFzQ29udGFpbmVycykpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmaW5kIGEgdmVydGV4IGJ5IGxhYmVsCisgICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JVdGlscy5zdHJlYW0oZ3JhcGguZ2V0QmFzZUdyYXBoKCkuZmluZE5vZGVzKGxhYmVsLmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgLm1hcChub2RlIC0+IChWZXJ0ZXgpIG5ldyBOZW80alZlcnRleChub2RlLCBncmFwaCkpCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodmVydGV4IC0+IEhhc0NvbnRhaW5lci50ZXN0QWxsKHZlcnRleCwgaGFzQ29udGFpbmVycykpLml0ZXJhdG9yKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBsaW5lYXIgc2NhbgorICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9yVXRpbHMuZmlsdGVyKGdyYXBoLnZlcnRpY2VzKCksIHZlcnRleCAtPiBIYXNDb250YWluZXIudGVzdEFsbCh2ZXJ0ZXgsIGhhc0NvbnRhaW5lcnMpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05lbzRqRWRnZS5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05lbzRqRWRnZS5qYXZhCmluZGV4IDI5Y2NlZjEuLjA4MjgyZmMgMTAwNjQ0Ci0tLSBhL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OZW80akVkZ2UuamF2YQorKysgYi9uZW80ai1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmVvNGpFZGdlLmphdmEKQEAgLTExNSw2ICsxMTUsMTIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgPFY+IFByb3BlcnR5PFY+IHByb3BlcnR5KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFYgdmFsdWUpIHsKICAgICAgICAgRWxlbWVudEhlbHBlci52YWxpZGF0ZVByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgICAKKyAgICAgICAgaWYgKG51bGwgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMoa2V5KS5mb3JFYWNoUmVtYWluaW5nKFByb3BlcnR5OjpyZW1vdmUpOworICAgICAgICAgICAgcmV0dXJuIFByb3BlcnR5LmVtcHR5KCk7CisgICAgICAgIH0KKwogICAgICAgICB0aGlzLmdyYXBoLnR4KCkucmVhZFdyaXRlKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0aGlzLmJhc2VFbGVtZW50LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05lbzRqR3JhcGguamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OZW80akdyYXBoLmphdmEKaW5kZXggYWVlYjllZi4uNTViZTVmNiAxMDA2NDQKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05lbzRqR3JhcGguamF2YQorKysgYi9uZW80ai1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmVvNGpHcmFwaC5qYXZhCkBAIC0xOCwxNSArMTgsMTIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb25Db252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuQ3lwaGVyU3RhcnRTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGoucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kub3B0aW1pemF0aW9uLk5lbzRqR3JhcGhTdGVwU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5wcm9jZXNzLnV0aWwuTmVvNGpDeXBoZXJJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS50cmFpdC5NdWx0aU1ldGFOZW80alRyYWl0OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLnRyYWl0Lk5lbzRqVHJhaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUudHJhaXQuTm9NdWx0aU5vTWV0YU5lbzRqVHJhaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVnaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkRlZmF1bHRHcmFwaFRyYXZlcnNhbDsKQEAgLTQ0LDE3ICs0MSwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5pdGVyYXRvci5JdGVyYXRvclV0aWxzOwogaW1wb3J0IG9yZy5uZW80ai50aW5rZXJwb3AuYXBpLk5lbzRqRmFjdG9yeTsKIGltcG9ydCBvcmcubmVvNGoudGlua2VycG9wLmFwaS5OZW80akdyYXBoQVBJOwotaW1wb3J0IG9yZy5uZW80ai50aW5rZXJwb3AuYXBpLk5lbzRqTm9kZTsKLWltcG9ydCBvcmcubmVvNGoudGlua2VycG9wLmFwaS5OZW80alJlbGF0aW9uc2hpcDsKIGltcG9ydCBvcmcubmVvNGoudGlua2VycG9wLmFwaS5OZW80alR4OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIC8qKgpAQCAtNjgsOCArNTksNiBAQAogQEdyYXBoLk9wdEluKCJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLk5hdGl2ZU5lbzRqU3VpdGUiKQogcHVibGljIGZpbmFsIGNsYXNzIE5lbzRqR3JhcGggaW1wbGVtZW50cyBHcmFwaCwgV3JhcHBlZEdyYXBoPE5lbzRqR3JhcGhBUEk+IHsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5lbzRqR3JhcGguY2xhc3MpOwotCiAgICAgc3RhdGljIHsKICAgICAgICAgVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5yZWdpc3RlclN0cmF0ZWdpZXMoTmVvNGpHcmFwaC5jbGFzcywgVHJhdmVyc2FsU3RyYXRlZ2llcy5HbG9iYWxDYWNoZS5nZXRTdHJhdGVnaWVzKEdyYXBoLmNsYXNzKS5jbG9uZSgpLmFkZFN0cmF0ZWdpZXMoTmVvNGpHcmFwaFN0ZXBTdHJhdGVneS5pbnN0YW5jZSgpKSk7CiAgICAgfQpAQCAtODYsNDIgKzc1LDEzIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0RJUkVDVE9SWSA9ICJncmVtbGluLm5lbzRqLmRpcmVjdG9yeSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0NPTkYgPSAiZ3JlbWxpbi5uZW80ai5jb25mIjsKIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCByZXBsYWNlZC4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19NRVRBX1BST1BFUlRJRVMgPSAiZ3JlbWxpbi5uZW80ai5tZXRhUHJvcGVydGllcyI7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgcmVwbGFjZWQuCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfTVVMVElfUFJPUEVSVElFUyA9ICJncmVtbGluLm5lbzRqLm11bHRpUHJvcGVydGllcyI7Ci0KICAgICBwcml2YXRlIGZpbmFsIE5lbzRqVHJhbnNhY3Rpb24gbmVvNGpUcmFuc2FjdGlvbiA9IG5ldyBOZW80alRyYW5zYWN0aW9uKCk7CiAgICAgcHJpdmF0ZSBOZW80akdyYXBoVmFyaWFibGVzIG5lbzRqR3JhcGhWYXJpYWJsZXM7CiAKLSAgICBwcm90ZWN0ZWQgTmVvNGpUcmFpdCB0cmFpdDsKLQogICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKGZpbmFsIE5lbzRqR3JhcGhBUEkgYmFzZUdyYXBoLCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvcHkoY29uZmlndXJhdGlvbik7CiAgICAgICAgIHRoaXMuYmFzZUdyYXBoID0gYmFzZUdyYXBoOwogICAgICAgICB0aGlzLm5lbzRqR3JhcGhWYXJpYWJsZXMgPSBuZXcgTmVvNGpHcmFwaFZhcmlhYmxlcyh0aGlzKTsKLSAgICAgICAgdGhpcy50eCgpLnJlYWRXcml0ZSgpOwotICAgICAgICBmaW5hbCBPcHRpb25hbDxCb29sZWFuPiBoYXNNdWx0aVByb3BlcnRpZXMgPSB0aGlzLm5lbzRqR3JhcGhWYXJpYWJsZXMuZ2V0KEdyYXBoLkhpZGRlbi5oaWRlKENPTkZJR19NVUxUSV9QUk9QRVJUSUVTKSk7Ci0gICAgICAgIGZpbmFsIE9wdGlvbmFsPEJvb2xlYW4+IGhhc01ldGFQcm9wZXJ0aWVzID0gdGhpcy5uZW80akdyYXBoVmFyaWFibGVzLmdldChHcmFwaC5IaWRkZW4uaGlkZShDT05GSUdfTUVUQV9QUk9QRVJUSUVTKSk7Ci0gICAgICAgIGJvb2xlYW4gc3VwcG9ydHNNZXRhUHJvcGVydGllcyA9IGhhc01ldGFQcm9wZXJ0aWVzLm9yRWxzZSh0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Qm9vbGVhbihDT05GSUdfTUVUQV9QUk9QRVJUSUVTLCBmYWxzZSkpOwotICAgICAgICBib29sZWFuIHN1cHBvcnRzTXVsdGlQcm9wZXJ0aWVzID0gaGFzTXVsdGlQcm9wZXJ0aWVzLm9yRWxzZSh0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Qm9vbGVhbihDT05GSUdfTVVMVElfUFJPUEVSVElFUywgZmFsc2UpKTsKLSAgICAgICAgaWYgKHN1cHBvcnRzTXVsdGlQcm9wZXJ0aWVzICE9IHN1cHBvcnRzTWV0YVByb3BlcnRpZXMpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGN1cnJlbnRseSBzdXBwb3J0cyBlaXRoZXIgYm90aCBtZXRhLXByb3BlcnRpZXMgYW5kIG11bHRpLXByb3BlcnRpZXMgb3IgbmVpdGhlciIpOwotICAgICAgICBpZiAoIWhhc011bHRpUHJvcGVydGllcy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHRoaXMubmVvNGpHcmFwaFZhcmlhYmxlcy5zZXQoR3JhcGguSGlkZGVuLmhpZGUoQ09ORklHX01VTFRJX1BST1BFUlRJRVMpLCBzdXBwb3J0c011bHRpUHJvcGVydGllcyk7Ci0gICAgICAgIGlmICghaGFzTWV0YVByb3BlcnRpZXMuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICB0aGlzLm5lbzRqR3JhcGhWYXJpYWJsZXMuc2V0KEdyYXBoLkhpZGRlbi5oaWRlKENPTkZJR19NRVRBX1BST1BFUlRJRVMpLCBzdXBwb3J0c01ldGFQcm9wZXJ0aWVzKTsKLSAgICAgICAgdGhpcy50cmFpdCA9IHN1cHBvcnRzTXVsdGlQcm9wZXJ0aWVzID8gTXVsdGlNZXRhTmVvNGpUcmFpdC5pbnN0YW5jZSgpIDogTm9NdWx0aU5vTWV0YU5lbzRqVHJhaXQuaW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKHN1cHBvcnRzTXVsdGlQcm9wZXJ0aWVzKQotICAgICAgICAgICAgTE9HR0VSLndhcm4odGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgbXVsdGkvbWV0YS1wcm9wZXJ0aWVzIGZlYXR1cmUgaGFzIGFsd2F5cyBiZWVuIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGFuZCBub3QgcHJvZHVjdGlvbiByZWFkeSAtIGl0IGlzIG5vdyBkZXByZWNhdGVkIGFzIG9mIDMuMy44Iik7Ci0gICAgICAgIHRoaXMudHgoKS5jb21taXQoKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgTmVvNGpHcmFwaChmaW5hbCBOZW80akdyYXBoQVBJIGJhc2VHcmFwaCwgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CkBAIC0xNzksMTAgKzEzOSw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPFZlcnRleD4gdmVydGljZXMoZmluYWwgT2JqZWN0Li4uIHZlcnRleElkcykgewogICAgICAgICB0aGlzLnR4KCkucmVhZFdyaXRlKCk7Ci0gICAgICAgIGZpbmFsIFByZWRpY2F0ZTxOZW80ak5vZGU+IG5vZGVQcmVkaWNhdGUgPSB0aGlzLnRyYWl0LmdldE5vZGVQcmVkaWNhdGUoKTsKICAgICAgICAgaWYgKDAgPT0gdmVydGV4SWRzLmxlbmd0aCkgewogICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9yVXRpbHMuc3RyZWFtKHRoaXMuZ2V0QmFzZUdyYXBoKCkuYWxsTm9kZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihub2RlUHJlZGljYXRlKQogICAgICAgICAgICAgICAgICAgICAubWFwKG5vZGUgLT4gKFZlcnRleCkgbmV3IE5lbzRqVmVydGV4KG5vZGUsIHRoaXMpKS5pdGVyYXRvcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRWxlbWVudEhlbHBlci52YWxpZGF0ZU1peGVkRWxlbWVudElkcyhWZXJ0ZXguY2xhc3MsIHZlcnRleElkcyk7CkBAIC0yMDUsNyArMTYzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG5vZGVQcmVkaWNhdGUpCiAgICAgICAgICAgICAgICAgICAgIC5tYXAobm9kZSAtPiAoVmVydGV4KSBuZXcgTmVvNGpWZXJ0ZXgobm9kZSwgdGhpcykpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTMsMTAgKzE3MCw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPEVkZ2U+IGVkZ2VzKGZpbmFsIE9iamVjdC4uLiBlZGdlSWRzKSB7CiAgICAgICAgIHRoaXMudHgoKS5yZWFkV3JpdGUoKTsKLSAgICAgICAgZmluYWwgUHJlZGljYXRlPE5lbzRqUmVsYXRpb25zaGlwPiByZWxhdGlvbnNoaXBQcmVkaWNhdGUgPSB0aGlzLnRyYWl0LmdldFJlbGF0aW9uc2hpcFByZWRpY2F0ZSgpOwogICAgICAgICBpZiAoMCA9PSBlZGdlSWRzLmxlbmd0aCkgewogICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9yVXRpbHMuc3RyZWFtKHRoaXMuZ2V0QmFzZUdyYXBoKCkuYWxsUmVsYXRpb25zaGlwcygpKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHJlbGF0aW9uc2hpcFByZWRpY2F0ZSkKICAgICAgICAgICAgICAgICAgICAgLm1hcChyZWxhdGlvbnNoaXAgLT4gKEVkZ2UpIG5ldyBOZW80akVkZ2UocmVsYXRpb25zaGlwLCB0aGlzKSkuaXRlcmF0b3IoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEVsZW1lbnRIZWxwZXIudmFsaWRhdGVNaXhlZEVsZW1lbnRJZHMoRWRnZS5jbGFzcywgZWRnZUlkcyk7CkBAIC0yMzksMjAgKzE5NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocmVsYXRpb25zaGlwUHJlZGljYXRlKQogICAgICAgICAgICAgICAgICAgICAubWFwKHJlbGF0aW9uc2hpcCAtPiAoRWRnZSkgbmV3IE5lbzRqRWRnZShyZWxhdGlvbnNoaXAsIHRoaXMpKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAgICAgfQogCi0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgcmVwbGFjZWQuCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgTmVvNGpUcmFpdCBnZXRUcmFpdCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHJhaXQ7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIDxDIGV4dGVuZHMgR3JhcGhDb21wdXRlcj4gQyBjb21wdXRlKGZpbmFsIENsYXNzPEM+IGdyYXBoQ29tcHV0ZXJDbGFzcykgewogICAgICAgICB0aHJvdyBHcmFwaC5FeGNlcHRpb25zLmdyYXBoQ29tcHV0ZXJOb3RTdXBwb3J0ZWQoKTsKQEAgLTQzNCwxMiArMzc5LDEyIEBACiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNZXRhUHJvcGVydGllcygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXQuc3VwcG9ydHNNZXRhUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpUHJvcGVydGllcygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXQuc3VwcG9ydHNNdWx0aVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtNDQ5LDcgKzM5NCw3IEBACiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5IGdldENhcmRpbmFsaXR5KGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXQuZ2V0Q2FyZGluYWxpdHkoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkuc2luZ2xlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQ3Miw2ICs0MTcsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVc2VyU3VwcGxpZWRJZHMoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtNTAzLDYgKzQ1MywxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c01hcFZhbHVlcygpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmVvNGpWZXJ0ZXguamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OZW80alZlcnRleC5qYXZhCmluZGV4IDJiY2QzNjMuLjk4YjE4OTMgMTAwNjQ0Ci0tLSBhL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OZW80alZlcnRleC5qYXZhCisrKyBiL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OZW80alZlcnRleC5qYXZhCkBAIC0yMSwxMiArMjEsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5FbGVtZW50SGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLndyYXBwZWQuV3JhcHBlZFZlcnRleDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnV0aWwuaXRlcmF0b3IuSXRlcmF0b3JVdGlsczsKK2ltcG9ydCBvcmcubmVvNGoudGlua2VycG9wLmFwaS5OZW80akRpcmVjdGlvbjsKIGltcG9ydCBvcmcubmVvNGoudGlua2VycG9wLmFwaS5OZW80ak5vZGU7CiBpbXBvcnQgb3JnLm5lbzRqLnRpbmtlcnBvcC5hcGkuTmVvNGpSZWxhdGlvbnNoaXA7CiAKQEAgLTczLDcgKzc1LDE4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewogICAgICAgICB0aGlzLmdyYXBoLnR4KCkucmVhZFdyaXRlKCk7Ci0gICAgICAgIHRoaXMuZ3JhcGgudHJhaXQucmVtb3ZlVmVydGV4KHRoaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTmVvNGpOb2RlIG5vZGUgPSAoTmVvNGpOb2RlKSBiYXNlRWxlbWVudDsKKyAgICAgICAgICAgIGZvciAoZmluYWwgTmVvNGpSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogbm9kZS5yZWxhdGlvbnNoaXBzKE5lbzRqRGlyZWN0aW9uLkJPVEgpKSB7CisgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZS5kZWxldGUoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgb25lIGhhcHBlbnMgaWYgdGhlIHZlcnRleCBpcyBzdGlsbCBjaGlsbGluZyBpbiB0aGUgdHgKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYgKCFOZW80akhlbHBlci5pc05vdEZvdW5kKGV4KSkgdGhyb3cgZXg7CisgICAgICAgICAgICAvLyB0aGlzIG9uZSBoYXBwZW5zIGlmIHRoZSB2ZXJ0ZXggaXMgY29tbWl0dGVkCisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTgyLDE5ICs5NSwzNyBAQAogICAgICAgICBpZiAoRWxlbWVudEhlbHBlci5nZXRJZFZhbHVlKGtleVZhbHVlcykuaXNQcmVzZW50KCkpCiAgICAgICAgICAgICB0aHJvdyBWZXJ0ZXguRXhjZXB0aW9ucy51c2VyU3VwcGxpZWRJZHNOb3RTdXBwb3J0ZWQoKTsKICAgICAgICAgdGhpcy5ncmFwaC50eCgpLnJlYWRXcml0ZSgpOwotICAgICAgICByZXR1cm4gdGhpcy5ncmFwaC50cmFpdC5zZXRWZXJ0ZXhQcm9wZXJ0eSh0aGlzLCBjYXJkaW5hbGl0eSwga2V5LCB2YWx1ZSwga2V5VmFsdWVzKTsKKworICAgICAgICBpZiAoY2FyZGluYWxpdHkgIT0gVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkuc2luZ2xlKQorICAgICAgICAgICAgdGhyb3cgVmVydGV4UHJvcGVydHkuRXhjZXB0aW9ucy5tdWx0aVByb3BlcnRpZXNOb3RTdXBwb3J0ZWQoKTsKKworICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcHJvcGVydGllcyhrZXkpLmZvckVhY2hSZW1haW5pbmcoVmVydGV4UHJvcGVydHk6OnJlbW92ZSk7CisgICAgICAgICAgICByZXR1cm4gVmVydGV4UHJvcGVydHkuZW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChrZXlWYWx1ZXMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHRocm93IFZlcnRleFByb3BlcnR5LkV4Y2VwdGlvbnMubWV0YVByb3BlcnRpZXNOb3RTdXBwb3J0ZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuYmFzZUVsZW1lbnQuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih0aGlzLCBrZXksIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgdGhyb3cgUHJvcGVydHkuRXhjZXB0aW9ucy5kYXRhVHlwZU9mUHJvcGVydHlWYWx1ZU5vdFN1cHBvcnRlZCh2YWx1ZSwgaWFlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyA8Vj4gVmVydGV4UHJvcGVydHk8Vj4gcHJvcGVydHkoZmluYWwgU3RyaW5nIGtleSkgewogICAgICAgICB0aGlzLmdyYXBoLnR4KCkucmVhZFdyaXRlKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmdyYXBoLnRyYWl0LmdldFZlcnRleFByb3BlcnR5KHRoaXMsIGtleSk7CisgICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5oYXNQcm9wZXJ0eShrZXkpID8gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih0aGlzLCBrZXksIChWKSBiYXNlRWxlbWVudC5nZXRQcm9wZXJ0eShrZXkpKSA6IFZlcnRleFByb3BlcnR5LjxWPmVtcHR5KCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIDxWPiBJdGVyYXRvcjxWZXJ0ZXhQcm9wZXJ0eTxWPj4gcHJvcGVydGllcyhmaW5hbCBTdHJpbmcuLi4gcHJvcGVydHlLZXlzKSB7CiAgICAgICAgIHRoaXMuZ3JhcGgudHgoKS5yZWFkV3JpdGUoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JhcGgudHJhaXQuZ2V0VmVydGV4UHJvcGVydGllcyh0aGlzLCBwcm9wZXJ0eUtleXMpOworICAgICAgICByZXR1cm4gKEl0ZXJhdG9yKSBJdGVyYXRvclV0aWxzLnN0cmVhbSh0aGlzLmJhc2VFbGVtZW50LmdldEtleXMoKSkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGtleSAtPiBFbGVtZW50SGVscGVyLmtleUV4aXN0cyhrZXksIHByb3BlcnR5S2V5cykpCisgICAgICAgICAgICAgICAgLm1hcChrZXkgLT4gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih0aGlzLCBrZXksIChWKSB0aGlzLmJhc2VFbGVtZW50LmdldFByb3BlcnR5KGtleSkpKS5pdGVyYXRvcigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTEyLDcgKzE0Myw3IEBACiAgICAgcHVibGljIEl0ZXJhdG9yPFZlcnRleD4gdmVydGljZXMoZmluYWwgRGlyZWN0aW9uIGRpcmVjdGlvbiwgZmluYWwgU3RyaW5nLi4uIGVkZ2VMYWJlbHMpIHsKICAgICAgICAgdGhpcy5ncmFwaC50eCgpLnJlYWRXcml0ZSgpOwogICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yPFZlcnRleD4oKSB7Ci0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxOZW80alJlbGF0aW9uc2hpcD4gcmVsYXRpb25zaGlwSXRlcmF0b3IgPSBJdGVyYXRvclV0aWxzLmZpbHRlcigwID09IGVkZ2VMYWJlbHMubGVuZ3RoID8KKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPE5lbzRqUmVsYXRpb25zaGlwPiByZWxhdGlvbnNoaXBJdGVyYXRvciA9IDAgPT0gZWRnZUxhYmVscy5sZW5ndGggPwogICAgICAgICAgICAgICAgICAgICBCT1RIID09IGRpcmVjdGlvbiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JVdGlscy5jb25jYXQoZ2V0QmFzZVZlcnRleCgpLnJlbGF0aW9uc2hpcHMoTmVvNGpIZWxwZXIubWFwRGlyZWN0aW9uKE9VVCkpLml0ZXJhdG9yKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akhlbHBlci5tYXBEaXJlY3Rpb24oSU4pKS5pdGVyYXRvcigpKSA6CkBAIC0xMjAsNyArMTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgQk9USCA9PSBkaXJlY3Rpb24gPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yVXRpbHMuY29uY2F0KGdldEJhc2VWZXJ0ZXgoKS5yZWxhdGlvbnNoaXBzKE5lbzRqSGVscGVyLm1hcERpcmVjdGlvbihPVVQpLCAoZWRnZUxhYmVscykpLml0ZXJhdG9yKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akhlbHBlci5tYXBEaXJlY3Rpb24oSU4pLCAoZWRnZUxhYmVscykpLml0ZXJhdG9yKCkpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akhlbHBlci5tYXBEaXJlY3Rpb24oZGlyZWN0aW9uKSwgKGVkZ2VMYWJlbHMpKS5pdGVyYXRvcigpLCBncmFwaC50cmFpdC5nZXRSZWxhdGlvbnNoaXBQcmVkaWNhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFzZVZlcnRleCgpLnJlbGF0aW9uc2hpcHMoTmVvNGpIZWxwZXIubWFwRGlyZWN0aW9uKGRpcmVjdGlvbiksIChlZGdlTGFiZWxzKSkuaXRlcmF0b3IoKTsKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewpAQCAtMTM4LDcgKzE2OSw3IEBACiAgICAgcHVibGljIEl0ZXJhdG9yPEVkZ2U+IGVkZ2VzKGZpbmFsIERpcmVjdGlvbiBkaXJlY3Rpb24sIGZpbmFsIFN0cmluZy4uLiBlZGdlTGFiZWxzKSB7CiAgICAgICAgIHRoaXMuZ3JhcGgudHgoKS5yZWFkV3JpdGUoKTsKICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxFZGdlPigpIHsKLSAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPE5lbzRqUmVsYXRpb25zaGlwPiByZWxhdGlvbnNoaXBJdGVyYXRvciA9IEl0ZXJhdG9yVXRpbHMuZmlsdGVyKDAgPT0gZWRnZUxhYmVscy5sZW5ndGggPworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8TmVvNGpSZWxhdGlvbnNoaXA+IHJlbGF0aW9uc2hpcEl0ZXJhdG9yID0gMCA9PSBlZGdlTGFiZWxzLmxlbmd0aCA/CiAgICAgICAgICAgICAgICAgICAgIEJPVEggPT0gZGlyZWN0aW9uID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvclV0aWxzLmNvbmNhdChnZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akhlbHBlci5tYXBEaXJlY3Rpb24oT1VUKSkuaXRlcmF0b3IoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhc2VWZXJ0ZXgoKS5yZWxhdGlvbnNoaXBzKE5lbzRqSGVscGVyLm1hcERpcmVjdGlvbihJTikpLml0ZXJhdG9yKCkpIDoKQEAgLTE0Niw3ICsxNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICBCT1RIID09IGRpcmVjdGlvbiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JVdGlscy5jb25jYXQoZ2V0QmFzZVZlcnRleCgpLnJlbGF0aW9uc2hpcHMoTmVvNGpIZWxwZXIubWFwRGlyZWN0aW9uKE9VVCksIChlZGdlTGFiZWxzKSkuaXRlcmF0b3IoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhc2VWZXJ0ZXgoKS5yZWxhdGlvbnNoaXBzKE5lbzRqSGVscGVyLm1hcERpcmVjdGlvbihJTiksIChlZGdlTGFiZWxzKSkuaXRlcmF0b3IoKSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhc2VWZXJ0ZXgoKS5yZWxhdGlvbnNoaXBzKE5lbzRqSGVscGVyLm1hcERpcmVjdGlvbihkaXJlY3Rpb24pLCAoZWRnZUxhYmVscykpLml0ZXJhdG9yKCksIGdyYXBoLnRyYWl0LmdldFJlbGF0aW9uc2hpcFByZWRpY2F0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akhlbHBlci5tYXBEaXJlY3Rpb24oZGlyZWN0aW9uKSwgKGVkZ2VMYWJlbHMpKS5pdGVyYXRvcigpOwogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmVvNGpWZXJ0ZXhQcm9wZXJ0eS5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05lbzRqVmVydGV4UHJvcGVydHkuamF2YQppbmRleCAxMDhhZWMyLi5iNWZhMmFmIDEwMDY0NAotLS0gYS9uZW80ai1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmVvNGpWZXJ0ZXhQcm9wZXJ0eS5qYXZhCisrKyBiL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OZW80alZlcnRleFByb3BlcnR5LmphdmEKQEAgLTkzLDIxICs5MywxOSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIDxVPiBJdGVyYXRvcjxQcm9wZXJ0eTxVPj4gcHJvcGVydGllcyhmaW5hbCBTdHJpbmcuLi4gcHJvcGVydHlLZXlzKSB7Ci0gICAgICAgIHRoaXMudmVydGV4LmdyYXBoLnR4KCkucmVhZFdyaXRlKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLnZlcnRleC5ncmFwaC50cmFpdC5nZXRQcm9wZXJ0aWVzKHRoaXMsIHByb3BlcnR5S2V5cyk7CisgICAgICAgIHRocm93IFZlcnRleFByb3BlcnR5LkV4Y2VwdGlvbnMubWV0YVByb3BlcnRpZXNOb3RTdXBwb3J0ZWQoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgPFU+IFByb3BlcnR5PFU+IHByb3BlcnR5KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52ZXJ0ZXguZ3JhcGgudHgoKS5yZWFkV3JpdGUoKTsKLSAgICAgICAgRWxlbWVudEhlbHBlci52YWxpZGF0ZVByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXguZ3JhcGgudHJhaXQuc2V0UHJvcGVydHkodGhpcywga2V5LCB2YWx1ZSk7CisgICAgICAgIHRocm93IFZlcnRleFByb3BlcnR5LkV4Y2VwdGlvbnMubWV0YVByb3BlcnRpZXNOb3RTdXBwb3J0ZWQoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CiAgICAgICAgIHRoaXMudmVydGV4LmdyYXBoLnR4KCkucmVhZFdyaXRlKCk7Ci0gICAgICAgIHRoaXMudmVydGV4LmdyYXBoLnRyYWl0LnJlbW92ZVZlcnRleFByb3BlcnR5KHRoaXMpOworICAgICAgICBmaW5hbCBOZW80ak5vZGUgbm9kZSA9ICgoTmVvNGpWZXJ0ZXgpIGVsZW1lbnQoKSkuZ2V0QmFzZVZlcnRleCgpOworICAgICAgICBpZiAobm9kZS5oYXNQcm9wZXJ0eShrZXkpKSBub2RlLnJlbW92ZVByb3BlcnR5KGtleSk7CiAgICAgICAgIHRoaXMudmVydGV4UHJvcGVydHlOb2RlPSBudWxsOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL3RyYWl0L011bHRpTWV0YU5lbzRqVHJhaXQuamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS90cmFpdC9NdWx0aU1ldGFOZW80alRyYWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZWQ5NjEuLjAwMDAwMDAKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL3RyYWl0L011bHRpTWV0YU5lbzRqVHJhaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUudHJhaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnByb2Nlc3MudHJhdmVyc2FsLkxhYmVsUDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80akdyYXBoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLk5lbzRqSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLk5lbzRqUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpWZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpWZXJ0ZXhQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkNvbXBhcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuSGFzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5FbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwud3JhcHBlZC5XcmFwcGVkR3JhcGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi51dGlsLml0ZXJhdG9yLkl0ZXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLm5lbzRqLnRpbmtlcnBvcC5hcGkuTmVvNGpEaXJlY3Rpb247Ci1pbXBvcnQgb3JnLm5lbzRqLnRpbmtlcnBvcC5hcGkuTmVvNGpHcmFwaEFQSTsKLWltcG9ydCBvcmcubmVvNGoudGlua2VycG9wLmFwaS5OZW80ak5vZGU7Ci1pbXBvcnQgb3JnLm5lbzRqLnRpbmtlcnBvcC5hcGkuTmVvNGpSZWxhdGlvbnNoaXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAzLjMuOCwgbm90IHJlcGxhY2VkLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGZpbmFsIGNsYXNzIE11bHRpTWV0YU5lbzRqVHJhaXQgaW1wbGVtZW50cyBOZW80alRyYWl0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE11bHRpTWV0YU5lbzRqVHJhaXQgSU5TVEFOQ0UgPSBuZXcgTXVsdGlNZXRhTmVvNGpUcmFpdCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSVEVYX1BST1BFUlRZX0xBQkVMID0gInZlcnRleFByb3BlcnR5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJURVhfUFJPUEVSVFlfVE9LRU4gPSBHcmFwaC5IaWRkZW4uaGlkZSgidmVydGV4UHJvcGVydHkiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxOZW80ak5vZGU+IE5PREVfUFJFRElDQVRFID0gbm9kZSAtPiAhbm9kZS5oYXNMYWJlbChWRVJURVhfUFJPUEVSVFlfTEFCRUwpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxOZW80alJlbGF0aW9uc2hpcD4gUkVMQVRJT05TSElQX1BSRURJQ0FURSA9IHJlbGF0aW9uc2hpcCAtPiAhR3JhcGguSGlkZGVuLmlzSGlkZGVuKHJlbGF0aW9uc2hpcC50eXBlKCkpOwotCi0gICAgcHJpdmF0ZSBNdWx0aU1ldGFOZW80alRyYWl0KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNdWx0aU1ldGFOZW80alRyYWl0IGluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByZWRpY2F0ZTxOZW80ak5vZGU+IGdldE5vZGVQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBOT0RFX1BSRURJQ0FURTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJlZGljYXRlPE5lbzRqUmVsYXRpb25zaGlwPiBnZXRSZWxhdGlvbnNoaXBQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBSRUxBVElPTlNISVBfUFJFRElDQVRFOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZlcnRleChmaW5hbCBOZW80alZlcnRleCB2ZXJ0ZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIE5lbzRqTm9kZSBub2RlID0gdmVydGV4LmdldEJhc2VWZXJ0ZXgoKTsKLSAgICAgICAgICAgIGZvciAoZmluYWwgTmVvNGpSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogbm9kZS5yZWxhdGlvbnNoaXBzKE5lbzRqRGlyZWN0aW9uLkJPVEgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTmVvNGpOb2RlIG90aGVyTm9kZSA9IHJlbGF0aW9uc2hpcC5vdGhlcihub2RlKTsKLSAgICAgICAgICAgICAgICBpZiAob3RoZXJOb2RlLmhhc0xhYmVsKFZFUlRFWF9QUk9QRVJUWV9MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJOb2RlLmRlbGV0ZSgpOyAvLyBtZXRhIHByb3BlcnR5IG5vZGUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZS5kZWxldGUoKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgb25lIGhhcHBlbnMgaWYgdGhlIHZlcnRleCBpcyBzdGlsbCBjaGlsbGluZyBpbiB0aGUgdHgKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKCFOZW80akhlbHBlci5pc05vdEZvdW5kKGV4KSkgdGhyb3cgZXg7Ci0gICAgICAgICAgICAvLyB0aGlzIG9uZSBoYXBwZW5zIGlmIHRoZSB2ZXJ0ZXggaXMgY29tbWl0dGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFY+IFZlcnRleFByb3BlcnR5PFY+IGdldFZlcnRleFByb3BlcnR5KGZpbmFsIE5lbzRqVmVydGV4IHZlcnRleCwgZmluYWwgU3RyaW5nIGtleSkgewotICAgICAgICBmaW5hbCBOZW80ak5vZGUgbm9kZSA9IHZlcnRleC5nZXRCYXNlVmVydGV4KCk7Ci0gICAgICAgIGlmIChub2RlLmhhc1Byb3BlcnR5KGtleSkpIHsKLSAgICAgICAgICAgIGlmIChub2RlLmdldFByb3BlcnR5KGtleSkuZXF1YWxzKFZFUlRFWF9QUk9QRVJUWV9UT0tFTikpIHsKLSAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWdyZWUoTmVvNGpEaXJlY3Rpb24uT1VUR09JTkcsIEdyYXBoLkhpZGRlbi5oaWRlKGtleSkpID4gMSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgVmVydGV4LkV4Y2VwdGlvbnMubXVsdGlwbGVQcm9wZXJ0aWVzRXhpc3RGb3JQcm92aWRlZEtleShrZXkpOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFZlcnRleFByb3BlcnR5PFY+KSBuZXcgTmVvNGpWZXJ0ZXhQcm9wZXJ0eTw+KHZlcnRleCwgbm9kZS5yZWxhdGlvbnNoaXBzKE5lbzRqRGlyZWN0aW9uLk9VVEdPSU5HLCBHcmFwaC5IaWRkZW4uaGlkZShrZXkpKS5pdGVyYXRvcigpLm5leHQoKS5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih2ZXJ0ZXgsIGtleSwgKFYpIG5vZGUuZ2V0UHJvcGVydHkoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmV0dXJuIFZlcnRleFByb3BlcnR5LjxWPmVtcHR5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBJdGVyYXRvcjxWZXJ0ZXhQcm9wZXJ0eTxWPj4gZ2V0VmVydGV4UHJvcGVydGllcyhmaW5hbCBOZW80alZlcnRleCB2ZXJ0ZXgsIGZpbmFsIFN0cmluZy4uLiBrZXlzKSB7Ci0gICAgICAgIGlmIChOZW80akhlbHBlci5pc0RlbGV0ZWQodmVydGV4LmdldEJhc2VWZXJ0ZXgoKSkpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlJdGVyYXRvcigpOyAvLyBUT0RPOiBJIGJlbGlldmUgaXRzIGJlY2F1c2UgdGhlIHZlcnRleCBwcm9wZXJ0eSBpcyBkZWxldGVkLCBidXQgdGhlbiBzZWVuIGFnYWluIGluIHRoZSBpdGVyYXRvci4gPwotICAgICAgICByZXR1cm4gSXRlcmF0b3JVdGlscy5zdHJlYW0odmVydGV4LmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpCi0gICAgICAgICAgICAgICAgLmZpbHRlcihrZXkgLT4gRWxlbWVudEhlbHBlci5rZXlFeGlzdHMoa2V5LCBrZXlzKSkKLSAgICAgICAgICAgICAgICAuZmxhdE1hcChrZXkgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4LmdldEJhc2VWZXJ0ZXgoKS5nZXRQcm9wZXJ0eShrZXkpLmVxdWFscyhWRVJURVhfUFJPUEVSVFlfVE9LRU4pKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9yVXRpbHMuc3RyZWFtKHZlcnRleC5nZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akRpcmVjdGlvbi5PVVRHT0lORywgR3JhcGguSGlkZGVuLmhpZGUoa2V5KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVsYXRpb25zaGlwIC0+IChWZXJ0ZXhQcm9wZXJ0eTxWPikgbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih2ZXJ0ZXgsIHJlbGF0aW9uc2hpcC5lbmQoKSkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyZWFtLm9mKG5ldyBOZW80alZlcnRleFByb3BlcnR5PD4odmVydGV4LCBrZXksIChWKSB2ZXJ0ZXguZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KGtleSkpKTsKLSAgICAgICAgICAgICAgICB9KS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8Vj4gVmVydGV4UHJvcGVydHk8Vj4gc2V0VmVydGV4UHJvcGVydHkoZmluYWwgTmVvNGpWZXJ0ZXggdmVydGV4LCBmaW5hbCBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFYgdmFsdWUsIGZpbmFsIE9iamVjdC4uLiBrZXlWYWx1ZXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPFZlcnRleFByb3BlcnR5PFY+PiBvcHRpb25hbFZlcnRleFByb3BlcnR5ID0gRWxlbWVudEhlbHBlci5zdGFnZVZlcnRleFByb3BlcnR5KHZlcnRleCwgY2FyZGluYWxpdHksIGtleSwgdmFsdWUsIGtleVZhbHVlcyk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxWZXJ0ZXhQcm9wZXJ0eS5pc1ByZXNlbnQoKSkgcmV0dXJuIG9wdGlvbmFsVmVydGV4UHJvcGVydHkuZ2V0KCk7Ci0gICAgICAgICAgICBmaW5hbCBOZW80ak5vZGUgbm9kZSA9IHZlcnRleC5nZXRCYXNlVmVydGV4KCk7Ci0gICAgICAgICAgICBmaW5hbCBOZW80akdyYXBoQVBJIGdyYXBoID0gKChOZW80akdyYXBoKSB2ZXJ0ZXguZ3JhcGgoKSkuZ2V0QmFzZUdyYXBoKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ZWRLZXkgPSBHcmFwaC5IaWRkZW4uaGlkZShrZXkpOwotICAgICAgICAgICAgaWYgKG5vZGUuaGFzUHJvcGVydHkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChub2RlLmdldFByb3BlcnR5KGtleSkuZXF1YWxzKFZFUlRFWF9QUk9QRVJUWV9UT0tFTikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTmVvNGpOb2RlIHZlcnRleFByb3BlcnR5Tm9kZSA9IGdyYXBoLmNyZWF0ZU5vZGUoVkVSVEVYX1BST1BFUlRZX0xBQkVMLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkoVC5rZXkuZ2V0QWNjZXNzb3IoKSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgdmVydGV4UHJvcGVydHlOb2RlLnNldFByb3BlcnR5KFQudmFsdWUuZ2V0QWNjZXNzb3IoKSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuY29ubmVjdFRvKHZlcnRleFByb3BlcnR5Tm9kZSwgcHJlZml4ZWRLZXkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBOZW80alZlcnRleFByb3BlcnR5PFY+IHByb3BlcnR5ID0gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih2ZXJ0ZXgsIGtleSwgdmFsdWUsIHZlcnRleFByb3BlcnR5Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRIZWxwZXIuYXR0YWNoUHJvcGVydGllcyhwcm9wZXJ0eSwga2V5VmFsdWVzKTsgLy8gVE9ETzogbWFrZSB0aGlzIGlubGluZWQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgY3VycmVudCBrZXkgdG8gYmUgYSB2ZXJ0ZXggcHJvcGVydHkgbm9kZQotICAgICAgICAgICAgICAgICAgICBOZW80ak5vZGUgdmVydGV4UHJvcGVydHlOb2RlID0gZ3JhcGguY3JlYXRlTm9kZShWRVJURVhfUFJPUEVSVFlfTEFCRUwsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0ZW1wVmFsdWUgPSBub2RlLnJlbW92ZVByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnRleFByb3BlcnR5Tm9kZS5zZXRQcm9wZXJ0eShULmtleS5nZXRBY2Nlc3NvcigpLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkoVC52YWx1ZS5nZXRBY2Nlc3NvcigpLCB0ZW1wVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkoa2V5LCB0ZW1wVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBub2RlLmNvbm5lY3RUbyh2ZXJ0ZXhQcm9wZXJ0eU5vZGUsIHByZWZpeGVkS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRQcm9wZXJ0eShrZXksIFZFUlRFWF9QUk9QRVJUWV9UT0tFTik7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnRleFByb3BlcnR5Tm9kZSA9IGdyYXBoLmNyZWF0ZU5vZGUoVkVSVEVYX1BST1BFUlRZX0xBQkVMLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkoVC5rZXkuZ2V0QWNjZXNzb3IoKSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgdmVydGV4UHJvcGVydHlOb2RlLnNldFByb3BlcnR5KFQudmFsdWUuZ2V0QWNjZXNzb3IoKSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuY29ubmVjdFRvKHZlcnRleFByb3BlcnR5Tm9kZSwgcHJlZml4ZWRLZXkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBOZW80alZlcnRleFByb3BlcnR5PFY+IHByb3BlcnR5ID0gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih2ZXJ0ZXgsIGtleSwgdmFsdWUsIHZlcnRleFByb3BlcnR5Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRIZWxwZXIuYXR0YWNoUHJvcGVydGllcyhwcm9wZXJ0eSwga2V5VmFsdWVzKTsgLy8gVE9ETzogbWFrZSB0aGlzIGlubGluZWQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm9kZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBOZW80alZlcnRleFByb3BlcnR5PFY+IHByb3BlcnR5ID0gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih2ZXJ0ZXgsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIEVsZW1lbnRIZWxwZXIuYXR0YWNoUHJvcGVydGllcyhwcm9wZXJ0eSwga2V5VmFsdWVzKTsgLy8gVE9ETzogbWFrZSB0aGlzIGlubGluZWQKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIHRocm93IFByb3BlcnR5LkV4Y2VwdGlvbnMuZGF0YVR5cGVPZlByb3BlcnR5VmFsdWVOb3RTdXBwb3J0ZWQodmFsdWUsIGlhZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkgZ2V0Q2FyZGluYWxpdHkoZmluYWwgU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkubGlzdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNZXRhUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlVmVydGV4UHJvcGVydHkoZmluYWwgTmVvNGpWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSkgewotICAgICAgICBmaW5hbCBOZW80ak5vZGUgdmVydGV4UHJvcGVydHlOb2RlID0gTmVvNGpIZWxwZXIuZ2V0VmVydGV4UHJvcGVydHlOb2RlKHZlcnRleFByb3BlcnR5KTsKLSAgICAgICAgZmluYWwgTmVvNGpOb2RlIHZlcnRleE5vZGUgPSAoKE5lbzRqVmVydGV4KSB2ZXJ0ZXhQcm9wZXJ0eS5lbGVtZW50KCkpLmdldEJhc2VWZXJ0ZXgoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gdmVydGV4UHJvcGVydHlOb2RlKSB7Ci0gICAgICAgICAgICBpZiAodmVydGV4Tm9kZS5kZWdyZWUoTmVvNGpEaXJlY3Rpb24uT1VUR09JTkcsIEdyYXBoLkhpZGRlbi5oaWRlKHZlcnRleFByb3BlcnR5LmtleSgpKSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhOb2RlLmhhc1Byb3BlcnR5KHZlcnRleFByb3BlcnR5LmtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgdmVydGV4Tm9kZS5yZW1vdmVQcm9wZXJ0eSh2ZXJ0ZXhQcm9wZXJ0eS5rZXkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eU5vZGUucmVsYXRpb25zaGlwcyhOZW80akRpcmVjdGlvbi5CT1RIKS5mb3JFYWNoKE5lbzRqUmVsYXRpb25zaGlwOjpkZWxldGUpOwotICAgICAgICAgICAgdmVydGV4UHJvcGVydHlOb2RlLmRlbGV0ZSgpOwotICAgICAgICAgICAgaWYgKHZlcnRleE5vZGUuZGVncmVlKE5lbzRqRGlyZWN0aW9uLk9VVEdPSU5HLCBHcmFwaC5IaWRkZW4uaGlkZSh2ZXJ0ZXhQcm9wZXJ0eS5rZXkoKSkpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAodmVydGV4Tm9kZS5oYXNQcm9wZXJ0eSh2ZXJ0ZXhQcm9wZXJ0eS5rZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgIHZlcnRleE5vZGUucmVtb3ZlUHJvcGVydHkodmVydGV4UHJvcGVydHkua2V5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBQcm9wZXJ0eTxWPiBzZXRQcm9wZXJ0eShmaW5hbCBOZW80alZlcnRleFByb3BlcnR5IHZlcnRleFByb3BlcnR5LCBmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBWIHZhbHVlKSB7Ci0gICAgICAgIGZpbmFsIE5lbzRqTm9kZSB2ZXJ0ZXhQcm9wZXJ0eU5vZGUgPSBOZW80akhlbHBlci5nZXRWZXJ0ZXhQcm9wZXJ0eU5vZGUodmVydGV4UHJvcGVydHkpOwotICAgICAgICBpZiAobnVsbCAhPSB2ZXJ0ZXhQcm9wZXJ0eU5vZGUpIHsKLSAgICAgICAgICAgIHZlcnRleFByb3BlcnR5Tm9kZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTmVvNGpQcm9wZXJ0eTw+KHZlcnRleFByb3BlcnR5LCBrZXksIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIE5lbzRqTm9kZSB2ZXJ0ZXhOb2RlID0gKChOZW80alZlcnRleCkgdmVydGV4UHJvcGVydHkuZWxlbWVudCgpKS5nZXRCYXNlVmVydGV4KCk7Ci0gICAgICAgICAgICBmaW5hbCBOZW80ak5vZGUgbmV3VmVydGV4UHJvcGVydHlOb2RlID0gKChXcmFwcGVkR3JhcGg8TmVvNGpHcmFwaEFQST4pIHZlcnRleFByb3BlcnR5LmVsZW1lbnQoKS5ncmFwaCgpKS5nZXRCYXNlR3JhcGgoKS5jcmVhdGVOb2RlKFZFUlRFWF9QUk9QRVJUWV9MQUJFTCwgdmVydGV4UHJvcGVydHkubGFiZWwoKSk7Ci0gICAgICAgICAgICBuZXdWZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkoVC5rZXkuZ2V0QWNjZXNzb3IoKSwgdmVydGV4UHJvcGVydHkua2V5KCkpOwotICAgICAgICAgICAgbmV3VmVydGV4UHJvcGVydHlOb2RlLnNldFByb3BlcnR5KFQudmFsdWUuZ2V0QWNjZXNzb3IoKSwgdmVydGV4UHJvcGVydHkudmFsdWUoKSk7Ci0gICAgICAgICAgICBuZXdWZXJ0ZXhQcm9wZXJ0eU5vZGUuc2V0UHJvcGVydHkodmVydGV4UHJvcGVydHkua2V5KCksIHZlcnRleFByb3BlcnR5LnZhbHVlKCkpOwotICAgICAgICAgICAgbmV3VmVydGV4UHJvcGVydHlOb2RlLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgdmVydGV4Tm9kZS5jb25uZWN0VG8obmV3VmVydGV4UHJvcGVydHlOb2RlLCBHcmFwaC5IaWRkZW4uaGlkZSh2ZXJ0ZXhQcm9wZXJ0eS5rZXkoKSkpOwotICAgICAgICAgICAgdmVydGV4Tm9kZS5zZXRQcm9wZXJ0eSh2ZXJ0ZXhQcm9wZXJ0eS5rZXkoKSwgVkVSVEVYX1BST1BFUlRZX1RPS0VOKTsKLSAgICAgICAgICAgIE5lbzRqSGVscGVyLnNldFZlcnRleFByb3BlcnR5Tm9kZSh2ZXJ0ZXhQcm9wZXJ0eSwgbmV3VmVydGV4UHJvcGVydHlOb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTmVvNGpQcm9wZXJ0eTw+KHZlcnRleFByb3BlcnR5LCBrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8Vj4gUHJvcGVydHk8Vj4gZ2V0UHJvcGVydHkoZmluYWwgTmVvNGpWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSwgZmluYWwgU3RyaW5nIGtleSkgewotICAgICAgICBmaW5hbCBOZW80ak5vZGUgdmVydGV4UHJvcGVydHlOb2RlID0gTmVvNGpIZWxwZXIuZ2V0VmVydGV4UHJvcGVydHlOb2RlKHZlcnRleFByb3BlcnR5KTsKLSAgICAgICAgaWYgKG51bGwgIT0gdmVydGV4UHJvcGVydHlOb2RlICYmIHZlcnRleFByb3BlcnR5Tm9kZS5oYXNQcm9wZXJ0eShrZXkpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBOZW80alByb3BlcnR5PD4odmVydGV4UHJvcGVydHksIGtleSwgKFYpIHZlcnRleFByb3BlcnR5Tm9kZS5nZXRQcm9wZXJ0eShrZXkpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFByb3BlcnR5LmVtcHR5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBJdGVyYXRvcjxQcm9wZXJ0eTxWPj4gZ2V0UHJvcGVydGllcyhmaW5hbCBOZW80alZlcnRleFByb3BlcnR5IHZlcnRleFByb3BlcnR5LCBmaW5hbCBTdHJpbmcuLi4ga2V5cykgewotICAgICAgICBmaW5hbCBOZW80ak5vZGUgdmVydGV4UHJvcGVydHlOb2RlID0gTmVvNGpIZWxwZXIuZ2V0VmVydGV4UHJvcGVydHlOb2RlKHZlcnRleFByb3BlcnR5KTsKLSAgICAgICAgaWYgKG51bGwgPT0gdmVydGV4UHJvcGVydHlOb2RlKQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5SXRlcmF0b3IoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9yVXRpbHMuc3RyZWFtKHZlcnRleFByb3BlcnR5Tm9kZS5nZXRLZXlzKCkpCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5IC0+IEVsZW1lbnRIZWxwZXIua2V5RXhpc3RzKGtleSwga2V5cykpCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5IC0+ICFrZXkuZXF1YWxzKHZlcnRleFByb3BlcnR5LmtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgLm1hcChrZXkgLT4gKFByb3BlcnR5PFY+KSBuZXcgTmVvNGpQcm9wZXJ0eTw+KHZlcnRleFByb3BlcnR5LCBrZXksIChWKSB2ZXJ0ZXhQcm9wZXJ0eU5vZGUuZ2V0UHJvcGVydHkoa2V5KSkpLml0ZXJhdG9yKCk7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSXRlcmF0b3I8VmVydGV4PiBsb29rdXBWZXJ0aWNlcyhmaW5hbCBOZW80akdyYXBoIGdyYXBoLCBmaW5hbCBMaXN0PEhhc0NvbnRhaW5lcj4gaGFzQ29udGFpbmVycywgZmluYWwgT2JqZWN0Li4uIGlkcykgewotICAgICAgICAvLyBpZHMgYXJlIHByZXNlbnQsIGZpbHRlciBvbiB0aGVtIGZpcnN0Ci0gICAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHJldHVybiBJdGVyYXRvclV0aWxzLmZpbHRlcihncmFwaC52ZXJ0aWNlcyhpZHMpLCB2ZXJ0ZXggLT4gSGFzQ29udGFpbmVyLnRlc3RBbGwodmVydGV4LCBoYXNDb250YWluZXJzKSk7Ci0gICAgICAgIC8vLy8vLyBkbyBpbmRleCBsb29rdXBzIC8vLy8vLwotICAgICAgICBncmFwaC50eCgpLnJlYWRXcml0ZSgpOwotICAgICAgICAvLyBnZXQgYSBsYWJlbCBiZWluZyBzZWFyY2ggb24KLSAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBsYWJlbCA9IGhhc0NvbnRhaW5lcnMuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAuZmlsdGVyKGhhc0NvbnRhaW5lciAtPiBoYXNDb250YWluZXIuZ2V0S2V5KCkuZXF1YWxzKFQubGFiZWwuZ2V0QWNjZXNzb3IoKSkpCi0gICAgICAgICAgICAgICAgLmZpbHRlcihoYXNDb250YWluZXIgLT4gQ29tcGFyZS5lcSA9PSBoYXNDb250YWluZXIuZ2V0QmlQcmVkaWNhdGUoKSkKLSAgICAgICAgICAgICAgICAubWFwKGhhc0NvbnRhaW5lciAtPiAoU3RyaW5nKSBoYXNDb250YWluZXIuZ2V0VmFsdWUoKSkKLSAgICAgICAgICAgICAgICAuZmluZEFueSgpOwotICAgICAgICBpZiAoIWxhYmVsLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgbGFiZWwgPSBoYXNDb250YWluZXJzLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaGFzQ29udGFpbmVyIC0+IGhhc0NvbnRhaW5lci5nZXRLZXkoKS5lcXVhbHMoVC5sYWJlbC5nZXRBY2Nlc3NvcigpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihoYXNDb250YWluZXIgLT4gaGFzQ29udGFpbmVyLmdldFByZWRpY2F0ZSgpIGluc3RhbmNlb2YgTGFiZWxQKQotICAgICAgICAgICAgICAgICAgICAubWFwKGhhc0NvbnRhaW5lciAtPiAoU3RyaW5nKSBoYXNDb250YWluZXIuZ2V0VmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRBbnkoKTsKLQotICAgICAgICBpZiAobGFiZWwuaXNQcmVzZW50KCkpIHsKLSAgICAgICAgICAgIC8vIGZpbmQgYSB2ZXJ0ZXggYnkgbGFiZWwgYW5kIGtleS92YWx1ZQotICAgICAgICAgICAgZm9yIChmaW5hbCBIYXNDb250YWluZXIgaGFzQ29udGFpbmVyIDogaGFzQ29udGFpbmVycykgewotICAgICAgICAgICAgICAgIGlmIChDb21wYXJlLmVxID09IGhhc0NvbnRhaW5lci5nZXRCaVByZWRpY2F0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmFwaC5nZXRCYXNlR3JhcGgoKS5oYXNTY2hlbWFJbmRleChsYWJlbC5nZXQoKSwgaGFzQ29udGFpbmVyLmdldEtleSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmVhbS5jb25jYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yVXRpbHMuc3RyZWFtKGdyYXBoLmdldEJhc2VHcmFwaCgpLmZpbmROb2RlcyhsYWJlbC5nZXQoKSwgaGFzQ29udGFpbmVyLmdldEtleSgpLCBoYXNDb250YWluZXIuZ2V0VmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihnZXROb2RlUHJlZGljYXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChub2RlIC0+IChWZXJ0ZXgpIG5ldyBOZW80alZlcnRleChub2RlLCBncmFwaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih2ZXJ0ZXggLT4gSGFzQ29udGFpbmVyLnRlc3RBbGwodmVydGV4LCBoYXNDb250YWluZXJzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yVXRpbHMuc3RyZWFtKGdyYXBoLmdldEJhc2VHcmFwaCgpLmZpbmROb2RlcyhWRVJURVhfUFJPUEVSVFlfTEFCRUwsIGhhc0NvbnRhaW5lci5nZXRLZXkoKSwgaGFzQ29udGFpbmVyLmdldFZhbHVlKCkpKSAgLy8gbG9vayB1cCBpbmRleGVkIHZlcnRleCBwcm9wZXJ0eSBub2RlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAobm9kZSAtPiBub2RlLnJlbGF0aW9uc2hpcHMoTmVvNGpEaXJlY3Rpb24uSU5DT01JTkcpLml0ZXJhdG9yKCkubmV4dCgpLnN0YXJ0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChub2RlIC0+IChWZXJ0ZXgpIG5ldyBOZW80alZlcnRleChub2RlLCBncmFwaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih2ZXJ0ZXggLT4gSGFzQ29udGFpbmVyLnRlc3RBbGwodmVydGV4LCBoYXNDb250YWluZXJzKSkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmaW5kIGEgdmVydGV4IGJ5IGxhYmVsCi0gICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JVdGlscy5zdHJlYW0oZ3JhcGguZ2V0QmFzZUdyYXBoKCkuZmluZE5vZGVzKGxhYmVsLmdldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihnZXROb2RlUHJlZGljYXRlKCkpCi0gICAgICAgICAgICAgICAgICAgIC5tYXAobm9kZSAtPiAoVmVydGV4KSBuZXcgTmVvNGpWZXJ0ZXgobm9kZSwgZ3JhcGgpKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHZlcnRleCAtPiBIYXNDb250YWluZXIudGVzdEFsbCh2ZXJ0ZXgsIGhhc0NvbnRhaW5lcnMpKS5pdGVyYXRvcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbGluZWFyIHNjYW4KLSAgICAgICAgICAgIHJldHVybiBJdGVyYXRvclV0aWxzLmZpbHRlcihncmFwaC52ZXJ0aWNlcygpLCB2ZXJ0ZXggLT4gSGFzQ29udGFpbmVyLnRlc3RBbGwodmVydGV4LCBoYXNDb250YWluZXJzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvdHJhaXQvTmVvNGpUcmFpdC5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL3RyYWl0L05lbzRqVHJhaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1YjNhNC4uMDAwMDAwMAotLS0gYS9uZW80ai1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvdHJhaXQvTmVvNGpUcmFpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLnRyYWl0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80alZlcnRleDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80alZlcnRleFByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC51dGlsLkhhc0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7Ci1pbXBvcnQgb3JnLm5lbzRqLnRpbmtlcnBvcC5hcGkuTmVvNGpOb2RlOwotaW1wb3J0IG9yZy5uZW80ai50aW5rZXJwb3AuYXBpLk5lbzRqUmVsYXRpb25zaGlwOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7Ci0KLS8qKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDMuMy44LCBub3QgcmVwbGFjZWQuCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgaW50ZXJmYWNlIE5lbzRqVHJhaXQgewotCi0gICAgcHVibGljIFByZWRpY2F0ZTxOZW80ak5vZGU+IGdldE5vZGVQcmVkaWNhdGUoKTsKLQotICAgIHB1YmxpYyBQcmVkaWNhdGU8TmVvNGpSZWxhdGlvbnNoaXA+IGdldFJlbGF0aW9uc2hpcFByZWRpY2F0ZSgpOwotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlVmVydGV4KGZpbmFsIE5lbzRqVmVydGV4IHZlcnRleCk7Ci0KLSAgICBwdWJsaWMgPFY+IFZlcnRleFByb3BlcnR5PFY+IGdldFZlcnRleFByb3BlcnR5KGZpbmFsIE5lbzRqVmVydGV4IHZlcnRleCwgZmluYWwgU3RyaW5nIGtleSk7Ci0KLSAgICBwdWJsaWMgPFY+IEl0ZXJhdG9yPFZlcnRleFByb3BlcnR5PFY+PiBnZXRWZXJ0ZXhQcm9wZXJ0aWVzKGZpbmFsIE5lbzRqVmVydGV4IHZlcnRleCwgZmluYWwgU3RyaW5nLi4uIGtleXMpOwotCi0gICAgcHVibGljIDxWPiBWZXJ0ZXhQcm9wZXJ0eTxWPiBzZXRWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBOZW80alZlcnRleCB2ZXJ0ZXgsIGZpbmFsIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5IGNhcmRpbmFsaXR5LCBmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBWIHZhbHVlLCBmaW5hbCBPYmplY3QuLi4ga2V5VmFsdWVzKTsKLQotICAgIC8vLy8KLQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTXVsdGlQcm9wZXJ0aWVzKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c01ldGFQcm9wZXJ0aWVzKCk7Ci0KLSAgICBwdWJsaWMgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkgZ2V0Q2FyZGluYWxpdHkoZmluYWwgU3RyaW5nIGtleSk7Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBOZW80alZlcnRleFByb3BlcnR5IHZlcnRleFByb3BlcnR5KTsKLQotICAgIHB1YmxpYyA8Vj4gUHJvcGVydHk8Vj4gc2V0UHJvcGVydHkoZmluYWwgTmVvNGpWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgViB2YWx1ZSk7Ci0KLSAgICBwdWJsaWMgPFY+IFByb3BlcnR5PFY+IGdldFByb3BlcnR5KGZpbmFsIE5lbzRqVmVydGV4UHJvcGVydHkgdmVydGV4UHJvcGVydHksIGZpbmFsIFN0cmluZyBrZXkpOwotCi0gICAgcHVibGljIDxWPiBJdGVyYXRvcjxQcm9wZXJ0eTxWPj4gZ2V0UHJvcGVydGllcyhmaW5hbCBOZW80alZlcnRleFByb3BlcnR5IHZlcnRleFByb3BlcnR5LCBmaW5hbCBTdHJpbmcuLi4ga2V5cyk7Ci0KLSAgICAvLy8vCi0KLSAgICBwdWJsaWMgSXRlcmF0b3I8VmVydGV4PiBsb29rdXBWZXJ0aWNlcyhmaW5hbCBOZW80akdyYXBoIGdyYXBoLCBmaW5hbCBMaXN0PEhhc0NvbnRhaW5lcj4gaGFzQ29udGFpbmVycywgZmluYWwgT2JqZWN0Li4uIGlkcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS90cmFpdC9Ob011bHRpTm9NZXRhTmVvNGpUcmFpdC5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL3RyYWl0L05vTXVsdGlOb01ldGFOZW80alRyYWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTYzMGYuLjAwMDAwMDAKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL3RyYWl0L05vTXVsdGlOb01ldGFOZW80alRyYWl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLnRyYWl0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5wcm9jZXNzLnRyYXZlcnNhbC5MYWJlbFA7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80akhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80alZlcnRleDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80alZlcnRleFByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQ29tcGFyZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAudXRpbC5IYXNDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5FbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udXRpbC5pdGVyYXRvci5JdGVyYXRvclV0aWxzOwotaW1wb3J0IG9yZy5uZW80ai50aW5rZXJwb3AuYXBpLk5lbzRqRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5uZW80ai50aW5rZXJwb3AuYXBpLk5lbzRqTm9kZTsKLWltcG9ydCBvcmcubmVvNGoudGlua2VycG9wLmFwaS5OZW80alJlbGF0aW9uc2hpcDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKLSAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4zLjgsIG5vdCByZXBsYWNlZC4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBmaW5hbCBjbGFzcyBOb011bHRpTm9NZXRhTmVvNGpUcmFpdCBpbXBsZW1lbnRzIE5lbzRqVHJhaXQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9NdWx0aU5vTWV0YU5lbzRqVHJhaXQgSU5TVEFOQ0UgPSBuZXcgTm9NdWx0aU5vTWV0YU5lbzRqVHJhaXQoKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFByZWRpY2F0ZSBUUlVFX1BSRURJQ0FURSA9IHggLT4gdHJ1ZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgTm9NdWx0aU5vTWV0YU5lbzRqVHJhaXQgaW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE5vTXVsdGlOb01ldGFOZW80alRyYWl0KCkgewotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByZWRpY2F0ZTxOZW80ak5vZGU+IGdldE5vZGVQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBUUlVFX1BSRURJQ0FURTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJlZGljYXRlPE5lbzRqUmVsYXRpb25zaGlwPiBnZXRSZWxhdGlvbnNoaXBQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBUUlVFX1BSRURJQ0FURTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVWZXJ0ZXgoZmluYWwgTmVvNGpWZXJ0ZXggdmVydGV4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBOZW80ak5vZGUgbm9kZSA9IHZlcnRleC5nZXRCYXNlVmVydGV4KCk7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIE5lbzRqUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IG5vZGUucmVsYXRpb25zaGlwcyhOZW80akRpcmVjdGlvbi5CT1RIKSkgewotICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUuZGVsZXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIG9uZSBoYXBwZW5zIGlmIHRoZSB2ZXJ0ZXggaXMgc3RpbGwgY2hpbGxpbmcgaW4gdGhlIHR4Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmICghTmVvNGpIZWxwZXIuaXNOb3RGb3VuZChleCkpIHRocm93IGV4OwotICAgICAgICAgICAgLy8gdGhpcyBvbmUgaGFwcGVucyBpZiB0aGUgdmVydGV4IGlzIGNvbW1pdHRlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBWZXJ0ZXhQcm9wZXJ0eTxWPiBnZXRWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBOZW80alZlcnRleCB2ZXJ0ZXgsIGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIHZlcnRleC5nZXRCYXNlVmVydGV4KCkuaGFzUHJvcGVydHkoa2V5KSA/IG5ldyBOZW80alZlcnRleFByb3BlcnR5PD4odmVydGV4LCBrZXksIChWKSB2ZXJ0ZXguZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KGtleSkpIDogVmVydGV4UHJvcGVydHkuPFY+ZW1wdHkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFY+IEl0ZXJhdG9yPFZlcnRleFByb3BlcnR5PFY+PiBnZXRWZXJ0ZXhQcm9wZXJ0aWVzKGZpbmFsIE5lbzRqVmVydGV4IHZlcnRleCwgZmluYWwgU3RyaW5nLi4uIGtleXMpIHsKLSAgICAgICAgcmV0dXJuIChJdGVyYXRvcikgSXRlcmF0b3JVdGlscy5zdHJlYW0odmVydGV4LmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpCi0gICAgICAgICAgICAgICAgLmZpbHRlcihrZXkgLT4gRWxlbWVudEhlbHBlci5rZXlFeGlzdHMoa2V5LCBrZXlzKSkKLSAgICAgICAgICAgICAgICAubWFwKGtleSAtPiBuZXcgTmVvNGpWZXJ0ZXhQcm9wZXJ0eTw+KHZlcnRleCwga2V5LCAoVikgdmVydGV4LmdldEJhc2VWZXJ0ZXgoKS5nZXRQcm9wZXJ0eShrZXkpKSkuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFY+IFZlcnRleFByb3BlcnR5PFY+IHNldFZlcnRleFByb3BlcnR5KGZpbmFsIE5lbzRqVmVydGV4IHZlcnRleCwgZmluYWwgVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkgY2FyZGluYWxpdHksIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFYgdmFsdWUsIGZpbmFsIE9iamVjdC4uLiBrZXlWYWx1ZXMpIHsKLSAgICAgICAgaWYgKGNhcmRpbmFsaXR5ICE9IFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZSkKLSAgICAgICAgICAgIHRocm93IFZlcnRleFByb3BlcnR5LkV4Y2VwdGlvbnMubXVsdGlQcm9wZXJ0aWVzTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIGlmIChrZXlWYWx1ZXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHRocm93IFZlcnRleFByb3BlcnR5LkV4Y2VwdGlvbnMubWV0YVByb3BlcnRpZXNOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZlcnRleC5nZXRCYXNlVmVydGV4KCkuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5lbzRqVmVydGV4UHJvcGVydHk8Pih2ZXJ0ZXgsIGtleSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICB0aHJvdyBQcm9wZXJ0eS5FeGNlcHRpb25zLmRhdGFUeXBlT2ZQcm9wZXJ0eVZhbHVlTm90U3VwcG9ydGVkKHZhbHVlLCBpYWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5IGdldENhcmRpbmFsaXR5KGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWV0YVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBOZW80alZlcnRleFByb3BlcnR5IHZlcnRleFByb3BlcnR5KSB7Ci0gICAgICAgIGZpbmFsIE5lbzRqTm9kZSBub2RlID0gKChOZW80alZlcnRleCkgdmVydGV4UHJvcGVydHkuZWxlbWVudCgpKS5nZXRCYXNlVmVydGV4KCk7Ci0gICAgICAgIGlmIChub2RlLmhhc1Byb3BlcnR5KHZlcnRleFByb3BlcnR5LmtleSgpKSkKLSAgICAgICAgICAgIG5vZGUucmVtb3ZlUHJvcGVydHkodmVydGV4UHJvcGVydHkua2V5KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8Vj4gUHJvcGVydHk8Vj4gc2V0UHJvcGVydHkoZmluYWwgTmVvNGpWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgViB2YWx1ZSkgewotICAgICAgICB0aHJvdyBWZXJ0ZXhQcm9wZXJ0eS5FeGNlcHRpb25zLm1ldGFQcm9wZXJ0aWVzTm90U3VwcG9ydGVkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxWPiBQcm9wZXJ0eTxWPiBnZXRQcm9wZXJ0eShmaW5hbCBOZW80alZlcnRleFByb3BlcnR5IHZlcnRleFByb3BlcnR5LCBmaW5hbCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRocm93IFZlcnRleFByb3BlcnR5LkV4Y2VwdGlvbnMubWV0YVByb3BlcnRpZXNOb3RTdXBwb3J0ZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFY+IEl0ZXJhdG9yPFByb3BlcnR5PFY+PiBnZXRQcm9wZXJ0aWVzKGZpbmFsIE5lbzRqVmVydGV4UHJvcGVydHkgdmVydGV4UHJvcGVydHksIGZpbmFsIFN0cmluZy4uLiBrZXlzKSB7Ci0gICAgICAgIHRocm93IFZlcnRleFByb3BlcnR5LkV4Y2VwdGlvbnMubWV0YVByb3BlcnRpZXNOb3RTdXBwb3J0ZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSXRlcmF0b3I8VmVydGV4PiBsb29rdXBWZXJ0aWNlcyhmaW5hbCBOZW80akdyYXBoIGdyYXBoLCBmaW5hbCBMaXN0PEhhc0NvbnRhaW5lcj4gaGFzQ29udGFpbmVycywgZmluYWwgT2JqZWN0Li4uIGlkcykgewotICAgICAgICAvLyBpZHMgYXJlIHByZXNlbnQsIGZpbHRlciBvbiB0aGVtIGZpcnN0Ci0gICAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHJldHVybiBJdGVyYXRvclV0aWxzLmZpbHRlcihncmFwaC52ZXJ0aWNlcyhpZHMpLCB2ZXJ0ZXggLT4gSGFzQ29udGFpbmVyLnRlc3RBbGwodmVydGV4LCBoYXNDb250YWluZXJzKSk7Ci0gICAgICAgIC8vLy8vLyBkbyBpbmRleCBsb29rdXBzIC8vLy8vLwotICAgICAgICBncmFwaC50eCgpLnJlYWRXcml0ZSgpOwotICAgICAgICAvLyBnZXQgYSBsYWJlbCBiZWluZyBzZWFyY2ggb24KLSAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBsYWJlbCA9IGhhc0NvbnRhaW5lcnMuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAuZmlsdGVyKGhhc0NvbnRhaW5lciAtPiBoYXNDb250YWluZXIuZ2V0S2V5KCkuZXF1YWxzKFQubGFiZWwuZ2V0QWNjZXNzb3IoKSkpCi0gICAgICAgICAgICAgICAgLmZpbHRlcihoYXNDb250YWluZXIgLT4gQ29tcGFyZS5lcSA9PSBoYXNDb250YWluZXIuZ2V0QmlQcmVkaWNhdGUoKSkKLSAgICAgICAgICAgICAgICAubWFwKGhhc0NvbnRhaW5lciAtPiAoU3RyaW5nKSBoYXNDb250YWluZXIuZ2V0VmFsdWUoKSkKLSAgICAgICAgICAgICAgICAuZmluZEFueSgpOwotICAgICAgICBpZiAoIWxhYmVsLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgbGFiZWwgPSBoYXNDb250YWluZXJzLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaGFzQ29udGFpbmVyIC0+IGhhc0NvbnRhaW5lci5nZXRLZXkoKS5lcXVhbHMoVC5sYWJlbC5nZXRBY2Nlc3NvcigpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihoYXNDb250YWluZXIgLT4gaGFzQ29udGFpbmVyLmdldFByZWRpY2F0ZSgpIGluc3RhbmNlb2YgTGFiZWxQKQotICAgICAgICAgICAgICAgICAgICAubWFwKGhhc0NvbnRhaW5lciAtPiAoU3RyaW5nKSBoYXNDb250YWluZXIuZ2V0VmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRBbnkoKTsKLQotICAgICAgICBpZiAobGFiZWwuaXNQcmVzZW50KCkpIHsKLSAgICAgICAgICAgIC8vIGZpbmQgYSB2ZXJ0ZXggYnkgbGFiZWwgYW5kIGtleS92YWx1ZQotICAgICAgICAgICAgZm9yIChmaW5hbCBIYXNDb250YWluZXIgaGFzQ29udGFpbmVyIDogaGFzQ29udGFpbmVycykgewotICAgICAgICAgICAgICAgIGlmIChDb21wYXJlLmVxID09IGhhc0NvbnRhaW5lci5nZXRCaVByZWRpY2F0ZSgpICYmICFoYXNDb250YWluZXIuZ2V0S2V5KCkuZXF1YWxzKFQubGFiZWwuZ2V0QWNjZXNzb3IoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdyYXBoLmdldEJhc2VHcmFwaCgpLmhhc1NjaGVtYUluZGV4KGxhYmVsLmdldCgpLCBoYXNDb250YWluZXIuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JVdGlscy5zdHJlYW0oZ3JhcGguZ2V0QmFzZUdyYXBoKCkuZmluZE5vZGVzKGxhYmVsLmdldCgpLCBoYXNDb250YWluZXIuZ2V0S2V5KCksIGhhc0NvbnRhaW5lci5nZXRWYWx1ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChub2RlIC0+IChWZXJ0ZXgpIG5ldyBOZW80alZlcnRleChub2RlLCBncmFwaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodmVydGV4IC0+IEhhc0NvbnRhaW5lci50ZXN0QWxsKHZlcnRleCwgaGFzQ29udGFpbmVycykpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmaW5kIGEgdmVydGV4IGJ5IGxhYmVsCi0gICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JVdGlscy5zdHJlYW0oZ3JhcGguZ2V0QmFzZUdyYXBoKCkuZmluZE5vZGVzKGxhYmVsLmdldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgLm1hcChub2RlIC0+IChWZXJ0ZXgpIG5ldyBOZW80alZlcnRleChub2RlLCBncmFwaCkpCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodmVydGV4IC0+IEhhc0NvbnRhaW5lci50ZXN0QWxsKHZlcnRleCwgaGFzQ29udGFpbmVycykpLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBsaW5lYXIgc2NhbgotICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9yVXRpbHMuZmlsdGVyKGdyYXBoLnZlcnRpY2VzKCksIHZlcnRleCAtPiBIYXNDb250YWluZXIudGVzdEFsbCh2ZXJ0ZXgsIGhhc0NvbnRhaW5lcnMpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL0Fic3RyYWN0TmVvNGpHcmFwaFByb3ZpZGVyLmphdmEgYi9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9BYnN0cmFjdE5lbzRqR3JhcGhQcm92aWRlci5qYXZhCmluZGV4IDk4ZTFmNWIuLjdlYmQzZWMgMTAwNjQ0Ci0tLSBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL0Fic3RyYWN0TmVvNGpHcmFwaFByb3ZpZGVyLmphdmEKKysrIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovQWJzdHJhY3ROZW80akdyYXBoUHJvdmlkZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGo7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uQWJzdHJhY3RHcmFwaFByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CkBAIC0xMTIsMTAgKzExMiw2IEBACiAgICAgICAgICAgICBncmFwaC5jeXBoZXIoIkRST1AgSU5ERVggT04gOnZlcnRleChhZ2UpIikuaXRlcmF0ZSgpOwogICAgICAgICAgICAgZ3JhcGguY3lwaGVyKCJEUk9QIElOREVYIE9OIDp2ZXJ0ZXgobGFuZykiKS5pdGVyYXRlKCk7CiAgICAgICAgICAgICBncmFwaC50eCgpLmNvbW1pdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETzogYWRkIENSRVcgd29yayBoZXJlLgotICAgICAgICAgICAgLy8gVE9ETzogYWRkIG1ldGFfcHJvcGVydHkgaW5kaWNlcyB3aGVuIG1ldGFfcHJvcGVydHkgZ3JhcGggaXMgcHJvdmlkZWQKLSAgICAgICAgICAgIC8vdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGdyYXBoIHdpdGggIiArIGdyYXBoRGF0YSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2MCwxMCArMTU2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgZ3JhcGguY3lwaGVyKCJDUkVBVEUgSU5ERVggT04gOnZlcnRleChsYW5nKSIpLml0ZXJhdGUoKTsKICAgICAgICAgICAgICAgICBncmFwaC50eCgpLmNvbW1pdCgpOwogICAgICAgICAgICAgfSAvLyBlbHNlIG5vIGluZGljZXMKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBDUkVXIHdvcmsgaGVyZS4KLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtZXRhX3Byb3BlcnR5IGluZGljZXMgd2hlbiBtZXRhX3Byb3BlcnR5IGdyYXBoIGlzIHByb3ZpZGVkCi0gICAgICAgICAgICAvL3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBncmFwaCB3aXRoICIgKyBncmFwaERhdGEpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9NdWx0aU1ldGFOZW80akdyYXBoTmF0aXZlTmVvNGpUZXN0LmphdmEgYi9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9NdWx0aU1ldGFOZW80akdyYXBoTmF0aXZlTmVvNGpUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2FhOWIuLjAwMDAwMDAKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovTXVsdGlNZXRhTmVvNGpHcmFwaE5hdGl2ZU5lbzRqVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoUHJvdmlkZXJDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLk11bHRpTWV0YU5lbzRqR3JhcGhQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLk5hdGl2ZU5lbzRqU3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci0KLS8qKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKi8KLUBSdW5XaXRoKE5hdGl2ZU5lbzRqU3VpdGUuY2xhc3MpCi1AR3JhcGhQcm92aWRlckNsYXNzKHByb3ZpZGVyID0gTXVsdGlNZXRhTmVvNGpHcmFwaFByb3ZpZGVyLmNsYXNzLCBncmFwaCA9IE5lbzRqR3JhcGguY2xhc3MpCi1wdWJsaWMgY2xhc3MgTXVsdGlNZXRhTmVvNGpHcmFwaE5hdGl2ZU5lbzRqVGVzdCB7Ci19CmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9NdWx0aU1ldGFOZW80akdyYXBoUHJvdmlkZXIuamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL011bHRpTWV0YU5lbzRqR3JhcGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2YwODJjLi4wMDAwMDAwCi0tLSBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL011bHRpTWV0YU5lbzRqR3JhcGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkxvYWRHcmFwaFdpdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlNZXRhTmVvNGpHcmFwaFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3ROZW80akdyYXBoUHJvdmlkZXIgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEJhc2VDb25maWd1cmF0aW9uKGZpbmFsIFN0cmluZyBncmFwaE5hbWUsIGZpbmFsIENsYXNzPD8+IHRlc3QsIGZpbmFsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSwgZmluYWwgTG9hZEdyYXBoV2l0aC5HcmFwaERhdGEgZ3JhcGhEYXRhKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXJlY3RvcnkgPSBtYWtlVGVzdERpcmVjdG9yeShncmFwaE5hbWUsIHRlc3QsIHRlc3RNZXRob2ROYW1lKTsKLQotICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKLSAgICAgICAgICAgIHB1dChHcmFwaC5HUkFQSCwgTmVvNGpHcmFwaC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgcHV0KE5lbzRqR3JhcGguQ09ORklHX0RJUkVDVE9SWSwgZGlyZWN0b3J5KTsKLSAgICAgICAgICAgIHB1dChOZW80akdyYXBoLkNPTkZJR19NRVRBX1BST1BFUlRJRVMsIHRydWUpOwotICAgICAgICAgICAgcHV0KE5lbzRqR3JhcGguQ09ORklHX01VTFRJX1BST1BFUlRJRVMsIHRydWUpOwotICAgICAgICAgICAgcHV0KE5lbzRqR3JhcGguQ09ORklHX0NPTkYgKyAiLmRibXMubWVtb3J5LnBhZ2VjYWNoZS5zaXplIiwgIjFtIik7Ci0gICAgICAgIH19OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL05lbzRqR3JhcGhOYXRpdmVOZW80alRlc3QuamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL05lbzRqR3JhcGhOYXRpdmVOZW80alRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEyZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovTmVvNGpHcmFwaE5hdGl2ZU5lbzRqVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqOworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyQ2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCisgKi8KK0BSdW5XaXRoKE5hdGl2ZU5lbzRqU3VpdGUuY2xhc3MpCitAR3JhcGhQcm92aWRlckNsYXNzKHByb3ZpZGVyID0gTmVvNGpHcmFwaFByb3ZpZGVyLmNsYXNzLCBncmFwaCA9IE5lbzRqR3JhcGguY2xhc3MpCitwdWJsaWMgY2xhc3MgTmVvNGpHcmFwaE5hdGl2ZU5lbzRqVGVzdCB7Cit9CmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9OZW80akdyYXBoUHJvdmlkZXIuamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL05lbzRqR3JhcGhQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWQyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9OZW80akdyYXBoUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ajsKKworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80akdyYXBoOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworcHVibGljIGNsYXNzIE5lbzRqR3JhcGhQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TmVvNGpHcmFwaFByb3ZpZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRCYXNlQ29uZmlndXJhdGlvbihmaW5hbCBTdHJpbmcgZ3JhcGhOYW1lLCBmaW5hbCBDbGFzczw/PiB0ZXN0LCBmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUsIGZpbmFsIExvYWRHcmFwaFdpdGguR3JhcGhEYXRhIGdyYXBoRGF0YSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZGlyZWN0b3J5ID0gbWFrZVRlc3REaXJlY3RvcnkoZ3JhcGhOYW1lLCB0ZXN0LCB0ZXN0TWV0aG9kTmFtZSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHt7CisgICAgICAgICAgICBwdXQoR3JhcGguR1JBUEgsIE5lbzRqR3JhcGguY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHB1dChOZW80akdyYXBoLkNPTkZJR19ESVJFQ1RPUlksIGRpcmVjdG9yeSk7CisgICAgICAgICAgICBwdXQoTmVvNGpHcmFwaC5DT05GSUdfQ09ORiArICIuZGJtcy5tZW1vcnkucGFnZWNhY2hlLnNpemUiLCAiMW0iKTsKKyAgICAgICAgfX07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhOYXRpdmVOZW80alRlc3QuamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL05vTXVsdGlOb01ldGFOZW80akdyYXBoTmF0aXZlTmVvNGpUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODY2ODUuLjAwMDAwMDAKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhOYXRpdmVOZW80alRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5OYXRpdmVOZW80alN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS5OZW80akdyYXBoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQotLyoqCi0gKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKLSAqLwotQFJ1bldpdGgoTmF0aXZlTmVvNGpTdWl0ZS5jbGFzcykKLUBHcmFwaFByb3ZpZGVyQ2xhc3MocHJvdmlkZXIgPSBOb011bHRpTm9NZXRhTmVvNGpHcmFwaFByb3ZpZGVyLmNsYXNzLCBncmFwaCA9IE5lbzRqR3JhcGguY2xhc3MpCi1wdWJsaWMgY2xhc3MgTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhOYXRpdmVOZW80alRlc3QgewotfQpkaWZmIC0tZ2l0IGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhQcm92aWRlci5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGIwMTVlLi4wMDAwMDAwCi0tLSBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL05vTXVsdGlOb01ldGFOZW80akdyYXBoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5Mb2FkR3JhcGhXaXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLk5lbzRqR3JhcGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1wdWJsaWMgY2xhc3MgTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TmVvNGpHcmFwaFByb3ZpZGVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRCYXNlQ29uZmlndXJhdGlvbihmaW5hbCBTdHJpbmcgZ3JhcGhOYW1lLCBmaW5hbCBDbGFzczw/PiB0ZXN0LCBmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUsIGZpbmFsIExvYWRHcmFwaFdpdGguR3JhcGhEYXRhIGdyYXBoRGF0YSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgZGlyZWN0b3J5ID0gbWFrZVRlc3REaXJlY3RvcnkoZ3JhcGhOYW1lLCB0ZXN0LCB0ZXN0TWV0aG9kTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHt7Ci0gICAgICAgICAgICBwdXQoR3JhcGguR1JBUEgsIE5lbzRqR3JhcGguY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHB1dChOZW80akdyYXBoLkNPTkZJR19ESVJFQ1RPUlksIGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICBwdXQoTmVvNGpHcmFwaC5DT05GSUdfTUVUQV9QUk9QRVJUSUVTLCBmYWxzZSk7Ci0gICAgICAgICAgICBwdXQoTmVvNGpHcmFwaC5DT05GSUdfTVVMVElfUFJPUEVSVElFUywgZmFsc2UpOwotICAgICAgICAgICAgcHV0KE5lbzRqR3JhcGguQ09ORklHX0NPTkYgKyAiLmRibXMubWVtb3J5LnBhZ2VjYWNoZS5zaXplIiwgIjFtIik7Ci0gICAgICAgIH19OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3Byb2Nlc3MvTXVsdGlNZXRhTmVvNGpHcmFwaFByb2Nlc3NTdGFuZGFyZFRlc3QuamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3Byb2Nlc3MvTXVsdGlNZXRhTmVvNGpHcmFwaFByb2Nlc3NTdGFuZGFyZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmN2I4My4uMDAwMDAwMAotLS0gYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9wcm9jZXNzL011bHRpTWV0YU5lbzRqR3JhcGhQcm9jZXNzU3RhbmRhcmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaFByb3ZpZGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5NdWx0aU1ldGFOZW80akdyYXBoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuUHJvY2Vzc1N0YW5kYXJkU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotCi0KLS8qKgotICogRXhlY3V0ZXMgdGhlIFN0YW5kYXJkIEdyZW1saW4gU3RydWN0dXJlIFRlc3QgU3VpdGUgdXNpbmcgTmVvNGouCi0gKgotICogQGF1dGhvciBTdGVwaGVuIE1hbGxldHRlIChodHRwOi8vc3RlcGhlbi5nZW5vcHJpbWUuY29tKQotICovCi1AUnVuV2l0aChQcm9jZXNzU3RhbmRhcmRTdWl0ZS5jbGFzcykKLUBHcmFwaFByb3ZpZGVyQ2xhc3MocHJvdmlkZXIgPSBNdWx0aU1ldGFOZW80akdyYXBoUHJvdmlkZXIuY2xhc3MsIGdyYXBoID0gTmVvNGpHcmFwaC5jbGFzcykKLXB1YmxpYyBjbGFzcyBNdWx0aU1ldGFOZW80akdyYXBoUHJvY2Vzc1N0YW5kYXJkVGVzdCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovcHJvY2Vzcy9OZW80akdyYXBoUHJvY2Vzc1N0YW5kYXJkVGVzdC5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovcHJvY2Vzcy9OZW80akdyYXBoUHJvY2Vzc1N0YW5kYXJkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMmU4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9wcm9jZXNzL05lbzRqR3JhcGhQcm9jZXNzU3RhbmRhcmRUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGoucHJvY2VzczsKKworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uR3JhcGhQcm92aWRlckNsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouTmVvNGpHcmFwaFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ubmVvNGouc3RydWN0dXJlLk5lbzRqR3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLlByb2Nlc3NTdGFuZGFyZFN1aXRlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworQFJ1bldpdGgoUHJvY2Vzc1N0YW5kYXJkU3VpdGUuY2xhc3MpCitAR3JhcGhQcm92aWRlckNsYXNzKHByb3ZpZGVyID0gTmVvNGpHcmFwaFByb3ZpZGVyLmNsYXNzLCBncmFwaCA9IE5lbzRqR3JhcGguY2xhc3MpCitwdWJsaWMgY2xhc3MgTmVvNGpHcmFwaFByb2Nlc3NTdGFuZGFyZFRlc3QgeworfQpkaWZmIC0tZ2l0IGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovcHJvY2Vzcy9Ob011bHRpTm9NZXRhTmVvNGpHcmFwaFByb2Nlc3NTdGFuZGFyZFRlc3QuamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3Byb2Nlc3MvTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhQcm9jZXNzU3RhbmRhcmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjYwYmUuLjAwMDAwMDAKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovcHJvY2Vzcy9Ob011bHRpTm9NZXRhTmVvNGpHcmFwaFByb2Nlc3NTdGFuZGFyZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoUHJvdmlkZXJDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLk5vTXVsdGlOb01ldGFOZW80akdyYXBoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmUuTmVvNGpHcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuUHJvY2Vzc1N0YW5kYXJkU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotCi0vKioKLSAqIEBhdXRob3IgTWFya28gQS4gUm9kcmlndWV6IChodHRwOi8vbWFya29yb2RyaWd1ZXouY29tKQotICovCi1AUnVuV2l0aChQcm9jZXNzU3RhbmRhcmRTdWl0ZS5jbGFzcykKLUBHcmFwaFByb3ZpZGVyQ2xhc3MocHJvdmlkZXIgPSBOb011bHRpTm9NZXRhTmVvNGpHcmFwaFByb3ZpZGVyLmNsYXNzLCBncmFwaCA9IE5lbzRqR3JhcGguY2xhc3MpCi1wdWJsaWMgY2xhc3MgTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhQcm9jZXNzU3RhbmRhcmRUZXN0IHsKLX0KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9NdWx0aU1ldGFOZW80akdyYXBoU3RydWN0dXJlU3RhbmRhcmRUZXN0LmphdmEgYi9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTXVsdGlNZXRhTmVvNGpHcmFwaFN0cnVjdHVyZVN0YW5kYXJkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTU2ZjI4Li4wMDAwMDAwCi0tLSBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9NdWx0aU1ldGFOZW80akdyYXBoU3RydWN0dXJlU3RhbmRhcmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoUHJvdmlkZXJDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLk11bHRpTWV0YU5lbzRqR3JhcGhQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5TdHJ1Y3R1cmVTdGFuZGFyZFN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQotCi0vKioKLSAqIEV4ZWN1dGVzIHRoZSBTdGFuZGFyZCBHcmVtbGluIFN0cnVjdHVyZSBUZXN0IFN1aXRlIHVzaW5nIE5lbzRqLgotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKLSAqLwotQFJ1bldpdGgoU3RydWN0dXJlU3RhbmRhcmRTdWl0ZS5jbGFzcykKLUBHcmFwaFByb3ZpZGVyQ2xhc3MocHJvdmlkZXIgPSBNdWx0aU1ldGFOZW80akdyYXBoUHJvdmlkZXIuY2xhc3MsIGdyYXBoID0gTmVvNGpHcmFwaC5jbGFzcykKLXB1YmxpYyBjbGFzcyBNdWx0aU1ldGFOZW80akdyYXBoU3RydWN0dXJlU3RhbmRhcmRUZXN0IHsKLX0KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OYXRpdmVOZW80akluZGV4Q2hlY2suamF2YSBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OYXRpdmVOZW80akluZGV4Q2hlY2suamF2YQppbmRleCAzNTkxODA0Li4zZjhmNmJkIDEwMDY0NAotLS0gYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmF0aXZlTmVvNGpJbmRleENoZWNrLmphdmEKKysrIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05hdGl2ZU5lbzRqSW5kZXhDaGVjay5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkZlYXR1cmVSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLkFic3RyYWN0TmVvNGpHcmVtbGluVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS50cmFpdC5NdWx0aU1ldGFOZW80alRyYWl0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuUDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKQEAgLTgzLDQ3ICs4Miw2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9NVUxUSV9QUk9QRVJUSUVTKQotICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX01FVEFfUFJPUEVSVElFUykKLSAgICBwdWJsaWMgdm9pZCBzaG91bGRIYXZlRmFzdGVyUnVudGltZVdpdGhMYWJlbEtleVZhbHVlSW5kZXhPbk11bHRpUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBOZW80akdyYXBoIG5lbzRqID0gKE5lbzRqR3JhcGgpIHRoaXMuZ3JhcGg7Ci0gICAgICAgIGludCBtYXhWZXJ0aWNlcyA9IDEwMDAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFZlcnRpY2VzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpICUgMiA9PSAwKQotICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGguYWRkVmVydGV4KFQubGFiZWwsICJzb21ldGhpbmciLCAibXlJZCIsIGksICJteUlkIiwgaSArIG1heFZlcnRpY2VzICsgMSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhpcy5ncmFwaC5hZGRWZXJ0ZXgoVC5sYWJlbCwgIm5vdGhpbmciLCAibXlJZCIsIGksICJteUlkIiwgaSArIG1heFZlcnRpY2VzICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5ncmFwaC50eCgpLmNvbW1pdCgpOwotCi0gICAgICAgIC8vIHRyYXZlcnNhbAotICAgICAgICBmaW5hbCBSdW5uYWJsZSB0cmF2ZXJzYWwgPSAoKSAtPiB7Ci0gICAgICAgICAgICBmaW5hbCBUcmF2ZXJzYWw8VmVydGV4LCBWZXJ0ZXg+IHQgPSBnLlYoKS5oYXNMYWJlbCgic29tZXRoaW5nIikuaGFzKCJteUlkIiwgMjAwMCArIG1heFZlcnRpY2VzICsgMSk7Ci0gICAgICAgICAgICBmaW5hbCBWZXJ0ZXggdmVydGV4ID0gdC50cnlOZXh0KCkuZ2V0KCk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSh0Lmhhc05leHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgSXRlcmF0b3JVdGlscy5jb3VudCh2ZXJ0ZXgucHJvcGVydGllcygibXlJZCIpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNvbWV0aGluZyIsIHZlcnRleC5sYWJlbCgpKTsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBubyBpbmRleAotICAgICAgICB0aGlzLmdyYXBoLnR4KCkucmVhZFdyaXRlKCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHRoaXMuZ2V0QmFzZUdyYXBoKCkuaGFzU2NoZW1hSW5kZXgoInNvbWV0aGluZyIsICJteUlkIikpOwotICAgICAgICBUaW1lVXRpbC5jbG9jaygyMCwgdHJhdmVyc2FsKTsKLSAgICAgICAgZmluYWwgZG91YmxlIG5vSW5kZXhUaW1lID0gVGltZVV0aWwuY2xvY2soMjAsIHRyYXZlcnNhbCk7Ci0gICAgICAgIC8vIGluZGV4IHRpbWUKLSAgICAgICAgbmVvNGouY3lwaGVyKCJDUkVBVEUgSU5ERVggT04gOnNvbWV0aGluZyhteUlkKSIpLml0ZXJhdGUoKTsKLSAgICAgICAgbmVvNGouY3lwaGVyKCJDUkVBVEUgSU5ERVggT04gOnZlcnRleFByb3BlcnR5KG15SWQpIikuaXRlcmF0ZSgpOwotICAgICAgICB0aGlzLmdyYXBoLnR4KCkuY29tbWl0KCk7Ci0gICAgICAgIHRoaXMuZ3JhcGgudHgoKS5yZWFkV3JpdGUoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOyAvLyB3YWl0IGZvciBpbmRpY2VzIHRvIGJlIGJ1aWx0Ci0gICAgICAgIGFzc2VydFRydWUodGhpcy5nZXRCYXNlR3JhcGgoKS5oYXNTY2hlbWFJbmRleCgic29tZXRoaW5nIiwgIm15SWQiKSk7Ci0gICAgICAgIFRpbWVVdGlsLmNsb2NrKDIwLCB0cmF2ZXJzYWwpOwotICAgICAgICBmaW5hbCBkb3VibGUgaW5kZXhUaW1lID0gVGltZVV0aWwuY2xvY2soMjAsIHRyYXZlcnNhbCk7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJRdWVyeSB0aW1lIChuby1pbmRleCB2cy4gaW5kZXgpOiB7fSIsIG5vSW5kZXhUaW1lICsgIiB2cy4ge30iLCBpbmRleFRpbWUpOwotICAgICAgICBhc3NlcnRUcnVlKChub0luZGV4VGltZSAvIDEwKSA+IGluZGV4VGltZSk7IC8vIHNob3VsZCBiZSBhdCBsZWFzdCAxMHggZmFzdGVyCi0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRSZXR1cm5SZXN1bHRzTGFiZWxlZEluZGV4T25WZXJ0ZXhXaXRoSGFzSGFzKCkgewogICAgICAgICB0aGlzLmdyYXBoLnR4KCkucmVhZFdyaXRlKCk7CiAgICAgICAgIHRoaXMuZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiQ1JFQVRFIElOREVYIE9OIDpQZXJzb24obmFtZSkiLCBudWxsKTsKQEAgLTI4OSw2MSArMjQ3LDYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX01VTFRJX1BST1BFUlRJRVMpCi0gICAgcHVibGljIHZvaWQgc2hvdWxkU3VwcG9ydFZlcnRleFByb3BlcnR5VG9WZXJ0ZXhNYXBwaW5nT25JbmRleENhbGxzKCkgewotICAgICAgICBncmFwaC50eCgpLnJlYWRXcml0ZSgpOwotICAgICAgICB0aGlzLmdldEJhc2VHcmFwaCgpLmV4ZWN1dGUoIkNSRUFURSBJTkRFWCBPTiA6cGVyc29uKG5hbWUpIiwgbnVsbCk7Ci0vLyAgICAgICAgICAgIHRoaXMuZ3JhcGguZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiQ1JFQVRFIElOREVYIE9OIDpuYW1lKCIgKyBULnZhbHVlLmdldEFjY2Vzc29yKCkgKyAiKSIsIG51bGwpOwotICAgICAgICB0aGlzLmdyYXBoLnR4KCkuY29tbWl0KCk7Ci0KLSAgICAgICAgZmluYWwgVmVydGV4IGEgPSBncmFwaC5hZGRWZXJ0ZXgoVC5sYWJlbCwgInBlcnNvbiIsICJuYW1lIiwgIm1hcmtvIiwgImFnZSIsIDM0KTsKLSAgICAgICAgYS5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5saXN0LCAibmFtZSIsICJva3JhbSIpOwotICAgICAgICBhLnByb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5Lmxpc3QsICJuYW1lIiwgIm1hcmtvIGEuIHJvZHJpZ3VleiIpOwotICAgICAgICBmaW5hbCBWZXJ0ZXggYiA9IGdyYXBoLmFkZFZlcnRleChULmxhYmVsLCAicGVyc29uIiwgIm5hbWUiLCAic3RlcGhlbiIpOwotICAgICAgICBmaW5hbCBWZXJ0ZXggYyA9IGdyYXBoLmFkZFZlcnRleCgibmFtZSIsICJtYXR0aGlhcyIsICJuYW1lIiwgIm1icm9lY2hlbGVyIik7Ci0KLSAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYS5pZCgpLCBnLlYoKS5oYXMoInBlcnNvbiIsICJuYW1lIiwgIm9rcmFtIikuaWQoKS5uZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAib2tyYW0iKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzNCwgKChOZW80alZlcnRleCkgZy5WKCkuaGFzKCJwZXJzb24iLCAibmFtZSIsICJva3JhbSIpLm5leHQoKSkuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJhZ2UiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoTXVsdGlNZXRhTmVvNGpUcmFpdC5WRVJURVhfUFJPUEVSVFlfVE9LRU4sICgoTmVvNGpWZXJ0ZXgpIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAib2tyYW0iKS5uZXh0KCkpLmdldEJhc2VWZXJ0ZXgoKS5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKLSAgICAgICAgICAgIC8vLwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGIuaWQoKSwgZy5WKCkuaGFzKCJwZXJzb24iLCAibmFtZSIsICJzdGVwaGVuIikuaWQoKS5uZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAic3RlcGhlbiIpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGVwaGVuIiwgKChOZW80alZlcnRleCkgZy5WKCkuaGFzKCJwZXJzb24iLCAibmFtZSIsICJzdGVwaGVuIikubmV4dCgpKS5nZXRCYXNlVmVydGV4KCkuZ2V0UHJvcGVydHkoIm5hbWUiKSk7Ci0gICAgICAgICAgICAvLy8KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjLmlkKCksIGcuVigpLmhhcygibmFtZSIsICJtYXR0aGlhcyIpLmlkKCkubmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjLmlkKCksIGcuVigpLmhhcygibmFtZSIsICJtYnJvZWNoZWxlciIpLmlkKCkubmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBnLlYoKS5oYXMoIm5hbWUiLCAibWF0dGhpYXMiKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBnLlYoKS5oYXMoIm5hbWUiLCAibWJyb2VjaGVsZXIiKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBnLlYoKS5oYXMoInBlcnNvbiIsICJuYW1lIiwgIm1hdHRoaWFzIikuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZy5WKCkuaGFzKCJwZXJzb24iLCAibmFtZSIsICJtYnJvZWNoZWxlciIpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICB9KTsKLQotICAgICAgICBmaW5hbCBWZXJ0ZXggZCA9IGdyYXBoLmFkZFZlcnRleChULmxhYmVsLCAicGVyc29uIiwgIm5hbWUiLCAia3VwcGl0eiIpOwotICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGdyYXBoIC0+IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkLmlkKCksIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAia3VwcGl0eiIpLmlkKCkubmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygia3VwcGl0eiIsICgoTmVvNGpWZXJ0ZXgpIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAia3VwcGl0eiIpLm5leHQoKSkuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJuYW1lIikpOwotICAgICAgICB9KTsKLSAgICAgICAgZC5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5saXN0LCAibmFtZSIsICJkYW5pZWwiLCAiYWNsIiwgInByaXZhdGUiKTsKLSAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZC5pZCgpLCBnLlYoKS5oYXMoInBlcnNvbiIsICJuYW1lIiwgUC53aXRoaW4oImRhbmllbCIsICJrdXBwaXR6IikpLmlkKCkubmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkLmlkKCksIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAia3VwcGl0eiIpLmlkKCkubmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkLmlkKCksIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAiZGFuaWVsIikuaWQoKS5uZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE11bHRpTWV0YU5lbzRqVHJhaXQuVkVSVEVYX1BST1BFUlRZX1RPS0VOLCAoKE5lbzRqVmVydGV4KSBnLlYoKS5oYXMoInBlcnNvbiIsICJuYW1lIiwgImt1cHBpdHoiKS5uZXh0KCkpLmdldEJhc2VWZXJ0ZXgoKS5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGQucHJvcGVydHkoVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkubGlzdCwgIm5hbWUiLCAibWFya28iLCAiYWNsIiwgInByaXZhdGUiKTsKLSAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZy5WKCkuaGFzKCJwZXJzb24iLCAibmFtZSIsICJtYXJrbyIpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAibWFya28iKS5wcm9wZXJ0aWVzKCJuYW1lIikuaGFzKFQudmFsdWUsICJtYXJrbyIpLmhhcygiYWNsIiwgInByaXZhdGUiKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGcuVigpLmhhcygicGVyc29uIiwgIm5hbWUiLCAibWFya28iKS5mb3JFYWNoUmVtYWluaW5nKHYgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhNdWx0aU1ldGFOZW80alRyYWl0LlZFUlRFWF9QUk9QRVJUWV9UT0tFTiwgKChOZW80alZlcnRleCkgdikuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJuYW1lIikpOwotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGREb0xhYmVsc05hbWVzcGFjZUJlaGF2aW9yKCkgewogICAgICAgICBncmFwaC50eCgpLnJlYWRXcml0ZSgpOwogCmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmF0aXZlTmVvNGpTdHJ1Y3R1cmVDaGVjay5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05hdGl2ZU5lbzRqU3RydWN0dXJlQ2hlY2suamF2YQppbmRleCA4MjE1YWQzLi4yMzM4YTk0IDEwMDY0NAotLS0gYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmF0aXZlTmVvNGpTdHJ1Y3R1cmVDaGVjay5qYXZhCisrKyBiL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9OYXRpdmVOZW80alN0cnVjdHVyZUNoZWNrLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkZlYXR1cmVSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLkFic3RyYWN0TmVvNGpHcmVtbGluVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnByb2Nlc3MudHJhdmVyc2FsLkxhYmVsUDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLnN0cnVjdHVyZS50cmFpdC5NdWx0aU1ldGFOZW80alRyYWl0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuVHJhdmVyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7CkBAIC0xNTMsOSArMTUyLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX01VTFRJX1BST1BFUlRJRVMsIHN1cHBvcnRlZCA9IGZhbHNlKQotICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX01FVEFfUFJPUEVSVElFUywgc3VwcG9ydGVkID0gZmFsc2UpCi0gICAgcHVibGljIHZvaWQgc2hvdWxkTm90R2VuZXJhdGVOb2Rlc0FuZFJlbGF0aW9uc2hpcHNGb3JOb011bHRpUHJvcGVydGllc05vTWV0YVByb3BlcnRpZXMoKSB7CisgICAgcHVibGljIHZvaWQgc2hvdWxkTm90R2VuZXJhdGVOb2Rlc0FuZFJlbGF0aW9uc2hpcHMoKSB7CiAgICAgICAgIGdyYXBoLnR4KCkucmVhZFdyaXRlKCk7CiAgICAgICAgIHRyeUNvbW1pdChncmFwaCwgZ3JhcGggLT4gdmFsaWRhdGVDb3VudHMoMCwgMCwgMCwgMCkpOwogICAgICAgICBWZXJ0ZXggdmVydGV4ID0gZ3JhcGguYWRkVmVydGV4KFQubGFiZWwsICJwZXJzb24iKTsKQEAgLTE4MywyMDEgKzE4MCw2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9NVUxUSV9QUk9QRVJUSUVTKQotICAgIHB1YmxpYyB2b2lkIHNob3VsZEdlbmVyYXRlTm9kZXNBbmRSZWxhdGlvbnNoaXBzQ29ycmVjdGx5Rm9yVmVydGV4UHJvcGVydGllcygpIHsKLQotICAgICAgICBncmFwaC50eCgpLnJlYWRXcml0ZSgpOwotICAgICAgICBOZW80alZlcnRleCBhID0gKE5lbzRqVmVydGV4KSBncmFwaC5hZGRWZXJ0ZXgoIm5hbWUiLCAibWFya28iLCAibmFtZSIsICJva3JhbSIpOwotICAgICAgICBOZW80alZlcnRleCBiID0gKE5lbzRqVmVydGV4KSBncmFwaC5hZGRWZXJ0ZXgoIm5hbWUiLCAic3RlcGhlbiIsICJsb2NhdGlvbiIsICJ2aXJnaW5pYSIpOwotCi0gICAgICAgIHRyeUNvbW1pdChncmFwaCwgZ3JhcGggLT4gewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGcuVigpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKDIsIGEucHJvcGVydGllcygibmFtZSIpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKDEsIGIucHJvcGVydGllcygibmFtZSIpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKDEsIGIucHJvcGVydGllcygibG9jYXRpb24iKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBnLkUoKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDRsLCB0aGlzLmdldEJhc2VHcmFwaCgpLmV4ZWN1dGUoIk1BVENIIChuKSBSRVRVUk4gQ09VTlQobikiLCBudWxsKS5uZXh0KCkuZ2V0KCJDT1VOVChuKSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygybCwgdGhpcy5nZXRCYXNlR3JhcGgoKS5leGVjdXRlKCJNQVRDSCAobiktW3JdLT4obSkgUkVUVVJOIENPVU5UKHIpIiwgbnVsbCkubmV4dCgpLmdldCgiQ09VTlQocikiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMmwsIHRoaXMuZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiTUFUQ0ggKGEpLVtyXS0+KCkgV0hFUkUgaWQoYSkgPSAiICsgYS5pZCgpICsgIiBSRVRVUk4gQ09VTlQocikiLCBudWxsKS5uZXh0KCkuZ2V0KCJDT1VOVChyKSIpKTsKLSAgICAgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOwotICAgICAgICAgICAgYS5nZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akRpcmVjdGlvbi5PVVRHT0lORykuZm9yRWFjaChyZWxhdGlvbnNoaXAgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhHcmFwaC5IaWRkZW4uaGlkZSgibmFtZSIpLCByZWxhdGlvbnNoaXAudHlwZSgpKTsKLSAgICAgICAgICAgICAgICBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRlci5nZXRBbmRTZXQoMCkpOwotICAgICAgICAgICAgdGhpcy5nZXRCYXNlR3JhcGgoKS5leGVjdXRlKCJNQVRDSCAoYSktLT4obSkgV0hFUkUgaWQoYSkgPSAiICsgYS5pZCgpICsgIiBSRVRVUk4gbGFiZWxzKG0pIiwgbnVsbCkuZm9yRWFjaFJlbWFpbmluZyhyZXN1bHRzIC0+IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgKChMaXN0PFN0cmluZz4pIHJlc3VsdHMuZ2V0KCJsYWJlbHMobSkiKSkuY29udGFpbnMoVmVydGV4UHJvcGVydHkuREVGQVVMVF9MQUJFTCkpOwotICAgICAgICAgICAgICAgIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjb3VudGVyLmdldEFuZFNldCgwKSk7Ci0gICAgICAgICAgICBJdGVyYXRvclV0aWxzLnN0cmVhbShhLmdldEJhc2VWZXJ0ZXgoKS5yZWxhdGlvbnNoaXBzKE5lbzRqRGlyZWN0aW9uLk9VVEdPSU5HKSkubWFwKE5lbzRqUmVsYXRpb25zaGlwOjplbmQpLmZvckVhY2gobm9kZSAtPiB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEl0ZXJhdG9yVXRpbHMuY291bnQobm9kZS5nZXRLZXlzKCkpKTsgIC8vIFQua2V5LCBULnZhbHVlLCBrZXkKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBub2RlLmdldFByb3BlcnR5KFQua2V5LmdldEFjY2Vzc29yKCkpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJtYXJrbyIuZXF1YWxzKG5vZGUuZ2V0UHJvcGVydHkoVC52YWx1ZS5nZXRBY2Nlc3NvcigpKSkgfHwgIm9rcmFtIi5lcXVhbHMobm9kZS5nZXRQcm9wZXJ0eShULnZhbHVlLmdldEFjY2Vzc29yKCkpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuZGVncmVlKE5lbzRqRGlyZWN0aW9uLk9VVEdPSU5HLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUuZGVncmVlKE5lbzRqRGlyZWN0aW9uLklOQ09NSU5HLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEdyYXBoLkhpZGRlbi5oaWRlKCJuYW1lIiksIG5vZGUucmVsYXRpb25zaGlwcyhOZW80akRpcmVjdGlvbi5JTkNPTUlORykuaXRlcmF0b3IoKS5uZXh0KCkudHlwZSgpKTsKLSAgICAgICAgICAgICAgICBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRlci5nZXRBbmRTZXQoMCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgSXRlcmF0b3JVdGlscy5jb3VudChiLmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJuYW1lIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2aXJnaW5pYSIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbiIpKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYS5wcm9wZXJ0eSgibmFtZSIsICJ0aGUgbWFya28iKTsKLSAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZy5WKCkuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAvL2Fzc2VydEVxdWFscygxLCBhLnByb3BlIHJ0aWVzKCkuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAvLyAgYXNzZXJ0RXF1YWxzKDEsIGIucHJvcGVydGllcygibmFtZSIpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKDEsIGIucHJvcGVydGllcygibG9jYXRpb24iKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBnLkUoKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygybCwgdGhpcy5nZXRCYXNlR3JhcGgoKS5leGVjdXRlKCJNQVRDSCAobikgUkVUVVJOIENPVU5UKG4pIiwgbnVsbCkubmV4dCgpLmdldCgiQ09VTlQobikiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMGwsIHRoaXMuZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiTUFUQ0ggKG4pLVtyXS0+KG0pIFJFVFVSTiBDT1VOVChyKSIsIG51bGwpLm5leHQoKS5nZXQoIkNPVU5UKHIpIikpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmF0b3JVdGlscy5jb3VudChhLmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidGhlIG1hcmtvIiwgYS5nZXRCYXNlVmVydGV4KCkuZ2V0UHJvcGVydHkoIm5hbWUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgSXRlcmF0b3JVdGlscy5jb3VudChiLmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJuYW1lIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2aXJnaW5pYSIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbiIpKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYS5wcm9wZXJ0eSgibmFtZSIpLnJlbW92ZSgpOwotICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGdyYXBoIC0+IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBnLlYoKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vICAgIGFzc2VydEVxdWFscygwLCBhLnByb3BlcnRpZXMoKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vICAgYXNzZXJ0RXF1YWxzKDIsIGIucHJvcGVydGllcygpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGcuRSgpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDJsLCB0aGlzLmdldEJhc2VHcmFwaCgpLmV4ZWN1dGUoIk1BVENIIChuKSBSRVRVUk4gQ09VTlQobikiLCBudWxsKS5uZXh0KCkuZ2V0KCJDT1VOVChuKSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwbCwgdGhpcy5nZXRCYXNlR3JhcGgoKS5leGVjdXRlKCJNQVRDSCAobiktW3JdLT4obSkgUkVUVVJOIENPVU5UKHIpIiwgbnVsbCkubmV4dCgpLmdldCgiQ09VTlQocikiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgSXRlcmF0b3JVdGlscy5jb3VudChhLmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBJdGVyYXRvclV0aWxzLmNvdW50KGIuZ2V0QmFzZVZlcnRleCgpLmdldEtleXMoKSkpOwotICAgICAgICB9KTsKLQotICAgICAgICBncmFwaC50eCgpLmNvbW1pdCgpOwotICAgICAgICBhLnByb3BlcnR5KCJuYW1lIiwgInRoZSBtYXJrbyIsICJhY2wiLCAicHJpdmF0ZSIpOwotICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGdyYXBoIC0+IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBnLlYoKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIGFzc2VydEVxdWFscygxLCBhLnByb3BlcnRpZXMoIm5hbWUiKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIGFzc2VydEVxdWFscygxLCBiLnByb3BlcnRpZXMoIm5hbWUiKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIGFzc2VydEVxdWFscygxLCBiLnByb3BlcnRpZXMoImxvY2F0aW9uIikuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZy5FKCkuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzbCwgdGhpcy5nZXRCYXNlR3JhcGgoKS5leGVjdXRlKCJNQVRDSCAobikgUkVUVVJOIENPVU5UKG4pIiwgbnVsbCkubmV4dCgpLmdldCgiQ09VTlQobikiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMWwsIHRoaXMuZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiTUFUQ0ggKG4pLVtyXS0+KG0pIFJFVFVSTiBDT1VOVChyKSIsIG51bGwpLm5leHQoKS5nZXQoIkNPVU5UKHIpIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDFsLCB0aGlzLmdldEJhc2VHcmFwaCgpLmV4ZWN1dGUoIk1BVENIIChhKS1bcl0tPigpIFdIRVJFIGlkKGEpID0gIiArIGEuaWQoKSArICIgUkVUVVJOIENPVU5UKHIpIiwgbnVsbCkubmV4dCgpLmdldCgiQ09VTlQocikiKSk7Ci0gICAgICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKLSAgICAgICAgICAgIGEuZ2V0QmFzZVZlcnRleCgpLnJlbGF0aW9uc2hpcHMoTmVvNGpEaXJlY3Rpb24uT1VUR09JTkcpLmZvckVhY2gocmVsYXRpb25zaGlwIC0+IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoR3JhcGguSGlkZGVuLmhpZGUoIm5hbWUiKSwgcmVsYXRpb25zaGlwLnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50ZXIuZ2V0QW5kU2V0KDApKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiTUFUQ0ggKGEpLS0+KG0pIFdIRVJFIGlkKGEpID0gIiArIGEuaWQoKSArICIgUkVUVVJOIGxhYmVscyhtKSIsIG51bGwpLmZvckVhY2hSZW1haW5pbmcocmVzdWx0cyAtPiB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsICgoTGlzdDxTdHJpbmc+KSByZXN1bHRzLmdldCgibGFiZWxzKG0pIikpLmNvbnRhaW5zKFZlcnRleFByb3BlcnR5LkRFRkFVTFRfTEFCRUwpKTsKLSAgICAgICAgICAgICAgICBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRlci5nZXRBbmRTZXQoMCkpOwotICAgICAgICAgICAgSXRlcmF0b3JVdGlscy5zdHJlYW0oYS5nZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akRpcmVjdGlvbi5PVVRHT0lORykpLm1hcChOZW80alJlbGF0aW9uc2hpcDo6ZW5kKS5mb3JFYWNoKG5vZGUgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCBJdGVyYXRvclV0aWxzLmNvdW50KG5vZGUuZ2V0S2V5cygpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgbm9kZS5nZXRQcm9wZXJ0eShULmtleS5nZXRBY2Nlc3NvcigpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgbWFya28iLCBub2RlLmdldFByb3BlcnR5KFQudmFsdWUuZ2V0QWNjZXNzb3IoKSkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJpdmF0ZSIsIG5vZGUuZ2V0UHJvcGVydHkoImFjbCIpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZS5kZWdyZWUoTmVvNGpEaXJlY3Rpb24uT1VUR09JTkcsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZS5kZWdyZWUoTmVvNGpEaXJlY3Rpb24uSU5DT01JTkcsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoR3JhcGguSGlkZGVuLmhpZGUoIm5hbWUiKSwgbm9kZS5yZWxhdGlvbnNoaXBzKE5lbzRqRGlyZWN0aW9uLklOQ09NSU5HKS5pdGVyYXRvcigpLm5leHQoKS50eXBlKCkpOwotICAgICAgICAgICAgICAgIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjb3VudGVyLmdldEFuZFNldCgwKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KGEuZ2V0QmFzZVZlcnRleCgpLmdldEtleXMoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhLmdldEJhc2VWZXJ0ZXgoKS5oYXNQcm9wZXJ0eSgibmFtZSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNdWx0aU1ldGFOZW80alRyYWl0LlZFUlRFWF9QUk9QRVJUWV9UT0tFTiwgYS5nZXRCYXNlVmVydGV4KCkuZ2V0UHJvcGVydHkoIm5hbWUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgSXRlcmF0b3JVdGlscy5jb3VudChiLmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJuYW1lIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2aXJnaW5pYSIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbiIpKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYS5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5saXN0LCAibmFtZSIsICJtYXJrbyIsICJhY2wiLCAicHJpdmF0ZSIpOwotICAgICAgICBhLnByb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5Lmxpc3QsICJuYW1lIiwgIm9rcmFtIiwgImFjbCIsICJwdWJsaWMiKTsKLSAgICAgICAgYS5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5zaW5nbGUsICJuYW1lIiwgInRoZSBtYXJrbyIsICJhY2wiLCAicHJpdmF0ZSIpOwotICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGdyYXBoIC0+IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBnLlYoKS5jb3VudCgpLm5leHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vYXNzZXJ0RXF1YWxzKDEsIGEucHJvcGVydGllcygibmFtZSIpLmNvdW50KCkubmV4dCgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgLy9hc3NlcnRFcXVhbHMoMSwgYi5wcm9wZXJ0aWVzKCJuYW1lIikuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAvL2Fzc2VydEVxdWFscygxLCBiLnByb3BlcnRpZXMoImxvY2F0aW9uIikuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZy5FKCkuY291bnQoKS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzbCwgdGhpcy5nZXRCYXNlR3JhcGgoKS5leGVjdXRlKCJNQVRDSCAobikgUkVUVVJOIENPVU5UKG4pIiwgbnVsbCkubmV4dCgpLmdldCgiQ09VTlQobikiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMWwsIHRoaXMuZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiTUFUQ0ggKG4pLVtyXS0+KG0pIFJFVFVSTiBDT1VOVChyKSIsIG51bGwpLm5leHQoKS5nZXQoIkNPVU5UKHIpIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDFsLCB0aGlzLmdldEJhc2VHcmFwaCgpLmV4ZWN1dGUoIk1BVENIIChhKS1bcl0tPigpIFdIRVJFIGlkKGEpID0gIiArIGEuaWQoKSArICIgUkVUVVJOIENPVU5UKHIpIiwgbnVsbCkubmV4dCgpLmdldCgiQ09VTlQocikiKSk7Ci0gICAgICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKLSAgICAgICAgICAgIGEuZ2V0QmFzZVZlcnRleCgpLnJlbGF0aW9uc2hpcHMoTmVvNGpEaXJlY3Rpb24uT1VUR09JTkcpLmZvckVhY2gocmVsYXRpb25zaGlwIC0+IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoR3JhcGguSGlkZGVuLmhpZGUoIm5hbWUiKSwgcmVsYXRpb25zaGlwLnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50ZXIuZ2V0QW5kU2V0KDApKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0QmFzZUdyYXBoKCkuZXhlY3V0ZSgiTUFUQ0ggKGEpLS0+KG0pIFdIRVJFIGlkKGEpID0gIiArIGEuaWQoKSArICIgUkVUVVJOIGxhYmVscyhtKSIsIG51bGwpLmZvckVhY2hSZW1haW5pbmcocmVzdWx0cyAtPiB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsICgoTGlzdDxTdHJpbmc+KSByZXN1bHRzLmdldCgibGFiZWxzKG0pIikpLmNvbnRhaW5zKFZlcnRleFByb3BlcnR5LkRFRkFVTFRfTEFCRUwpKTsKLSAgICAgICAgICAgICAgICBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRlci5nZXRBbmRTZXQoMCkpOwotICAgICAgICAgICAgSXRlcmF0b3JVdGlscy5zdHJlYW0oYS5nZXRCYXNlVmVydGV4KCkucmVsYXRpb25zaGlwcyhOZW80akRpcmVjdGlvbi5PVVRHT0lORykpLm1hcChOZW80alJlbGF0aW9uc2hpcDo6ZW5kKS5mb3JFYWNoKG5vZGUgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCBJdGVyYXRvclV0aWxzLmNvdW50KG5vZGUuZ2V0S2V5cygpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgbm9kZS5nZXRQcm9wZXJ0eShULmtleS5nZXRBY2Nlc3NvcigpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgbWFya28iLCBub2RlLmdldFByb3BlcnR5KFQudmFsdWUuZ2V0QWNjZXNzb3IoKSkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJpdmF0ZSIsIG5vZGUuZ2V0UHJvcGVydHkoImFjbCIpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZS5kZWdyZWUoTmVvNGpEaXJlY3Rpb24uT1VUR09JTkcsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZS5kZWdyZWUoTmVvNGpEaXJlY3Rpb24uSU5DT01JTkcsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoR3JhcGguSGlkZGVuLmhpZGUoIm5hbWUiKSwgbm9kZS5yZWxhdGlvbnNoaXBzKE5lbzRqRGlyZWN0aW9uLklOQ09NSU5HKS5pdGVyYXRvcigpLm5leHQoKS50eXBlKCkpOwotICAgICAgICAgICAgICAgIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjb3VudGVyLmdldEFuZFNldCgwKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBJdGVyYXRvclV0aWxzLmNvdW50KGEuZ2V0QmFzZVZlcnRleCgpLmdldEtleXMoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhLmdldEJhc2VWZXJ0ZXgoKS5oYXNQcm9wZXJ0eSgibmFtZSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNdWx0aU1ldGFOZW80alRyYWl0LlZFUlRFWF9QUk9QRVJUWV9UT0tFTiwgYS5nZXRCYXNlVmVydGV4KCkuZ2V0UHJvcGVydHkoIm5hbWUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgSXRlcmF0b3JVdGlscy5jb3VudChiLmdldEJhc2VWZXJ0ZXgoKS5nZXRLZXlzKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3RlcGhlbiIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJuYW1lIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2aXJnaW5pYSIsIGIuZ2V0QmFzZVZlcnRleCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbiIpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBARmVhdHVyZVJlcXVpcmVtZW50KGZlYXR1cmVDbGFzcyA9IEdyYXBoLkZlYXR1cmVzLlZlcnRleEZlYXR1cmVzLmNsYXNzLCBmZWF0dXJlID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuRkVBVFVSRV9NVUxUSV9QUk9QRVJUSUVTKQotICAgIEBGZWF0dXJlUmVxdWlyZW1lbnQoZmVhdHVyZUNsYXNzID0gR3JhcGguRmVhdHVyZXMuVmVydGV4RmVhdHVyZXMuY2xhc3MsIGZlYXR1cmUgPSBHcmFwaC5GZWF0dXJlcy5WZXJ0ZXhGZWF0dXJlcy5GRUFUVVJFX01FVEFfUFJPUEVSVElFUykKLSAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RHZW5lcmF0ZU5vZGVzQW5kUmVsYXRpb25zaGlwc0Zvck11bHRpUHJvcGVydGllc1dpdGhTaW5nbGUoKSB7Ci0gICAgICAgIGdyYXBoLnR4KCkucmVhZFdyaXRlKCk7Ci0gICAgICAgIHRyeUNvbW1pdChncmFwaCwgZ3JhcGggLT4gdmFsaWRhdGVDb3VudHMoMCwgMCwgMCwgMCkpOwotICAgICAgICBWZXJ0ZXggdmVydGV4ID0gZ3JhcGguYWRkVmVydGV4KFQubGFiZWwsICJwZXJzb24iKTsKLSAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB2YWxpZGF0ZUNvdW50cygxLCAwLCAxLCAwKSk7Ci0gICAgICAgIHZlcnRleC5wcm9wZXJ0eShWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5saXN0LCAibmFtZSIsICJtYXJrbyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtvIiwgdmVydGV4LnZhbHVlKCJuYW1lIikpOwotICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGdyYXBoIC0+IHZhbGlkYXRlQ291bnRzKDEsIDAsIDEsIDApKTsKLSAgICAgICAgdmVydGV4LnByb3BlcnR5KFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5LnNpbmdsZSwgIm5hbWUiLCAib2tyYW0iKTsKLSAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB7Ci0gICAgICAgICAgICB2YWxpZGF0ZUNvdW50cygxLCAwLCAxLCAwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygib2tyYW0iLCB2ZXJ0ZXgudmFsdWUoIm5hbWUiKSk7Ci0gICAgICAgIH0pOwotICAgICAgICBWZXJ0ZXhQcm9wZXJ0eSB2ZXJ0ZXhQcm9wZXJ0eSA9IHZlcnRleC5wcm9wZXJ0eSgibmFtZSIpOwotICAgICAgICB0cnlDb21taXQoZ3JhcGgsIGdyYXBoIC0+IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodmVydGV4UHJvcGVydHkuaXNQcmVzZW50KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmVydGV4UHJvcGVydHkua2V5KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJva3JhbSIsIHZlcnRleFByb3BlcnR5LnZhbHVlKCkpOwotICAgICAgICAgICAgdmFsaWRhdGVDb3VudHMoMSwgMCwgMSwgMCk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIG5vdyBtYWtlIGl0IGEgbWV0YSBwcm9wZXJ0eSAoYW5kIHRodXMsIGZvcmNlIG5vZGUvcmVsYXRpb25zaGlwIGNyZWF0aW9uKQotICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eS5wcm9wZXJ0eSgiYWNsIiwgInByaXZhdGUiKTsKLSAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByaXZhdGUiLCB2ZXJ0ZXhQcm9wZXJ0eS52YWx1ZSgiYWNsIikpOwotICAgICAgICAgICAgdmFsaWRhdGVDb3VudHMoMSwgMCwgMiwgMSk7Ci0gICAgICAgIH0pOwotCi0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzaG91bGRTdXBwb3J0TmVvNGpNdWx0aUxhYmVscygpIHsKICAgICAgICAgZmluYWwgTmVvNGpWZXJ0ZXggdmVydGV4ID0gKE5lbzRqVmVydGV4KSBncmFwaC5hZGRWZXJ0ZXgoVC5sYWJlbCwgImFuaW1hbDo6cGVyc29uIiwgIm5hbWUiLCAibWFya28iKTsKICAgICAgICAgdHJ5Q29tbWl0KGdyYXBoLCBncmFwaCAtPiB7CmRpZmYgLS1naXQgYS9uZW80ai1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9uZW80ai9zdHJ1Y3R1cmUvTmVvNGpHcmFwaFN0cnVjdHVyZVN0YW5kYXJkVGVzdC5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05lbzRqR3JhcGhTdHJ1Y3R1cmVTdGFuZGFyZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdiMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05lbzRqR3JhcGhTdHJ1Y3R1cmVTdGFuZGFyZFRlc3QuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoUHJvdmlkZXJDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLk5lbzRqR3JhcGhQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5TdHJ1Y3R1cmVTdGFuZGFyZFN1aXRlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqLworQFJ1bldpdGgoU3RydWN0dXJlU3RhbmRhcmRTdWl0ZS5jbGFzcykKK0BHcmFwaFByb3ZpZGVyQ2xhc3MocHJvdmlkZXIgPSBOZW80akdyYXBoUHJvdmlkZXIuY2xhc3MsIGdyYXBoID0gTmVvNGpHcmFwaC5jbGFzcykKK3B1YmxpYyBjbGFzcyBOZW80akdyYXBoU3RydWN0dXJlU3RhbmRhcmRUZXN0IHsKK30KZGlmZiAtLWdpdCBhL25lbzRqLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL25lbzRqL3N0cnVjdHVyZS9Ob011bHRpTm9NZXRhTmVvNGpHcmFwaFN0cnVjdHVyZVN0YW5kYXJkVGVzdC5qYXZhIGIvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05vTXVsdGlOb01ldGFOZW80akdyYXBoU3RydWN0dXJlU3RhbmRhcmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Njc0NGYuLjAwMDAwMDAKLS0tIGEvbmVvNGotZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vbmVvNGovc3RydWN0dXJlL05vTXVsdGlOb01ldGFOZW80akdyYXBoU3RydWN0dXJlU3RhbmRhcmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5uZW80ai5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLkdyYXBoUHJvdmlkZXJDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLm5lbzRqLk5vTXVsdGlOb01ldGFOZW80akdyYXBoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuU3RydWN0dXJlU3RhbmRhcmRTdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci0KLS8qKgotICogQGF1dGhvciBNYXJrbyBBLiBSb2RyaWd1ZXogKGh0dHA6Ly9tYXJrb3JvZHJpZ3Vlei5jb20pCi0gKi8KLUBSdW5XaXRoKFN0cnVjdHVyZVN0YW5kYXJkU3VpdGUuY2xhc3MpCi1AR3JhcGhQcm92aWRlckNsYXNzKHByb3ZpZGVyID0gTm9NdWx0aU5vTWV0YU5lbzRqR3JhcGhQcm92aWRlci5jbGFzcywgZ3JhcGggPSBOZW80akdyYXBoLmNsYXNzKQotcHVibGljIGNsYXNzIE5vTXVsdGlOb01ldGFOZW80akdyYXBoU3RydWN0dXJlU3RhbmRhcmRUZXN0IHsKLX0KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IDc1MmE0N2QuLjYwNWM0ZTUgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtMjUsNyArMjUsNyBAQAogICAgIDwvcGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPnRpbmtlcnBvcDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3A8L25hbWU+CiAgICAgPGRlc2NyaXB0aW9uPkEgR3JhcGggQ29tcHV0aW5nIEZyYW1ld29yazwvZGVzY3JpcHRpb24+CkBAIC0xNDYsMjQgKzE0NiwyNSBAQAogICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGlua2VycG9wPC91cmw+CiAgICAgPC9zY20+CiAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb21tb25zLmNvbmZpZ3VyYXRpb24udmVyc2lvbj4xLjEwPC9jb21tb25zLmNvbmZpZ3VyYXRpb24udmVyc2lvbj4KKyAgICAgICAgPGNvbW1vbnMuY29uZmlndXJhdGlvbi52ZXJzaW9uPjIuNjwvY29tbW9ucy5jb25maWd1cmF0aW9uLnZlcnNpb24+CiAgICAgICAgIDxjb21tb25zLmxhbmcudmVyc2lvbj4yLjY8L2NvbW1vbnMubGFuZy52ZXJzaW9uPgogICAgICAgICA8Y29tbW9ucy5sYW5nMy52ZXJzaW9uPjMuOC4xPC9jb21tb25zLmxhbmczLnZlcnNpb24+Ci0gICAgICAgIDxncm9vdnkudmVyc2lvbj4yLjUuMTE8L2dyb292eS52ZXJzaW9uPgotICAgICAgICA8aGFkb29wLnZlcnNpb24+Mi43LjI8L2hhZG9vcC52ZXJzaW9uPgorICAgICAgICA8Z3Jvb3Z5LnZlcnNpb24+My4wLjM8L2dyb292eS52ZXJzaW9uPgorICAgICAgICA8aGFkb29wLnZlcnNpb24+Mi43Ljc8L2hhZG9vcC52ZXJzaW9uPgogICAgICAgICA8amF2YS50dXBsZXMudmVyc2lvbj4xLjI8L2phdmEudHVwbGVzLnZlcnNpb24+Ci0gICAgICAgIDxqYXZhZG9jLXBsdWdpbi52ZXJzaW9uPjIuMTAuNDwvamF2YWRvYy1wbHVnaW4udmVyc2lvbj4KKyAgICAgICAgPGphdmFkb2MtcGx1Z2luLnZlcnNpb24+My4xLjA8L2phdmFkb2MtcGx1Z2luLnZlcnNpb24+CiAgICAgICAgIDxqY2FiaS52ZXJzaW9uPjEuMTwvamNhYmkudmVyc2lvbj4KICAgICAgICAgPGxvZzRqLnZlcnNpb24+MS4yLjE3PC9sb2c0ai52ZXJzaW9uPgogICAgICAgICA8bWV0cmljcy52ZXJzaW9uPjMuMC4yPC9tZXRyaWNzLnZlcnNpb24+CiAgICAgICAgIDxuZXR0eS52ZXJzaW9uPjQuMS40OS5GaW5hbDwvbmV0dHkudmVyc2lvbj4KICAgICAgICAgPHNsZjRqLnZlcnNpb24+MS43LjI1PC9zbGY0ai52ZXJzaW9uPgogICAgICAgICA8c25ha2V5YW1sLnZlcnNpb24+MS4xNTwvc25ha2V5YW1sLnZlcnNpb24+Ci0gICAgICAgIDxzcGFyay52ZXJzaW9uPjIuNC4wPC9zcGFyay52ZXJzaW9uPgorICAgICAgICA8c3BhcmsudmVyc2lvbj4zLjAuMDwvc3BhcmsudmVyc2lvbj4KIAogICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KICAgICAgICAgPHByb2plY3QucmVwb3J0aW5nLm91dHB1dEVuY29kaW5nPlVURi04PC9wcm9qZWN0LnJlcG9ydGluZy5vdXRwdXRFbmNvZGluZz4KICAgICAgICAgPHNraXBJbnRlZ3JhdGlvblRlc3RzPnRydWU8L3NraXBJbnRlZ3JhdGlvblRlc3RzPgorICAgICAgICA8c3VyZXNhZmVBcmdzPiA8L3N1cmVzYWZlQXJncz4KIAogICAgICAgICA8IS0tCiAgICAgICAgIFRoaXMgZmlsZSB3aWxsIGNvbWUgZnJvbSB0aGUgcm9vdCBvZiBlYWNoIG1vZHVsZXMgdGVzdC9yZXNvdXJjZXMvIGRpcmVjdG9yaWVzLiBsb2c0ai1zaWxlbnQucHJvcGVydGllcyB3aWxsCkBAIC0xODgsNyArMTg5LDkgQEAKICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMC1NMjwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lbmZvcmNlLWFsbDwvaWQ+CkBAIC0xOTksNyArMjAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEZXBlbmRlbmN5Q29udmVyZ2VuY2UvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVxdWlyZUphdmFWZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+WzEuOC4wLTQwLCk8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj5bMS44LDEyKTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXF1aXJlSmF2YVZlcnNpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXF1aXJlTWF2ZW5WZXJzaW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+WzMuMy45LCk8L3ZlcnNpb24+CkBAIC0yMzcsNyArMjQwLDcgQEAKICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFscGFyYW0+LVhkb2NsaW50Om5vbmU8L2FkZGl0aW9uYWxwYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxKT3B0aW9uPi1YZG9jbGludDpub25lPC9hZGRpdGlvbmFsSk9wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPHRhZ3M+CiAgICAgICAgICAgICAgICAgICAgICAgICA8dGFnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmV4YW1wbGU8L25hbWU+CkBAIC0yNTQsNyArMjU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+c2l0ZTwvcGhhc2U+CiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbHBhcmFtPi1YZG9jbGludDpub25lPC9hZGRpdGlvbmFscGFyYW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxKT3B0aW9uPi1YZG9jbGludDpub25lPC9hZGRpdGlvbmFsSk9wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZURlcGVuZGVuY3lTb3VyY2VzPnRydWU8L2luY2x1ZGVEZXBlbmRlbmN5U291cmNlcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeVNvdXJjZUluY2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeVNvdXJjZUluY2x1ZGU+b3JnLmFwYWNoZS50aW5rZXJwb3A6KjwvZGVwZW5kZW5jeVNvdXJjZUluY2x1ZGU+CkBAIC0zNTksNiArMzYyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVTdWJQcm9qZWN0cz5mYWxzZTwvZXhjbHVkZVN1YlByb2plY3RzPgogICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4ubWFpbG1hcDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPi5hc2YueWFtbDwvZXhjbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPi50cmF2aXMueW1sPC9leGNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+LnRyYXZpcy4qLnNoPC9leGNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+LmRvY2tlcmlnbm9yZTwvZXhjbHVkZT4KQEAgLTQwMywxMCArNDA3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLy52cy8qKjwvZXhjbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL051R2V0LkNvbmZpZzwvZXhjbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoubnVzcGVjPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5udXNwZWMudGVtcGxhdGU8L2V4Y2x1ZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9ncmVtbGluLWphdmFzY3JpcHQvbm9kZV9tb2R1bGVzLyoqPC9leGNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovZ3JlbWxpbi1qYXZhc2NyaXB0L2RvYy8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL25vZGUvbm9kZV9tb2R1bGVzLyoqPC9leGNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovbm9kZS8qKjwvZXhjbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL25wbS1kZWJ1Zy5sb2c8L2V4Y2x1ZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9fc2l0ZS8qKjwvZXhjbHVkZT4KQEAgLTQ0MiwxMCArNDQ0LDExIEBACiAgICAgICAgIDwvcGx1Z2lucz4KICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CiAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8IS0tIHRoZXJlIGlzIGEgamRrMTEgcHJvZmlsZSB0aGF0IHdpbGwgYmUgZW5hYmxlZCBpZiBidWlsdCB3aXRoIHRoYXQgdmVyc2lvbiAtIHRoZXNlIHNldHRpbmdzIHdpbGwgYmUgb3ZlcnJpZGVuIC0tPgogICAgICAgICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjcuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CkBAIC00NjIsMTEgKzQ2NSwxNCBAQAogICAgICAgICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjIxLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjIuMjwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tRGxvZzRqLmNvbmZpZ3VyYXRpb249JHtsb2c0ai10ZXN0LnByb3BlcnRpZXN9IC1EYnVpbGQuZGlyPSR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IC1EaXMudGVzdGluZz10cnVlIC1EamF2YS5uZXQucHJlZmVySVB2NFN0YWNrPXRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXRlc3QucHJvcGVydGllc30gLURidWlsZC5kaXI9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gLURpcy50ZXN0aW5nPXRydWUgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZSAke3N1cmVzYWZlQXJnc30KICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJnTGluZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmltU3RhY2tUcmFjZT5mYWxzZTwvdHJpbVN0YWNrVHJhY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ya0NvdW50PjE8L2ZvcmtDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPgogICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypJbnRlZ3JhdGVUZXN0LmphdmE8L2V4Y2x1ZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgpAQCAtNDc1LDcgKzQ4MSw3IEBACiAgICAgICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yMi4yPC92ZXJzaW9uPgogICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmludGVncmF0aW9uLXRlc3Q8L2lkPgpAQCAtNDg3LDggKzQ5MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKkludGVncmF0ZVRlc3QuamF2YTwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBJbnRlZ3JhdGlvblRlc3RzfTwvc2tpcFRlc3RzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tRGxvZzRqLmNvbmZpZ3VyYXRpb249JHtsb2c0ai10ZXN0LnByb3BlcnRpZXN9IC1EaG9zdD1sb2NhbGhvc3QgLURwb3J0PTgxODIgLURidWlsZC5kaXI9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gLURpcy50ZXN0aW5nPXRydWUgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXRlc3QucHJvcGVydGllc30gLURob3N0PWxvY2FsaG9zdCAtRHBvcnQ9ODE4MiAtRGJ1aWxkLmRpcj0ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSAtRGlzLnRlc3Rpbmc9dHJ1ZSAtRGphdmEubmV0LnByZWZlcklQdjRTdGFjaz10cnVlICR7c3VyZXNhZmVBcmdzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FyZ0xpbmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JrQ291bnQ+MTwvZm9ya0NvdW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnlGaWxlPnRhcmdldC9mYWlsc2FmZS1yZXBvcnRzL2ZhaWxzYWZlLWludGVncmF0aW9uLnhtbDwvc3VtbWFyeUZpbGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CkBAIC01MjQsNiArNTMzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXZhZG9jLXBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuODwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdtYXZlbnBsdXM8L2dyb3VwSWQ+CkBAIC01NzcsMTggKzU4OSwxNiBAQAogCiAgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgogICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPCEtLSBjb21tb25zLWNvbmZpZ3VyYXRpb24gZHJhZ3MgaW4gdGhlIG9sZCBjb21tb25zLWxhbmcuIG5lZWQgdG8gdXBkYXRlIHNvbWVkYXkgLS0+CiAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbmZpZ3VyYXRpb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb25maWd1cmF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbmZpZ3VyYXRpb24yPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29tbW9ucy5jb25maWd1cmF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8IS0tIHNlbGYtY29uZmxpY3QgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwhLS0gY29tbW9ucy1jb25maWd1cmF0aW9uMiByZXF1aXJlcyBiZWFudXRpbHMgYmVjYXVzZSB3ZSByZWx5IG9uIGZpbGUgbG9hZGVycyAtLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtYmVhbnV0aWxzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtYmVhbnV0aWxzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuOS40PC92ZXJzaW9uPgogICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvZ3JvdXBJZD4KQEAgLTcxMiw3ICs3MjIsNyBAQAogICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTAuMTk8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4yLjQ8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CiAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CkBAIC03MjIsOCArNzMyLDggQEAKICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1hbGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KQEAgLTc2MSw2ICs3NzEsMzMgQEAKICAgICA8cHJvZmlsZXM+CiAKICAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+amRrMTE8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGpkaz4xMTwvamRrPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPHN1cmVzYWZlQXJncz4tLWlsbGVnYWwtYWNjZXNzPXBlcm1pdDwvc3VyZXNhZmVBcmdzPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlbGVhc2U+ODwvcmVsZWFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJncz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmc+LXBhcmFtZXRlcnM8L2FyZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKyAgICAgICAgPHByb2ZpbGU+CiAgICAgICAgICAgICA8aWQ+YXNjaWlkb2M8L2lkPgogICAgICAgICAgICAgPGFjdGl2YXRpb24+CiAgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgpAQCAtMTIwNCwxMiArMTI0MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc3REaXI+ZnVsbDwvZGVzdERpcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFscGFyYW0+LVhkb2NsaW50Om5vbmU8L2FkZGl0aW9uYWxwYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFsSk9wdGlvbj4tWGRvY2xpbnQ6bm9uZTwvYWRkaXRpb25hbEpPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcnZpZXc+JHtiYXNlZGlyfS9kb2NzL2phdmFkb2Mvb3ZlcnZpZXcuaHRtbDwvb3ZlcnZpZXc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cXVpZXQ+dHJ1ZTwvcXVpZXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVtbGluLWNvcmUvc3JjL21haW4vamF2YTpncmVtbGluLWRyaXZlci9zcmMvbWFpbi9qYXZhOmdyZW1saW4tZ3Jvb3Z5L3NyYy9tYWluL2phdmE6Z3JlbWxpbi1weXRob24vc3JjL21haW4vamF2YTpncmVtbGluLXNlcnZlci9zcmMvbWFpbi9qYXZhOmdyZW1saW4tdGVzdC9zcmMvbWFpbi9qYXZhOmhhZG9vcC1ncmVtbGluL3NyYy9tYWluL2phdmE6bmVvNGotZ3JlbWxpbi9zcmMvbWFpbi9qYXZhOnNwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YTp0aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlRGVwZW5kZW5jeVNvdXJjZXM+dHJ1ZTwvaW5jbHVkZURlcGVuZGVuY3lTb3VyY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3lTb3VyY2VJbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeVNvdXJjZUluY2x1ZGU+b3JnLmFwYWNoZS50aW5rZXJwb3A6KjwvZGVwZW5kZW5jeVNvdXJjZUluY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3lTb3VyY2VJbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CkBAIC0xMjIxLDcgKzEyNjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc3REaXI+Y29yZTwvZGVzdERpcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFscGFyYW0+LVhkb2NsaW50Om5vbmU8L2FkZGl0aW9uYWxwYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFsSk9wdGlvbj4tWGRvY2xpbnQ6bm9uZTwvYWRkaXRpb25hbEpPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcnZpZXc+JHtiYXNlZGlyfS9kb2NzL2phdmFkb2Mvb3ZlcnZpZXcuaHRtbDwvb3ZlcnZpZXc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cXVpZXQ+dHJ1ZTwvcXVpZXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlcGF0aD4KQEAgLTEzMDIsOCArMTM0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIGZvciB0aGUgImZ1bGwiIGphdmFkb2NzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxEZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbmZpZ3VyYXRpb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29uZmlndXJhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbmZpZ3VyYXRpb24yPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMuY29uZmlndXJhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FkZGl0aW9uYWxEZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFsRGVwZW5kZW5jeT4KQEAgLTE0MjcsNyArMTQ2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tRGxvZzRqLmNvbmZpZ3VyYXRpb249JHtsb2c0ai1zaWxlbnQucHJvcGVydGllc30gLURidWlsZC5kaXI9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gLURpcy50ZXN0aW5nPXRydWUgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXNpbGVudC5wcm9wZXJ0aWVzfSAtRGJ1aWxkLmRpcj0ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSAtRGlzLnRlc3Rpbmc9dHJ1ZSAtRGphdmEubmV0LnByZWZlcklQdjRTdGFjaz10cnVlICR7c3VyZXNhZmVBcmdzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJnTGluZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypJbnRlZ3JhdGVUZXN0LmphdmE8L2V4Y2x1ZGU+CkBAIC0xNTI0LDcgKzE1NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LURsb2c0ai5jb25maWd1cmF0aW9uPSR7bG9nNGotdGVzdC5wcm9wZXJ0aWVzfSAtRGJ1aWxkLmRpcj0ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSAtRGlzLnRlc3Rpbmc9dHJ1ZSAke3N1cmVmaXJlQXJnTGluZX0gLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXRlc3QucHJvcGVydGllc30gLURidWlsZC5kaXI9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gLURpcy50ZXN0aW5nPXRydWUgJHtzdXJlc2FmZUFyZ3N9IC1EamF2YS5uZXQucHJlZmVySVB2NFN0YWNrPXRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FyZ0xpbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgpAQCAtMTUzMiw3ICsxNTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXRlc3QucHJvcGVydGllc30gLURob3N0PWxvY2FsaG9zdCAtRHBvcnQ9ODE4MiAtRGJ1aWxkLmRpcj0ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSAtRGlzLnRlc3Rpbmc9dHJ1ZSAke2ZhaWxzYWZlQXJnTGluZX0gLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1EbG9nNGouY29uZmlndXJhdGlvbj0ke2xvZzRqLXRlc3QucHJvcGVydGllc30gLURob3N0PWxvY2FsaG9zdCAtRHBvcnQ9ODE4MiAtRGJ1aWxkLmRpcj0ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSAtRGlzLnRlc3Rpbmc9dHJ1ZSAke3N1cmVzYWZlQXJnc30gLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJnTGluZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CkBAIC0xNTQwLDcgKzE1ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjIyLjI8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YWdncmVnYXRlLXN1cmVmaXJlLXJlcG9ydDwvaWQ+CmRpZmYgLS1naXQgYS9zcGFyay1ncmVtbGluL3BvbS54bWwgYi9zcGFyay1ncmVtbGluL3BvbS54bWwKaW5kZXggZDhmMjg0Ny4uODY2Y2NlYyAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9wb20ueG1sCisrKyBiL3NwYXJrLWdyZW1saW4vcG9tLnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgIDxwYXJlbnQ+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD50aW5rZXJwb3A8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KICAgICA8YXJ0aWZhY3RJZD5zcGFyay1ncmVtbGluPC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogU3BhcmsgR3JlbWxpbjwvbmFtZT4KQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xNC4wLjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8dmVyc2lvbj4xNi4wLjE8L3ZlcnNpb24+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KQEAgLTQ0LDI1NyArNDQsMTMzIEBACiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYWRvb3AtZ3JlbWxpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLW5ldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1uZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8IS0tIHVzZSBvdXIgc25hcHB5IGFzIHRoZXJlIGlzIGNvbmZsaWN0IHdpdGhpbiBzcGFyay0tPgogICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy54ZXJpYWwuc25hcHB5PC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbmFwcHktamF2YTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8IS0tIHVzZSBzcGFyaydzIGF2cm8gLS0+CiAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hdnJvPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hdnJvPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDwhLS0gdXNlIHNwYXJrJ3MgbWF0aCAtLT4KICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbWF0aDM8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aW8ubmV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5ldHR5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDwhLS0gdXNlIHNwYXJrJ3MgbmV0dHkgNC0tPgogICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS1hbGw8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy5wYXJhbmFtZXI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBhcmFuYW1lcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIFNQQVJLIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3Bhcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcGFyay1jb3JlXzIuMTE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3NwYXJrLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPCEtLSBzZWxmIGNvbmZsaWN0cyAtLT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2NhbGEtbGFuZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2NhbGEtY29tcGlsZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2NhbGEtbGFuZy5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS14bWxfMi4xMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8IS0tIHVzZSBzcGFyaydzIGFjdGl2YXRpb24gLS0+CiAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYWN0aXZhdGlvbjwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1tYXBwZXItYXNsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmUtYXNsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zY2FsYS1sYW5nPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1saWJyYXJ5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNjYWxhLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNjYWxhLXJlZmxlY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy54ZXJpYWwuc25hcHB5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbmFwcHktamF2YTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmN1cmF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmN1cmF0b3ItZnJhbWV3b3JrPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3VyYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3VyYXRvci1yZWNpcGVzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS50aG91Z2h0d29ya3MucGFyYW5hbWVyPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXJhbmFtZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPCEtLSBncmVtbGluLWNvcmUgY29uZmxpY3RzIC0tPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpjbC1vdmVyLXNsZjRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaXZ5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5pdnk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPCEtLSBncmVtbGluLWdyb292eSBjb25mbGljdHMgLS0+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amxpbmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpsaW5lPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwhLS0gaGFkb29wIGNvbmZsaWN0cyAtLT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmN1cmF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmN1cmF0b3ItY2xpZW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwhLS0gbGdwbCBjb25mbGljdHMgLS0+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmZpbmRidWdzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IzMDU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPCEtLSB1c2Ugem9va2VlcGVyJ3MgbmV0dHkgMyAtLT4KICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgogICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHk8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aW8ubmV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5ldHR5LWFsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8IS0tIGF2cm8gY29uZmxpY3RzIC0tPgorICAgICAgICAgICAgICAgIDwhLS0gdXNlIHNwYXJrcyBjb21tb25zLWNvbXByZXNzIC0tPgogICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb21wcmVzczwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIGNvbnNpc3RlbnQgZGVwZW5kZW5jaWVzIC0tPgorICAgICAgICA8IS0tIFNQQVJLIC0tPgogICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zY2FsYS1sYW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2NhbGEtbGlicmFyeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTEuODwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zY2FsYS1sYW5nLm1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS14bWxfMi4xMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zcGFyazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwYXJrLWNvcmVfMi4xMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3BhcmsudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnpvb2tlZXBlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+em9va2VlcGVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy54ZXJpYWwuc25hcHB5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbmFwcHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNjYWxhLWxhbmc8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNjYWxhLWxpYnJhcnk8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnhlcmlhbC5zbmFwcHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNuYXBweS1qYXZhPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmpha2FydGEuYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtdGV4dDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgc3BhcmsgMy4wL3NjYWxhIDIuMTIgdXNlcyBwYXJhbmFtZXIgMi44IGFuZCBoYWRvb3AgaXMgc3R1Y2sgd2l0aCBhbiBvbGRlciB2ZXJzaW9uLiB3aXRob3V0IDIuOCB5b3UgZ2V0CisgICAgICAgICAgICAgICAgU1BBUkstMTQyMjAKKyAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20udGhvdWdodHdvcmtzLnBhcmFuYW1lcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGFyYW5hbWVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICAgICAgPC9leGNsdXNpb25zPgogICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi42Ljc8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMubGFuZy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS50aG91Z2h0d29ya3MucGFyYW5hbWVyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGFyYW5hbWVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gc3Bhcmsgc2VsZi1jb25mbGljdCBhbmQgaGFkb29wIGNvbmZsaWN0IC0tPgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy54ZXJpYWwuc25hcHB5PC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+c25hcHB5LWphdmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMS43PC92ZXJzaW9uPgorICAgICAgICAgICAgPHZlcnNpb24+MS4xLjcuMzwvdmVyc2lvbj4KICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHNwYXJrIHNlbGYtY29uZmxpY3QgYW5kIGhhZG9vcCBjb25mbGljdCAtLT4KICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5ldHR5LWFsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuMS4zMi5GaW5hbDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50aG91Z2h0d29ya3MucGFyYW5hbWVyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGFyYW5hbWVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi44PC92ZXJzaW9uPgogICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gc3Bhcmsgc2VsZi1jb25mbGljdCAtLT4KICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5ldHR5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+My45LjkuRmluYWw8L3ZlcnNpb24+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWthcnRhLmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4zLjU8L3ZlcnNpb24+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSBzcGFyayBzZWxmLWNvbmZsaWN0IC0tPgogICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29tcHJlc3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjE5PC92ZXJzaW9uPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNjYWxhLWxhbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4xMi4xMDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHNwYXJrIHNlbGYtY29uZmljdCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjEwLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSBzcGFyayBzZWxmLWNvbmZpY3QgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS56b29rZWVwZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD56b29rZWVwZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjQuNjwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDwhLS0gdXNlIGdyZW1saW4tZ3Jvb3Z5J3MgamxpbmUgLS0+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amxpbmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpsaW5lPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgIDwhLS0gVEVTVCAtLT4KICAgICAgICAgPGRlcGVuZGVuY3k+CkBAIC0zMDIsMTYgKzE3OCw2IEBACiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncmVtbGluLXRlc3Q8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub2JqZW5lc2lzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYmplbmVzaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRpbmtlcnBvcDwvZ3JvdXBJZD4KQEAgLTM5Myw3ICsyNTksNyBAQAogICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEdyZW1saW4tUGx1Z2luLURlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5oYWRvb3A6aGFkb29wLWNsaWVudDoke2hhZG9vcC52ZXJzaW9ufTtvcmcuYXBhY2hlLmhhZG9vcDpoYWRvb3AteWFybi1zZXJ2ZXItd2ViLXByb3h5OiR7aGFkb29wLnZlcnNpb259O29yZy5hcGFjaGUuc3Bhcms6c3BhcmsteWFybl8yLjExOiR7c3BhcmsudmVyc2lvbn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5oYWRvb3A6aGFkb29wLWNsaWVudDoke2hhZG9vcC52ZXJzaW9ufTtvcmcuYXBhY2hlLmhhZG9vcDpoYWRvb3AteWFybi1zZXJ2ZXItd2ViLXByb3h5OiR7aGFkb29wLnZlcnNpb259O29yZy5hcGFjaGUuc3Bhcms6c3BhcmsteWFybl8yLjEyOiR7c3BhcmsudmVyc2lvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0dyZW1saW4tUGx1Z2luLURlcGVuZGVuY2llcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlbGV0ZXMgdGhlIHNlcnZsZXQtYXBpIGphciBmcm9tIHRoZSBwYXRoIGFmdGVyIGluc3RhbGwgLSBjYXVzZXMgY29uZmxpY3RzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxHcmVtbGluLVBsdWdpbi1QYXRocz5zZXJ2bGV0LWFwaS0yLjUuamFyPTwvR3JlbWxpbi1QbHVnaW4tUGF0aHM+CmRpZmYgLS1naXQgYS9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL01lbW9yeUFjY3VtdWxhdG9yLmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL01lbW9yeUFjY3VtdWxhdG9yLmphdmEKaW5kZXggY2Y4Y2IyNS4uZmE3MmViMCAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci9NZW1vcnlBY2N1bXVsYXRvci5qYXZhCisrKyBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvTWVtb3J5QWNjdW11bGF0b3IuamF2YQpAQCAtMTksMzcgKzE5LDU4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5wcm9jZXNzLmNvbXB1dGVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5BY2N1bXVsYXRvclBhcmFtOworaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsudXRpbC5BY2N1bXVsYXRvclYyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5pby5PYmplY3RXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuTWVtb3J5Q29tcHV0ZUtleTsKIAogLyoqCiAgKiBAYXV0aG9yIE1hcmtvIEEuIFJvZHJpZ3VleiAoaHR0cDovL21hcmtvcm9kcmlndWV6LmNvbSkKKyAqIEBhdXRob3IgU3RlcGhlbiBNYWxsZXR0ZSAoaHR0cDovL3N0ZXBoZW4uZ2Vub3ByaW1lLmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lbW9yeUFjY3VtdWxhdG9yPEE+IGltcGxlbWVudHMgQWNjdW11bGF0b3JQYXJhbTxPYmplY3RXcml0YWJsZTxBPj4geworcHVibGljIGZpbmFsIGNsYXNzIE1lbW9yeUFjY3VtdWxhdG9yPEE+IGV4dGVuZHMgQWNjdW11bGF0b3JWMjxPYmplY3RXcml0YWJsZTxBPiwgT2JqZWN0V3JpdGFibGU8QT4+IHsKIAogICAgIHByaXZhdGUgZmluYWwgTWVtb3J5Q29tcHV0ZUtleTxBPiBtZW1vcnlDb21wdXRlS2V5OworICAgIHByaXZhdGUgT2JqZWN0V3JpdGFibGU8QT4gdmFsdWU7CiAKLSAgICBwdWJsaWMgTWVtb3J5QWNjdW11bGF0b3IoZmluYWwgTWVtb3J5Q29tcHV0ZUtleTxBPiBtZW1vcnlDb21wdXRlS2V5KSB7CisgICAgTWVtb3J5QWNjdW11bGF0b3IoZmluYWwgTWVtb3J5Q29tcHV0ZUtleTxBPiBtZW1vcnlDb21wdXRlS2V5KSB7CisgICAgICAgIHRoaXMobWVtb3J5Q29tcHV0ZUtleSwgT2JqZWN0V3JpdGFibGUuZW1wdHkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZW1vcnlBY2N1bXVsYXRvcihmaW5hbCBNZW1vcnlDb21wdXRlS2V5PEE+IG1lbW9yeUNvbXB1dGVLZXksIGZpbmFsIE9iamVjdFdyaXRhYmxlPEE+IGluaXRpYWwpIHsKICAgICAgICAgdGhpcy5tZW1vcnlDb21wdXRlS2V5ID0gbWVtb3J5Q29tcHV0ZUtleTsKKyAgICAgICAgdGhpcy52YWx1ZSA9IGluaXRpYWw7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdFdyaXRhYmxlPEE+IGFkZEFjY3VtdWxhdG9yKGZpbmFsIE9iamVjdFdyaXRhYmxlPEE+IGEsIGZpbmFsIE9iamVjdFdyaXRhYmxlPEE+IGIpIHsKLSAgICAgICAgaWYgKGEuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIGI7Ci0gICAgICAgIGlmIChiLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBhOwotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFdyaXRhYmxlPD4odGhpcy5tZW1vcnlDb21wdXRlS2V5LmdldFJlZHVjZXIoKS5hcHBseShhLmdldCgpLCBiLmdldCgpKSk7CisgICAgcHVibGljIGJvb2xlYW4gaXNaZXJvKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0V3JpdGFibGUuZW1wdHkoKS5lcXVhbHModmFsdWUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RXcml0YWJsZTxBPiBhZGRJblBsYWNlKGZpbmFsIE9iamVjdFdyaXRhYmxlPEE+IGEsIGZpbmFsIE9iamVjdFdyaXRhYmxlPEE+IGIpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWRkQWNjdW11bGF0b3IoYSwgYik7CisgICAgcHVibGljIEFjY3VtdWxhdG9yVjI8T2JqZWN0V3JpdGFibGU8QT4sIE9iamVjdFdyaXRhYmxlPEE+PiBjb3B5KCkgeworICAgICAgICByZXR1cm4gbmV3IE1lbW9yeUFjY3VtdWxhdG9yPD4odGhpcy5tZW1vcnlDb21wdXRlS2V5LCB0aGlzLnZhbHVlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0V3JpdGFibGU8QT4gemVybyhmaW5hbCBPYmplY3RXcml0YWJsZTxBPiBhKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RXcml0YWJsZS5lbXB0eSgpOworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICB0aGlzLnZhbHVlID0gT2JqZWN0V3JpdGFibGUuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGQoZmluYWwgT2JqZWN0V3JpdGFibGU8QT4gdikgeworICAgICAgICBpZiAodGhpcy52YWx1ZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdjsKKyAgICAgICAgZWxzZSBpZiAoIXYuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBPYmplY3RXcml0YWJsZTw+KHRoaXMubWVtb3J5Q29tcHV0ZUtleS5nZXRSZWR1Y2VyKCkuYXBwbHkodmFsdWUuZ2V0KCksIHYuZ2V0KCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtZXJnZShmaW5hbCBBY2N1bXVsYXRvclYyPE9iamVjdFdyaXRhYmxlPEE+LCBPYmplY3RXcml0YWJsZTxBPj4gb3RoZXIpIHsKKyAgICAgICAgdGhpcy5hZGQob3RoZXIudmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFdyaXRhYmxlPEE+IHZhbHVlKCkgeworICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL1NwYXJrRXhlY3V0b3IuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvU3BhcmtFeGVjdXRvci5qYXZhCmluZGV4IGU5MzcyZDAuLjU5YjhjMjIgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvU3BhcmtFeGVjdXRvci5qYXZhCisrKyBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvU3BhcmtFeGVjdXRvci5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3BhcmsucHJvY2Vzcy5jb21wdXRlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuT3B0aW9uYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLmFwaS5qYXZhLkphdmFQYWlyUkREOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuZnVuY3Rpb24uRnVuY3Rpb24yOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuZnVuY3Rpb24uUGFpckZsYXRNYXBGdW5jdGlvbjsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvU3BhcmtHcmFwaENvbXB1dGVyLmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL1NwYXJrR3JhcGhDb21wdXRlci5qYXZhCmluZGV4IDUxODRkYjYuLmQzNjRiM2QgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvU3BhcmtHcmFwaENvbXB1dGVyLmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci9TcGFya0dyYXBoQ29tcHV0ZXIuamF2YQpAQCAtMTgsOSArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3BhcmsucHJvY2Vzcy5jb21wdXRlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5GaWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5idWlsZGVyLmZsdWVudC5Db25maWd1cmF0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuY29uY3VycmVudC5CYXNpY1RocmVhZEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CkBAIC0xMDIsNyArMTAxLDcgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNwYXJrR3JhcGhDb21wdXRlciBleHRlbmRzIEFic3RyYWN0SGFkb29wR3JhcGhDb21wdXRlciB7CiAKLSAgICBwcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24gc3BhcmtDb25maWd1cmF0aW9uOworICAgIHByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb24gc3BhcmtDb25maWd1cmF0aW9uOwogICAgIHByaXZhdGUgYm9vbGVhbiB3b3JrZXJzU2V0ID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnlCb3NzID0gbmV3IEJhc2ljVGhyZWFkRmFjdG9yeS5CdWlsZGVyKCkubmFtaW5nUGF0dGVybihTcGFya0dyYXBoQ29tcHV0ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi1ib3NzIikuYnVpbGQoKTsKIApAQCAtMjUxLDcgKzI1MCw3IEBACiAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgIC8vIGFwYWNoZSBhbmQgaGFkb29wIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgZ3JhcGggY29tcHV0ZXIgY29tcHV0YXRpb24KLSAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24gZ3JhcGhDb21wdXRlckNvbmZpZ3VyYXRpb24gPSBuZXcgSGFkb29wQ29uZmlndXJhdGlvbih0aGlzLnNwYXJrQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbiBncmFwaENvbXB1dGVyQ29uZmlndXJhdGlvbiA9IG5ldyBIYWRvb3BDb25maWd1cmF0aW9uKHRoaXMuc3BhcmtDb25maWd1cmF0aW9uKTsKICAgICAgICAgICAgIGlmICghZ3JhcGhDb21wdXRlckNvbmZpZ3VyYXRpb24uY29udGFpbnNLZXkoQ29uc3RhbnRzLlNQQVJLX1NFUklBTElaRVIpKSB7CiAgICAgICAgICAgICAgICAgZ3JhcGhDb21wdXRlckNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLlNQQVJLX1NFUklBTElaRVIsIEtyeW9TZXJpYWxpemVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFncmFwaENvbXB1dGVyQ29uZmlndXJhdGlvbi5jb250YWluc0tleShDb25zdGFudHMuU1BBUktfS1JZT19SRUdJU1RSQVRPUikpCkBAIC01NDEsNyArNTQwLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgRmlsZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzQ29uZmlndXJhdGlvbihhcmdzWzBdKTsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbnMgY29uZmlncyA9IG5ldyBDb25maWd1cmF0aW9ucygpOworICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29uZmlncy5wcm9wZXJ0aWVzKGFyZ3NbMF0pOwogICAgICAgICBuZXcgU3BhcmtHcmFwaENvbXB1dGVyKEhhZG9vcEdyYXBoLm9wZW4oY29uZmlndXJhdGlvbikpLnByb2dyYW0oVmVydGV4UHJvZ3JhbS5jcmVhdGVWZXJ0ZXhQcm9ncmFtKEhhZG9vcEdyYXBoLm9wZW4oY29uZmlndXJhdGlvbiksIGNvbmZpZ3VyYXRpb24pKS5zdWJtaXQoKS5nZXQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL1NwYXJrTWVtb3J5LmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL1NwYXJrTWVtb3J5LmphdmEKaW5kZXggYmY4NTkwZS4uNWEwNDE2MiAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci9TcGFya01lbW9yeS5qYXZhCisrKyBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvU3BhcmtNZW1vcnkuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3BhcmsucHJvY2Vzcy5jb21wdXRlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuQWNjdW11bGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay51dGlsLkFjY3VtdWxhdG9yVjI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhU3BhcmtDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYnJvYWRjYXN0LkJyb2FkY2FzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5zdHJ1Y3R1cmUuaW8uT2JqZWN0V3JpdGFibGU7CkBAIC00Niw3ICs0Niw3IEBACiBwdWJsaWMgZmluYWwgY2xhc3MgU3BhcmtNZW1vcnkgaW1wbGVtZW50cyBNZW1vcnkuQWRtaW4sIFNlcmlhbGl6YWJsZSB7CiAKICAgICBwdWJsaWMgZmluYWwgTWFwPFN0cmluZywgTWVtb3J5Q29tcHV0ZUtleT4gbWVtb3J5Q29tcHV0ZUtleXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBBY2N1bXVsYXRvcjxPYmplY3RXcml0YWJsZT4+IHNwYXJrTWVtb3J5ID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQWNjdW11bGF0b3JWMjxPYmplY3RXcml0YWJsZSxPYmplY3RXcml0YWJsZT4+IHNwYXJrTWVtb3J5ID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBpdGVyYXRpb24gPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgcnVudGltZSA9IG5ldyBBdG9taWNMb25nKDBsKTsKICAgICBwcml2YXRlIEJyb2FkY2FzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBicm9hZGNhc3Q7CkBAIC02Miw5ICs2Miw5IEBACiAgICAgICAgICAgICB0aGlzLm1lbW9yeUNvbXB1dGVLZXlzLnB1dChtYXBSZWR1Y2UuZ2V0TWVtb3J5S2V5KCksIE1lbW9yeUNvbXB1dGVLZXkub2YobWFwUmVkdWNlLmdldE1lbW9yeUtleSgpLCBPcGVyYXRvci5hc3NpZ24sIGZhbHNlLCBmYWxzZSkpOwogICAgICAgICB9CiAgICAgICAgIGZvciAoZmluYWwgTWVtb3J5Q29tcHV0ZUtleSBtZW1vcnlDb21wdXRlS2V5IDogdGhpcy5tZW1vcnlDb21wdXRlS2V5cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgdGhpcy5zcGFya01lbW9yeS5wdXQoCi0gICAgICAgICAgICAgICAgICAgIG1lbW9yeUNvbXB1dGVLZXkuZ2V0S2V5KCksCi0gICAgICAgICAgICAgICAgICAgIHNwYXJrQ29udGV4dC5hY2N1bXVsYXRvcihPYmplY3RXcml0YWJsZS5lbXB0eSgpLCBtZW1vcnlDb21wdXRlS2V5LmdldEtleSgpLCBuZXcgTWVtb3J5QWNjdW11bGF0b3I8PihtZW1vcnlDb21wdXRlS2V5KSkpOworICAgICAgICAgICAgZmluYWwgQWNjdW11bGF0b3JWMjxPYmplY3RXcml0YWJsZSwgT2JqZWN0V3JpdGFibGU+IGFjY3VtdWxhdG9yID0gbmV3IE1lbW9yeUFjY3VtdWxhdG9yPD4obWVtb3J5Q29tcHV0ZUtleSk7CisgICAgICAgICAgICBKYXZhU3BhcmtDb250ZXh0LnRvU3BhcmtDb250ZXh0KHNwYXJrQ29udGV4dCkucmVnaXN0ZXIoYWNjdW11bGF0b3IsIG1lbW9yeUNvbXB1dGVLZXkuZ2V0S2V5KCkpOworICAgICAgICAgICAgdGhpcy5zcGFya01lbW9yeS5wdXQobWVtb3J5Q29tcHV0ZUtleS5nZXRLZXkoKSwgYWNjdW11bGF0b3IpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuYnJvYWRjYXN0ID0gc3BhcmtDb250ZXh0LmJyb2FkY2FzdChDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKTsKICAgICB9CkBAIC0xMzUsOCArMTM1LDEwIEBACiAgICAgICAgIGNoZWNrS2V5VmFsdWUoa2V5LCB2YWx1ZSk7CiAgICAgICAgIGlmICh0aGlzLmluRXhlY3V0ZSkKICAgICAgICAgICAgIHRocm93IE1lbW9yeS5FeGNlcHRpb25zLm1lbW9yeVNldE9ubHlEdXJpbmdWZXJ0ZXhQcm9ncmFtU2V0VXBBbmRUZXJtaW5hdGUoa2V5KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhpcy5zcGFya01lbW9yeS5nZXQoa2V5KS5zZXRWYWx1ZShuZXcgT2JqZWN0V3JpdGFibGU8Pih2YWx1ZSkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuc3BhcmtNZW1vcnkuZ2V0KGtleSkucmVzZXQoKTsKKyAgICAgICAgICAgIHRoaXMuc3BhcmtNZW1vcnkuZ2V0KGtleSkuYWRkKG5ldyBPYmplY3RXcml0YWJsZTw+KHZhbHVlKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9pbnRlcmNlcHRvci9TcGFya1N0YXJCYXJyaWVySW50ZXJjZXB0b3IuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9pbnRlcmNlcHRvci9TcGFya1N0YXJCYXJyaWVySW50ZXJjZXB0b3IuamF2YQppbmRleCBkZTQyNTI1Li43ZWIxMmQ0IDEwMDY0NAotLS0gYS9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vaW50ZXJjZXB0b3IvU3BhcmtTdGFyQmFycmllckludGVyY2VwdG9yLmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL2ludGVyY2VwdG9yL1NwYXJrU3RhckJhcnJpZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgZmluYWwgU3RlcDw/LCA/PiBzdGFydFN0ZXAgPSB0cmF2ZXJzYWwuZ2V0U3RhcnRTdGVwKCk7CiAgICAgICAgIGZpbmFsIFN0ZXA8PywgPz4gZW5kU3RlcCA9IHRyYXZlcnNhbC5nZXRFbmRTdGVwKCk7CiAgICAgICAgIC8vIHJpZ2h0IG5vdyB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSBvZiBob3cgdGhlIFNwYXJrU3RhckJhcnJpZXJJbnRlcmNlcHRvciBtdXRhdGVzIHRoZSB0cmF2ZXJzYWwgcHJpb3IgdG8gbG9jYWwgZXZhbHVhdGlvbgotICAgICAgICBpZiAodHJhdmVyc2FsLmdldFN0cmF0ZWdpZXMoKS50b0xpc3QoKS5zdHJlYW0oKS5maWx0ZXIoc3RyYXRlZ3kgLT4gc3RyYXRlZ3kgaW5zdGFuY2VvZiBTdWJncmFwaFN0cmF0ZWd5KS5maW5kQW55KCkuaXNQcmVzZW50KCkpCisgICAgICAgIGlmICh0cmF2ZXJzYWwuZ2V0U3RyYXRlZ2llcygpLmdldFN0cmF0ZWd5KFN1YmdyYXBoU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBpZiAoIXN0YXJ0U3RlcC5nZXRDbGFzcygpLmVxdWFscyhHcmFwaFN0ZXAuY2xhc3MpIHx8ICgoR3JhcGhTdGVwKSBzdGFydFN0ZXApLnJldHVybnNFZGdlKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvU3BhcmsuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9TcGFyay5qYXZhCmluZGV4IGQ5YmZkNjguLjY5N2U2NDkgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9TcGFyay5qYXZhCisrKyBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9TcGFyay5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5zdHJ1Y3R1cmU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuU3BhcmtDb25mOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuU3BhcmtDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsucmRkLlJERDsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9JbnB1dEZvcm1hdFJERC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0Rm9ybWF0UkRELmphdmEKaW5kZXggOTU4OTQ5Ny4uZWNlZDEzMiAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0Rm9ybWF0UkRELmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0Rm9ybWF0UkRELmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTnVsbFdyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dEZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0LlNlcXVlbmNlRmlsZUlucHV0Rm9ybWF0OwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0T3V0cHV0SGVscGVyLmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vSW5wdXRPdXRwdXRIZWxwZXIuamF2YQppbmRleCA0NDRiMTBhLi5mMGEwNDUzIDEwMDY0NAotLS0gYS9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vSW5wdXRPdXRwdXRIZWxwZXIuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vSW5wdXRPdXRwdXRIZWxwZXIuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3Bhcmsuc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5IYWRvb3BDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5IYWRvb3BHcmFwaDsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9JbnB1dFJERC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0UkRELmphdmEKaW5kZXggYTFmMDQ0Yy4uYjM3NjcyZSAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0UkRELmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0UkRELmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLklucHV0Rm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuSmF2YVBhaXJSREQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhU3BhcmtDb250ZXh0OwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL091dHB1dEZvcm1hdFJERC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL091dHB1dEZvcm1hdFJERC5qYXZhCmluZGV4IGZlODQ4YTAuLjNkMTY5ZTQgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9PdXRwdXRGb3JtYXRSREQuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vT3V0cHV0Rm9ybWF0UkRELmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5OdWxsV3JpdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk91dHB1dEZvcm1hdDsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9PdXRwdXRSREQuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9PdXRwdXRSREQuamF2YQppbmRleCAzMzMyYjRkLi42NjY1MzRmIDEwMDY0NAotLS0gYS9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vT3V0cHV0UkRELmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL091dHB1dFJERC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5zdHJ1Y3R1cmUuaW87CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuSmF2YVBhaXJSREQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5pby5WZXJ0ZXhXcml0YWJsZTsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9QZXJzaXN0ZWRJbnB1dFJERC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1BlcnNpc3RlZElucHV0UkRELmphdmEKaW5kZXggMDAyMzdkYi4uMGI2YWEyZCAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1BlcnNpc3RlZElucHV0UkRELmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1BlcnNpc3RlZElucHV0UkRELmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhUGFpclJERDsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLmFwaS5qYXZhLkphdmFSREQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhU3BhcmtDb250ZXh0OwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1BlcnNpc3RlZE91dHB1dFJERC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1BlcnNpc3RlZE91dHB1dFJERC5qYXZhCmluZGV4IDZlYjY2NzMuLjVjNzYzOTEgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9QZXJzaXN0ZWRPdXRwdXRSREQuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vUGVyc2lzdGVkT3V0cHV0UkRELmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhUGFpclJERDsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLnN0b3JhZ2UuU3RvcmFnZUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLkNvbnN0YW50czsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9TcGFya0NvbnRleHRTdG9yYWdlLmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vU3BhcmtDb250ZXh0U3RvcmFnZS5qYXZhCmluZGV4IGUwMmIxNTkuLjRkNzJmNzAgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9TcGFya0NvbnRleHRTdG9yYWdlLmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1NwYXJrQ29udGV4dFN0b3JhZ2UuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3Bhcmsuc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLklucHV0Rm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuU3BhcmtDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuSmF2YVNwYXJrQ29udGV4dDsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9SZWdpc3RyYXRvci5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8vR3J5b1JlZ2lzdHJhdG9yLmphdmEKaW5kZXggMTNmYzc4Ny4uZDBlNDZkYSAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8vR3J5b1JlZ2lzdHJhdG9yLmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8vR3J5b1JlZ2lzdHJhdG9yLmphdmEKQEAgLTE5OCw4ICsxOTgsOCBAQAogICAgICAgICAvLyB0aGUgb3JkZXJpbmcgb2YgdGhlIGV4aXN0aW5nIGVudHJpZXMgaW4gdGhhdCBjb25zdHJ1Y3Rvciwgc2luY2Ugbm90IGFsbAogICAgICAgICAvLyBvZiB0aGUgZW50cmllcyBhcmUgZm9yIFRpbmtlclBvcCAoYW5kIHRoZSBvcmRlcmluZyBpcyBzaWduaWZpY2FudCkuCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtLnB1dChDbGFzcy5mb3JOYW1lKCJzY2FsYS5yZWZsZWN0LkNsYXNzVGFnJCRhbm9uJDEiKSwgbmV3IEphdmFTZXJpYWxpemVyKCkpOwotICAgICAgICAgICAgbS5wdXQoQ2xhc3MuZm9yTmFtZSgic2NhbGEucmVmbGVjdC5NYW5pZmVzdEZhY3RvcnkkJGFub24kMSIpLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSk7CisgICAgICAgICAgICBtLnB1dChDbGFzcy5mb3JOYW1lKCJzY2FsYS5yZWZsZWN0Lk1hbmlmZXN0RmFjdG9yeSRBbnlNYW5pZmVzdCIpLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSk7CisgICAgICAgICAgICBtLnB1dChDbGFzcy5mb3JOYW1lKCJzY2FsYS5yZWZsZWN0LkNsYXNzVGFnJEdlbmVyaWNDbGFzc1RhZyIpLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSk7CiAgICAgICAgICAgICBtLnB1dChDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnNwYXJrLmludGVybmFsLmlvLkZpbGVDb21taXRQcm90b2NvbCRUYXNrQ29tbWl0TWVzc2FnZSIpLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSk7CiAgICAgICAgICAgICBtLnB1dChDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnNwYXJrLmludGVybmFsLmlvLkZpbGVDb21taXRQcm90b2NvbCRFbXB0eVRhc2tDb21taXRNZXNzYWdlJCIpLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSk7CiAKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9TZXJpYWxpemVyLmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vZ3J5by9HcnlvU2VyaWFsaXplci5qYXZhCmluZGV4IGVjNWFlOWIuLjJkY2U4MzIgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9TZXJpYWxpemVyLmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8vR3J5b1NlcmlhbGl6ZXIuamF2YQpAQCAtMjAsOCArMjAsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pby5ncnlvOwogCiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLlNwYXJrQ29uZjsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLmFwaS5weXRob24uUHl0aG9uQnJvYWRjYXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYnJvYWRjYXN0LlRvcnJlbnRCcm9hZGNhc3Q7CkBAIC0xMTUsNyArMTE1LDYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb24gbWFrZUFwYWNoZUNvbmZpZ3VyYXRpb24oZmluYWwgU3BhcmtDb25mIHNwYXJrQ29uZmlndXJhdGlvbikgewogICAgICAgICBmaW5hbCBCYXNlQ29uZmlndXJhdGlvbiBhcGFjaGVDb25maWd1cmF0aW9uID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFwYWNoZUNvbmZpZ3VyYXRpb24uc2V0RGVsaW1pdGVyUGFyc2luZ0Rpc2FibGVkKHRydWUpOwogICAgICAgICBmb3IgKGZpbmFsIFR1cGxlMjxTdHJpbmcsIFN0cmluZz4gdHVwbGUgOiBzcGFya0NvbmZpZ3VyYXRpb24uZ2V0QWxsKCkpIHsKICAgICAgICAgICAgIGFwYWNoZUNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkodHVwbGUuXzEoKSwgdHVwbGUuXzIoKSk7CiAgICAgICAgIH0KQEAgLTEzOSw4ICsxMzgsOCBAQAogICAgICAgICAgICAgICAgIHN1cGVyLnJlZ2lzdGVyKEdyeW9Jby5jbGFzcywgVG9ycmVudEJyb2FkY2FzdC5jbGFzcywgbnVsbCk7CiAgICAgICAgICAgICAgICAgc3VwZXIucmVnaXN0ZXIoR3J5b0lvLmNsYXNzLCBQeXRob25Ccm9hZGNhc3QuY2xhc3MsIG51bGwpOwogICAgICAgICAgICAgICAgIHN1cGVyLnJlZ2lzdGVyKEdyeW9Jby5jbGFzcywgQm94ZWRVbml0LmNsYXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICBzdXBlci5yZWdpc3RlcihHcnlvSW8uY2xhc3MsIENsYXNzLmZvck5hbWUoInNjYWxhLnJlZmxlY3QuQ2xhc3NUYWckJGFub24kMSIpLCBuZXcgSmF2YVNlcmlhbGl6ZXIoKSk7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVnaXN0ZXIoR3J5b0lvLmNsYXNzLCBDbGFzcy5mb3JOYW1lKCJzY2FsYS5yZWZsZWN0Lk1hbmlmZXN0RmFjdG9yeSQkYW5vbiQxIiksIG5ldyBKYXZhU2VyaWFsaXplcigpKTsKKyAgICAgICAgICAgICAgICBzdXBlci5yZWdpc3RlcihHcnlvSW8uY2xhc3MsIENsYXNzLmZvck5hbWUoInNjYWxhLnJlZmxlY3QuTWFuaWZlc3RGYWN0b3J5JEFueU1hbmlmZXN0IiksIG5ldyBKYXZhU2VyaWFsaXplcigpKTsKKyAgICAgICAgICAgICAgICBzdXBlci5yZWdpc3RlcihHcnlvSW8uY2xhc3MsIENsYXNzLmZvck5hbWUoInNjYWxhLnJlZmxlY3QuQ2xhc3NUYWckR2VuZXJpY0NsYXNzVGFnIiksIG5ldyBKYXZhU2VyaWFsaXplcigpKTsKICAgICAgICAgICAgICAgICBzdXBlci5yZWdpc3RlcihHcnlvSW8uY2xhc3MsIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuc3BhcmsuaW50ZXJuYWwuaW8uRmlsZUNvbW1pdFByb3RvY29sJFRhc2tDb21taXRNZXNzYWdlIiksIG5ldyBKYXZhU2VyaWFsaXplcigpKTsKICAgICAgICAgICAgICAgICBzdXBlci5yZWdpc3RlcihHcnlvSW8uY2xhc3MsIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuc3BhcmsuaW50ZXJuYWwuaW8uRmlsZUNvbW1pdFByb3RvY29sJEVtcHR5VGFza0NvbW1pdE1lc3NhZ2UkIiksIG5ldyBKYXZhU2VyaWFsaXplcigpKTsKICAgICAgICAgICAgICAgICBzdXBlci5yZWdpc3RlcihHcnlvSW8uY2xhc3MsIENsYXNzLmZvck5hbWUoInNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLk1hcCRFbXB0eU1hcCQiKSwgbmV3IEphdmFTZXJpYWxpemVyKCkpOwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8va3J5b3NoaW0vdW5zaGFkZWQvVW5zaGFkZWRLcnlvU2hpbVNlcnZpY2UuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9ncnlvL2tyeW9zaGltL3Vuc2hhZGVkL1Vuc2hhZGVkS3J5b1NoaW1TZXJ2aWNlLmphdmEKaW5kZXggZTFhNDYwMC4uNzdjYmYyMCAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8va3J5b3NoaW0vdW5zaGFkZWQvVW5zaGFkZWRLcnlvU2hpbVNlcnZpY2UuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vZ3J5by9rcnlvc2hpbS91bnNoYWRlZC9VbnNoYWRlZEtyeW9TaGltU2VydmljZS5qYXZhCkBAIC0yMSw3ICsyMSw3IEBACiBpbXBvcnQgY29tLmVzb3Rlcmljc29mdHdhcmUua3J5by5LcnlvOwogaW1wb3J0IGNvbS5lc290ZXJpY3NvZnR3YXJlLmtyeW8uaW8uSW5wdXQ7CiBpbXBvcnQgY29tLmVzb3Rlcmljc29mdHdhcmUua3J5by5pby5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLlNwYXJrQ29uZjsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLnNlcmlhbGl6ZXIuS3J5b1NlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5zdHJ1Y3R1cmUuU3Bhcms7CmRpZmYgLS1naXQgYS9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9BYnN0cmFjdFNwYXJrVGVzdC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvQWJzdHJhY3RTcGFya1Rlc3QuamF2YQppbmRleCAyZjNlYjZmLi5mOWFkYTIwIDEwMDY0NAotLS0gYS9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9BYnN0cmFjdFNwYXJrVGVzdC5qYXZhCisrKyBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL0Fic3RyYWN0U3BhcmtUZXN0LmphdmEKQEAgLTE5LDggKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5sYXVuY2hlci5TcGFya0xhdW5jaGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5zdHJ1Y3R1cmUuSGFkb29wR3JhcGg7CkBAIC01MSw3ICs1MSw2IEBACiAKICAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBnZXRCYXNlQ29uZmlndXJhdGlvbigpIHsKICAgICAgICAgZmluYWwgQmFzZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBCYXNlQ29uZmlndXJhdGlvbigpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldERlbGltaXRlclBhcnNpbmdEaXNhYmxlZCh0cnVlKTsKICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShTcGFya0xhdW5jaGVyLlNQQVJLX01BU1RFUiwgImxvY2FsWzRdIik7CiAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLlNQQVJLX1NFUklBTElaRVIsIEdyeW9TZXJpYWxpemVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CiAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLlNQQVJLX0tSWU9fUkVHSVNUUkFUSU9OX1JFUVVJUkVELCB0cnVlKTsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvTG9jYWxQcm9wZXJ0eVRlc3QuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvTG9jYWxQcm9wZXJ0eVRlc3QuamF2YQppbmRleCBjNmI2ZThhLi44MjljNDA1IDEwMDY0NAotLS0gYS9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL0xvY2FsUHJvcGVydHlUZXN0LmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci9Mb2NhbFByb3BlcnR5VGVzdC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5wcm9jZXNzLmNvbXB1dGVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5TcGFya0NvbmY7CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5TcGFya0NvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhU3BhcmtDb250ZXh0OwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1NwYXJrSW50ZXJjZXB0b3JTdHJhdGVneVRlc3QuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9TcGFya0ludGVyY2VwdG9yU3RyYXRlZ3lUZXN0LmphdmEKaW5kZXggNzNkNDdkYi4uYjFkNThhNiAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1NwYXJrSW50ZXJjZXB0b3JTdHJhdGVneVRlc3QuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9wcm9jZXNzL2NvbXB1dGVyL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vU3BhcmtJbnRlcmNlcHRvclN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5wcm9jZXNzLmNvbXB1dGVyLnRyYXZlcnNhbC5zdHJhdGVneS5vcHRpbWl6YXRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uVGVzdEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvLmdyeW8uR3J5b0lucHV0Rm9ybWF0OwpAQCAtNjksOSArNjksOSBAQAogICAgICAgICAvLy8KICAgICAgICAgR3JhcGggZ3JhcGggPSBHcmFwaEZhY3Rvcnkub3Blbihjb25maWd1cmF0aW9uKTsKICAgICAgICAgR3JhcGhUcmF2ZXJzYWxTb3VyY2UgZyA9IGdyYXBoLnRyYXZlcnNhbCgpLndpdGhDb21wdXRlcigpLndpdGhvdXRTdHJhdGVnaWVzKFNwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3kuY2xhc3MpOwotICAgICAgICBhc3NlcnRGYWxzZShnLmdldFN0cmF0ZWdpZXMoKS50b0xpc3QoKS5jb250YWlucyhTcGFya1NpbmdsZUl0ZXJhdGlvblN0cmF0ZWd5Lmluc3RhbmNlKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZy5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koU3BhcmtTaW5nbGVJdGVyYXRpb25TdHJhdGVneS5jbGFzcykuaXNQcmVzZW50KCkpOwogICAgICAgICBhc3NlcnRGYWxzZShnLlYoKS5jb3VudCgpLmV4cGxhaW4oKS50b1N0cmluZygpLmNvbnRhaW5zKFNwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZy5nZXRTdHJhdGVnaWVzKCkudG9MaXN0KCkuY29udGFpbnMoU3BhcmtJbnRlcmNlcHRvclN0cmF0ZWd5Lmluc3RhbmNlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnLmdldFN0cmF0ZWdpZXMoKS5nZXRTdHJhdGVneShTcGFya0ludGVyY2VwdG9yU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShnLlYoKS5jb3VudCgpLmV4cGxhaW4oKS50b1N0cmluZygpLmNvbnRhaW5zKFNwYXJrSW50ZXJjZXB0b3JTdHJhdGVneS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKICAgICAgICAgLy8vIGdyb3VwQ291bnQobSktdGVzdAogICAgICAgICBUcmF2ZXJzYWwuQWRtaW48VmVydGV4LCBMb25nPiB0cmF2ZXJzYWwgPSBnLlYoKS5ncm91cENvdW50KCJtIikuYnkoVC5sYWJlbCkuY291bnQoKS5hc0FkbWluKCk7CkBAIC05Nyw5ICs5Nyw5IEBACiAgICAgICAgIC8vLwogICAgICAgICBHcmFwaCBncmFwaCA9IEdyYXBoRmFjdG9yeS5vcGVuKGNvbmZpZ3VyYXRpb24pOwogICAgICAgICBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCkud2l0aENvbXB1dGVyKCkud2l0aG91dFN0cmF0ZWdpZXMoU3BhcmtTaW5nbGVJdGVyYXRpb25TdHJhdGVneS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGcuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKFNwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3kuaW5zdGFuY2UoKSkpOworICAgICAgICBhc3NlcnRGYWxzZShnLmdldFN0cmF0ZWdpZXMoKS5nZXRTdHJhdGVneShTcGFya1NpbmdsZUl0ZXJhdGlvblN0cmF0ZWd5LmNsYXNzKS5pc1ByZXNlbnQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGcuVigpLmNvdW50KCkuZXhwbGFpbigpLnRvU3RyaW5nKCkuY29udGFpbnMoU3BhcmtTaW5nbGVJdGVyYXRpb25TdHJhdGVneS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnLmdldFN0cmF0ZWdpZXMoKS50b0xpc3QoKS5jb250YWlucyhTcGFya0ludGVyY2VwdG9yU3RyYXRlZ3kuaW5zdGFuY2UoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGcuZ2V0U3RyYXRlZ2llcygpLmdldFN0cmF0ZWd5KFNwYXJrSW50ZXJjZXB0b3JTdHJhdGVneS5jbGFzcykuaXNQcmVzZW50KCkpOwogICAgICAgICBhc3NlcnRUcnVlKGcuVigpLmNvdW50KCkuZXhwbGFpbigpLnRvU3RyaW5nKCkuY29udGFpbnMoU3BhcmtJbnRlcmNlcHRvclN0cmF0ZWd5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOwogICAgICAgICAvLy8gU3BhcmtDb3VudEludGVyY2VwdG9yIG1hdGNoZXMKICAgICAgICAgdGVzdChTcGFya1N0YXJCYXJyaWVySW50ZXJjZXB0b3IuY2xhc3MsIDZsLCBnLlYoKS5jb3VudCgpKTsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3Byb2Nlc3MvY29tcHV0ZXIvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9TcGFya1NpbmdsZUl0ZXJhdGlvblN0cmF0ZWd5VGVzdC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1NwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3lUZXN0LmphdmEKaW5kZXggZGE2MzU2MC4uNjIwMmYzMyAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1NwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3lUZXN0LmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcmsvcHJvY2Vzcy9jb21wdXRlci90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1NwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3lUZXN0LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLnN0cmF0ZWd5Lm9wdGltaXphdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5UZXN0SGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5zdHJ1Y3R1cmUuaW8uZ3J5by5HcnlvSW5wdXRGb3JtYXQ7CkBAIC04OCwxMSArODgsMTEgQEAKIAogICAgICAgICBHcmFwaCBncmFwaCA9IEdyYXBoRmFjdG9yeS5vcGVuKGNvbmZpZ3VyYXRpb24pOwogICAgICAgICBHcmFwaFRyYXZlcnNhbFNvdXJjZSBnID0gZ3JhcGgudHJhdmVyc2FsKCkud2l0aENvbXB1dGVyKCkud2l0aG91dFN0cmF0ZWdpZXMoU3BhcmtJbnRlcmNlcHRvclN0cmF0ZWd5LmNsYXNzLCBNZXNzYWdlUGFzc2luZ1JlZHVjdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZy5nZXRTdHJhdGVnaWVzKCkudG9MaXN0KCkuY29udGFpbnMoU3BhcmtJbnRlcmNlcHRvclN0cmF0ZWd5Lmluc3RhbmNlKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZy5nZXRTdHJhdGVnaWVzKCkuZ2V0U3RyYXRlZ3koU3BhcmtJbnRlcmNlcHRvclN0cmF0ZWd5LmNsYXNzKS5pc1ByZXNlbnQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGcuVigpLmNvdW50KCkuZXhwbGFpbigpLmdldFN0cmF0ZWd5VHJhdmVyc2FscygpLnN0cmVhbSgpLmZpbHRlcihwYWlyIC0+IHBhaXIuZ2V0VmFsdWUwKCkgaW5zdGFuY2VvZiBTcGFya0ludGVyY2VwdG9yU3RyYXRlZ3kpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGcuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKE1lc3NhZ2VQYXNzaW5nUmVkdWN0aW9uU3RyYXRlZ3kuaW5zdGFuY2UoKSkpOworICAgICAgICBhc3NlcnRGYWxzZShnLmdldFN0cmF0ZWdpZXMoKS5nZXRTdHJhdGVneShNZXNzYWdlUGFzc2luZ1JlZHVjdGlvblN0cmF0ZWd5LmNsYXNzKS5pc1ByZXNlbnQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGcuVigpLmNvdW50KCkuZXhwbGFpbigpLmdldFN0cmF0ZWd5VHJhdmVyc2FscygpLnN0cmVhbSgpLmZpbHRlcihwYWlyIC0+IHBhaXIuZ2V0VmFsdWUwKCkgaW5zdGFuY2VvZiBNZXNzYWdlUGFzc2luZ1JlZHVjdGlvblN0cmF0ZWd5KS5maW5kQW55KCkuaXNQcmVzZW50KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGcuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKFNwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3kuaW5zdGFuY2UoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGcuZ2V0U3RyYXRlZ2llcygpLmdldFN0cmF0ZWd5KFNwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShnLlYoKS5jb3VudCgpLmV4cGxhaW4oKS5nZXRTdHJhdGVneVRyYXZlcnNhbHMoKS5zdHJlYW0oKS5maWx0ZXIocGFpciAtPiBwYWlyLmdldFZhbHVlMCgpIGluc3RhbmNlb2YgU3BhcmtTaW5nbGVJdGVyYXRpb25TdHJhdGVneSkuZmluZEFueSgpLmlzUHJlc2VudCgpKTsKIAogICAgICAgICB0ZXN0KHRydWUsIGcuVigpLmxpbWl0KDEwKSk7CkBAIC0xMTYsMTEgKzExNiwxMSBAQAogCiAgICAgICAgIGdyYXBoID0gR3JhcGhGYWN0b3J5Lm9wZW4oY29uZmlndXJhdGlvbik7CiAgICAgICAgIGcgPSBncmFwaC50cmF2ZXJzYWwoKS53aXRoQ29tcHV0ZXIoKS53aXRob3V0U3RyYXRlZ2llcyhTcGFya0ludGVyY2VwdG9yU3RyYXRlZ3kuY2xhc3MpLndpdGhTdHJhdGVnaWVzKE1lc3NhZ2VQYXNzaW5nUmVkdWN0aW9uU3RyYXRlZ3kuaW5zdGFuY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGcuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKFNwYXJrSW50ZXJjZXB0b3JTdHJhdGVneS5pbnN0YW5jZSgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGcuZ2V0U3RyYXRlZ2llcygpLmdldFN0cmF0ZWd5KFNwYXJrSW50ZXJjZXB0b3JTdHJhdGVneS5jbGFzcykuaXNQcmVzZW50KCkpOwogICAgICAgICBhc3NlcnRGYWxzZShnLlYoKS5jb3VudCgpLmV4cGxhaW4oKS5nZXRTdHJhdGVneVRyYXZlcnNhbHMoKS5zdHJlYW0oKS5maWx0ZXIocGFpciAtPiBwYWlyLmdldFZhbHVlMCgpIGluc3RhbmNlb2YgU3BhcmtJbnRlcmNlcHRvclN0cmF0ZWd5KS5maW5kQW55KCkuaXNQcmVzZW50KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGcuZ2V0U3RyYXRlZ2llcygpLnRvTGlzdCgpLmNvbnRhaW5zKE1lc3NhZ2VQYXNzaW5nUmVkdWN0aW9uU3RyYXRlZ3kuaW5zdGFuY2UoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGcuZ2V0U3RyYXRlZ2llcygpLmdldFN0cmF0ZWd5KE1lc3NhZ2VQYXNzaW5nUmVkdWN0aW9uU3RyYXRlZ3kuY2xhc3MpLmlzUHJlc2VudCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShnLlYoKS5jb3VudCgpLmV4cGxhaW4oKS5nZXRTdHJhdGVneVRyYXZlcnNhbHMoKS5zdHJlYW0oKS5maWx0ZXIocGFpciAtPiBwYWlyLmdldFZhbHVlMCgpIGluc3RhbmNlb2YgTWVzc2FnZVBhc3NpbmdSZWR1Y3Rpb25TdHJhdGVneSkuZmluZEFueSgpLmlzUHJlc2VudCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnLmdldFN0cmF0ZWdpZXMoKS50b0xpc3QoKS5jb250YWlucyhTcGFya1NpbmdsZUl0ZXJhdGlvblN0cmF0ZWd5Lmluc3RhbmNlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnLmdldFN0cmF0ZWdpZXMoKS5nZXRTdHJhdGVneShTcGFya1NpbmdsZUl0ZXJhdGlvblN0cmF0ZWd5LmNsYXNzKS5pc1ByZXNlbnQoKSk7CiAgICAgICAgIGFzc2VydFRydWUoZy5WKCkuY291bnQoKS5leHBsYWluKCkuZ2V0U3RyYXRlZ3lUcmF2ZXJzYWxzKCkuc3RyZWFtKCkuZmlsdGVyKHBhaXIgLT4gcGFpci5nZXRWYWx1ZTAoKSBpbnN0YW5jZW9mIFNwYXJrU2luZ2xlSXRlcmF0aW9uU3RyYXRlZ3kpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSk7CiAKICAgICAgICAgdGVzdCh0cnVlLCBnLlYoKS5saW1pdCgxMCkpOwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL1NwYXJrVGVzdC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL1NwYXJrVGVzdC5qYXZhCmluZGV4IDUzOWY2N2EuLjVhYTc4YTQgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9TcGFya1Rlc3QuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvU3BhcmtUZXN0LmphdmEKQEAgLTE5LDggKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsucmRkLlJERDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0V4YW1wbGVJbnB1dFJERC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0V4YW1wbGVJbnB1dFJERC5qYXZhCmluZGV4IDg2Yzc2MTAuLjdjYTY3YTEgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9FeGFtcGxlSW5wdXRSREQuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vRXhhbXBsZUlucHV0UkRELmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pbzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhUGFpclJERDsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLmFwaS5qYXZhLkphdmFTcGFya0NvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvLlZlcnRleFdyaXRhYmxlOwpkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0V4YW1wbGVPdXRwdXRSREQuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9FeGFtcGxlT3V0cHV0UkRELmphdmEKaW5kZXggZWQzNjg4Ni4uNGNhMGE2OSAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0V4YW1wbGVPdXRwdXRSREQuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vRXhhbXBsZU91dHB1dFJERC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5zdHJ1Y3R1cmUuaW87CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuSmF2YVBhaXJSREQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvLlZlcnRleFdyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9JbnB1dE91dHB1dFJERFRlc3QuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9JbnB1dE91dHB1dFJERFRlc3QuamF2YQppbmRleCBlMTA5OGRlLi4zMzdiMmI1IDEwMDY0NAotLS0gYS9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vSW5wdXRPdXRwdXRSRERUZXN0LmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0T3V0cHV0UkREVGVzdC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5zdHJ1Y3R1cmUuaW87CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5IYWRvb3BHcmFwaDsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9JbnB1dFJERFRlc3QuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9JbnB1dFJERFRlc3QuamF2YQppbmRleCA4YTgzOTJhLi4xMWM0ZjQ4IDEwMDY0NAotLS0gYS9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vSW5wdXRSRERUZXN0LmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL0lucHV0UkREVGVzdC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5zdHJ1Y3R1cmUuaW87CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5IYWRvb3BHcmFwaDsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9PdXRwdXRSRERUZXN0LmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vT3V0cHV0UkREVGVzdC5qYXZhCmluZGV4IDYxN2IyNjguLjcwNDJhNmMgMTAwNjQ0Ci0tLSBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9PdXRwdXRSRERUZXN0LmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL091dHB1dFJERFRlc3QuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3Bhcmsuc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5UZXN0SGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5zdHJ1Y3R1cmUuSGFkb29wR3JhcGg7CmRpZmYgLS1naXQgYS9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vUGVyc2lzdGVkSW5wdXRPdXRwdXRSRERJbnRlZ3JhdGVUZXN0LmphdmEgYi9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vUGVyc2lzdGVkSW5wdXRPdXRwdXRSRERJbnRlZ3JhdGVUZXN0LmphdmEKaW5kZXggMDdmMzIyMy4uZjI2ZWZiYyAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1BlcnNpc3RlZElucHV0T3V0cHV0UkRESW50ZWdyYXRlVGVzdC5qYXZhCisrKyBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9QZXJzaXN0ZWRJbnB1dE91dHB1dFJEREludGVncmF0ZVRlc3QuamF2YQpAQCAtMTksOCArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3Bhcmsuc3RydWN0dXJlLmlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNwYXJrLnN0b3JhZ2UuU3RvcmFnZUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uVGVzdEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLmhhZG9vcC5Db25zdGFudHM7CkBAIC0yOCw3ICsyNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3Auc3RydWN0dXJlLmlvLmdyeW8uR3J5b091dHB1dEZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLmJ1bGtsb2FkaW5nLkJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5yYW5raW5nLnBhZ2VyYW5rLlBhZ2VSYW5rTWFwUmVkdWNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5jb21wdXRlci5yYW5raW5nLnBhZ2VyYW5rLlBhZ2VSYW5rVmVydGV4UHJvZ3JhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIudHJhdmVyc2FsLlRyYXZlcnNhbFZlcnRleFByb2dyYW07CkBAIC0zOCw5ICszNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5wcm9jZXNzLmNvbXB1dGVyLlNwYXJrSGFkb29wR3JhcGhQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5TcGFyazsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5Jb0NvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5HcmFwaEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VyR3JhcGg7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMjA4LDg2ICsyMDQsNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtQ2hhaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3BhcmsuY3JlYXRlKCJsb2NhbFs0XSIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmRkTmFtZSA9IFRlc3RIZWxwZXIubWFrZVRlc3REYXRhRGlyZWN0b3J5KFBlcnNpc3RlZElucHV0T3V0cHV0UkRESW50ZWdyYXRlVGVzdC5jbGFzcywgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gcmVhZENvbmZpZ3VyYXRpb24gPSBzdXBlci5nZXRCYXNlQ29uZmlndXJhdGlvbigpOwotICAgICAgICByZWFkQ29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShDb25zdGFudHMuR1JFTUxJTl9IQURPT1BfR1JBUEhfUkVBREVSLCBHcnlvSW5wdXRGb3JtYXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgcmVhZENvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLkdSRU1MSU5fSEFET09QX0lOUFVUX0xPQ0FUSU9OLCBTcGFya0hhZG9vcEdyYXBoUHJvdmlkZXIuUEFUSFMuZ2V0KCJ0aW5rZXJwb3AtbW9kZXJuLXYzZDAua3J5byIpKTsKLSAgICAgICAgcmVhZENvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLkdSRU1MSU5fSEFET09QX0dSQVBIX1dSSVRFUiwgUGVyc2lzdGVkT3V0cHV0UkRELmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgIHJlYWRDb25maWd1cmF0aW9uLnNldFByb3BlcnR5KENvbnN0YW50cy5HUkVNTElOX0hBRE9PUF9PVVRQVVRfTE9DQVRJT04sIHJkZE5hbWUpOwotICAgICAgICByZWFkQ29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShDb25zdGFudHMuR1JFTUxJTl9TUEFSS19QRVJTSVNUX0NPTlRFWFQsIHRydWUpOwotICAgICAgICBHcmFwaCBwYWdlUmFua0dyYXBoID0gR3JhcGhGYWN0b3J5Lm9wZW4ocmVhZENvbmZpZ3VyYXRpb24pOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiB3cml0ZUNvbmZpZ3VyYXRpb24gPSBuZXcgQmFzZUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgd3JpdGVDb25maWd1cmF0aW9uLnNldFByb3BlcnR5KEdyYXBoLkdSQVBILCBUaW5rZXJHcmFwaC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICB3cml0ZUNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoVGlua2VyR3JhcGguR1JFTUxJTl9USU5LRVJHUkFQSF9HUkFQSF9GT1JNQVQsICJncnlvIik7Ci0gICAgICAgIHdyaXRlQ29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShUaW5rZXJHcmFwaC5HUkVNTElOX1RJTktFUkdSQVBIX0dSQVBIX0xPQ0FUSU9OLCBUZXN0SGVscGVyLm1ha2VUZXN0RGF0YUZpbGUoUGVyc2lzdGVkSW5wdXRPdXRwdXRSRERJbnRlZ3JhdGVUZXN0LmNsYXNzLCAidGVzdEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtQ2hhaW4ua3J5byIpKTsKLSAgICAgICAgZmluYWwgR3JhcGggYnVsa0xvYWRlckdyYXBoID0gcGFnZVJhbmtHcmFwaC5jb21wdXRlKFNwYXJrR3JhcGhDb21wdXRlci5jbGFzcykucGVyc2lzdChHcmFwaENvbXB1dGVyLlBlcnNpc3QuVkVSVEVYX1BST1BFUlRJRVMpLnByb2dyYW0oUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtLmJ1aWxkKCkuY3JlYXRlKHBhZ2VSYW5rR3JhcGgpKS5zdWJtaXQoKS5nZXQoKS5ncmFwaCgpOwotICAgICAgICBidWxrTG9hZGVyR3JhcGguY29tcHV0ZShTcGFya0dyYXBoQ29tcHV0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLnBlcnNpc3QoR3JhcGhDb21wdXRlci5QZXJzaXN0Lk5PVEhJTkcpCi0gICAgICAgICAgICAgICAgLndvcmtlcnMoMSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKENvbnN0YW50cy5HUkVNTElOX0hBRE9PUF9HUkFQSF9SRUFERVIsIFBlcnNpc3RlZElucHV0UkRELmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKENvbnN0YW50cy5HUkVNTElOX0hBRE9PUF9JTlBVVF9MT0NBVElPTiwgcmRkTmFtZSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKENvbnN0YW50cy5HUkVNTElOX0hBRE9PUF9HUkFQSF9XUklURVIsIG51bGwpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShDb25zdGFudHMuR1JFTUxJTl9IQURPT1BfT1VUUFVUX0xPQ0FUSU9OLCBudWxsKQotICAgICAgICAgICAgICAgIC5wcm9ncmFtKEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmJ1aWxkKCkudXNlclN1cHBsaWVkSWRzKHRydWUpLndyaXRlR3JhcGgod3JpdGVDb25maWd1cmF0aW9uKS5jcmVhdGUoYnVsa0xvYWRlckdyYXBoKSkKLSAgICAgICAgICAgICAgICAuc3VibWl0KCkuZ2V0KCk7Ci0gICAgICAgIC8vLy8KLSAgICAgICAgYXNzZXJ0VHJ1ZShTcGFyay5oYXNSREQoQ29uc3RhbnRzLmdldEdyYXBoTG9jYXRpb24ocmRkTmFtZSkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNwYXJrLmdldENvbnRleHQoKS5nZXRQZXJzaXN0ZW50UkREcygpLnNpemUoKSk7Ci0gICAgICAgIC8vLy8KLSAgICAgICAgZmluYWwgR3JhcGggZ3JhcGggPSBUaW5rZXJHcmFwaC5vcGVuKCk7Ci0gICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKLSAgICAgICAgZ3JhcGguaW8oSW9Db3JlLmdyeW8oKSkucmVhZEdyYXBoKFRlc3RIZWxwZXIubWFrZVRlc3REYXRhRmlsZShQZXJzaXN0ZWRJbnB1dE91dHB1dFJEREludGVncmF0ZVRlc3QuY2xhc3MsICJ0ZXN0QnVsa0xvYWRlclZlcnRleFByb2dyYW1DaGFpbi5rcnlvIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNmwsIGcuVigpLmNvdW50KCkubmV4dCgpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDBsLCBnLkUoKS5jb3VudCgpLm5leHQoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWFya28iLCBnLlYoKS5oYXMoIm5hbWUiLCAibWFya28iKS52YWx1ZXMoIm5hbWUiKS5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNmwsIGcuVigpLnZhbHVlcyhQYWdlUmFua1ZlcnRleFByb2dyYW0uUEFHRV9SQU5LKS5jb3VudCgpLm5leHQoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIC8vLy8KLSAgICAgICAgU3BhcmsuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbUNoYWluV2l0aElucHV0T3V0cHV0SGVscGVyTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFyay5jcmVhdGUoImxvY2FsWzRdIik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJkZE5hbWUgPSBUZXN0SGVscGVyLm1ha2VUZXN0RGF0YURpcmVjdG9yeShQZXJzaXN0ZWRJbnB1dE91dHB1dFJEREludGVncmF0ZVRlc3QuY2xhc3MsIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIHJlYWRDb25maWd1cmF0aW9uID0gc3VwZXIuZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgcmVhZENvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLkdSRU1MSU5fSEFET09QX0dSQVBIX1JFQURFUiwgR3J5b0lucHV0Rm9ybWF0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgIHJlYWRDb25maWd1cmF0aW9uLnNldFByb3BlcnR5KENvbnN0YW50cy5HUkVNTElOX0hBRE9PUF9JTlBVVF9MT0NBVElPTiwgU3BhcmtIYWRvb3BHcmFwaFByb3ZpZGVyLlBBVEhTLmdldCgidGlua2VycG9wLW1vZGVybi12M2QwLmtyeW8iKSk7Ci0gICAgICAgIHJlYWRDb25maWd1cmF0aW9uLnNldFByb3BlcnR5KENvbnN0YW50cy5HUkVNTElOX0hBRE9PUF9HUkFQSF9XUklURVIsIFBlcnNpc3RlZE91dHB1dFJERC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICByZWFkQ29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShDb25zdGFudHMuR1JFTUxJTl9IQURPT1BfT1VUUFVUX0xPQ0FUSU9OLCByZGROYW1lKTsKLSAgICAgICAgcmVhZENvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLkdSRU1MSU5fU1BBUktfUEVSU0lTVF9DT05URVhULCB0cnVlKTsKLSAgICAgICAgR3JhcGggcGFnZVJhbmtHcmFwaCA9IEdyYXBoRmFjdG9yeS5vcGVuKHJlYWRDb25maWd1cmF0aW9uKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gd3JpdGVDb25maWd1cmF0aW9uID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHdyaXRlQ29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShHcmFwaC5HUkFQSCwgVGlua2VyR3JhcGguY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgd3JpdGVDb25maWd1cmF0aW9uLnNldFByb3BlcnR5KFRpbmtlckdyYXBoLkdSRU1MSU5fVElOS0VSR1JBUEhfR1JBUEhfRk9STUFULCAiZ3J5byIpOwotICAgICAgICB3cml0ZUNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoVGlua2VyR3JhcGguR1JFTUxJTl9USU5LRVJHUkFQSF9HUkFQSF9MT0NBVElPTiwgVGVzdEhlbHBlci5tYWtlVGVzdERhdGFGaWxlKFBlcnNpc3RlZElucHV0T3V0cHV0UkRESW50ZWdyYXRlVGVzdC5jbGFzcywgInRlc3RCdWxrTG9hZGVyVmVydGV4UHJvZ3JhbUNoYWluV2l0aElucHV0T3V0cHV0SGVscGVyTWFwcGluZy5rcnlvIikpOwotICAgICAgICBmaW5hbCBHcmFwaCBidWxrTG9hZGVyR3JhcGggPSBwYWdlUmFua0dyYXBoLmNvbXB1dGUoU3BhcmtHcmFwaENvbXB1dGVyLmNsYXNzKS5wZXJzaXN0KEdyYXBoQ29tcHV0ZXIuUGVyc2lzdC5FREdFUykucHJvZ3JhbShQYWdlUmFua1ZlcnRleFByb2dyYW0uYnVpbGQoKS5jcmVhdGUocGFnZVJhbmtHcmFwaCkpLnN1Ym1pdCgpLmdldCgpLmdyYXBoKCk7Ci0gICAgICAgIGJ1bGtMb2FkZXJHcmFwaC5jb21wdXRlKFNwYXJrR3JhcGhDb21wdXRlci5jbGFzcykKLSAgICAgICAgICAgICAgICAucGVyc2lzdChHcmFwaENvbXB1dGVyLlBlcnNpc3QuTk9USElORykKLSAgICAgICAgICAgICAgICAud29ya2VycygxKQotICAgICAgICAgICAgICAgIC5wcm9ncmFtKEJ1bGtMb2FkZXJWZXJ0ZXhQcm9ncmFtLmJ1aWxkKCkudXNlclN1cHBsaWVkSWRzKHRydWUpLndyaXRlR3JhcGgod3JpdGVDb25maWd1cmF0aW9uKS5jcmVhdGUoYnVsa0xvYWRlckdyYXBoKSkKLSAgICAgICAgICAgICAgICAuc3VibWl0KCkuZ2V0KCk7Ci0gICAgICAgIC8vLy8KLSAgICAgICAgU3BhcmsuY3JlYXRlKHJlYWRDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShTcGFyay5oYXNSREQoQ29uc3RhbnRzLmdldEdyYXBoTG9jYXRpb24ocmRkTmFtZSkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNwYXJrLmdldENvbnRleHQoKS5nZXRQZXJzaXN0ZW50UkREcygpLnNpemUoKSk7Ci0gICAgICAgIC8vLy8KLSAgICAgICAgZmluYWwgR3JhcGggZ3JhcGggPSBUaW5rZXJHcmFwaC5vcGVuKCk7Ci0gICAgICAgIGZpbmFsIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBncmFwaC50cmF2ZXJzYWwoKTsKLSAgICAgICAgZ3JhcGguaW8oSW9Db3JlLmdyeW8oKSkucmVhZEdyYXBoKFRlc3RIZWxwZXIubWFrZVRlc3REYXRhRmlsZShQZXJzaXN0ZWRJbnB1dE91dHB1dFJEREludGVncmF0ZVRlc3QuY2xhc3MsICJ0ZXN0QnVsa0xvYWRlclZlcnRleFByb2dyYW1DaGFpbldpdGhJbnB1dE91dHB1dEhlbHBlck1hcHBpbmcua3J5byIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDZsLCBnLlYoKS5jb3VudCgpLm5leHQoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2bCwgZy5FKCkuY291bnQoKS5uZXh0KCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtvIiwgZy5WKCkuaGFzKCJuYW1lIiwgIm1hcmtvIikudmFsdWVzKCJuYW1lIikubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDZsLCBnLlYoKS52YWx1ZXMoUGFnZVJhbmtWZXJ0ZXhQcm9ncmFtLlBBR0VfUkFOSykuY291bnQoKS5uZXh0KCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICAvLy8vCi0gICAgICAgIFNwYXJrLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleENoYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNwYXJrLmNyZWF0ZSgibG9jYWxbNF0iKTsKIApkaWZmIC0tZ2l0IGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1RveUdyYXBoSW5wdXRSREQuamF2YSBiL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9Ub3lHcmFwaElucHV0UkRELmphdmEKaW5kZXggOTA3NjRjZS4uZDE2Nzc1NiAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL1RveUdyYXBoSW5wdXRSREQuamF2YQorKysgYi9zcGFyay1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFyay9zdHJ1Y3R1cmUvaW8vVG95R3JhcGhJbnB1dFJERC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zcGFyay5zdHJ1Y3R1cmUuaW87CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuYXBpLmphdmEuSmF2YVBhaXJSREQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5hcGkuamF2YS5KYXZhU3BhcmtDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLkNvbnN0YW50czsKZGlmZiAtLWdpdCBhL3NwYXJrLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJrL3N0cnVjdHVyZS9pby9ncnlvL0dyeW9TZXJpYWxpemVySW50ZWdyYXRlVGVzdC5qYXZhIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8vR3J5b1NlcmlhbGl6ZXJJbnRlZ3JhdGVUZXN0LmphdmEKaW5kZXggYzNhYzgzZi4uYzNhMDFmYiAxMDA2NDQKLS0tIGEvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8vR3J5b1NlcmlhbGl6ZXJJbnRlZ3JhdGVUZXN0LmphdmEKKysrIGIvc3BhcmstZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3Bhcmsvc3RydWN0dXJlL2lvL2dyeW8vR3J5b1NlcmlhbGl6ZXJJbnRlZ3JhdGVUZXN0LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJrLnN0cnVjdHVyZS5pby5ncnlvOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5oYWRvb3AuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uaGFkb29wLnN0cnVjdHVyZS5pby5ncnlvLkdyeW9JbnB1dEZvcm1hdDsKZGlmZiAtLWdpdCBhL3NwYXJxbC1ncmVtbGluL3BvbS54bWwgYi9zcGFycWwtZ3JlbWxpbi9wb20ueG1sCmluZGV4IDc4ZjU4YzAuLjY4MTgwMzYgMTAwNjQ0Ci0tLSBhL3NwYXJxbC1ncmVtbGluL3BvbS54bWwKKysrIGIvc3BhcnFsLWdyZW1saW4vcG9tLnhtbApAQCAtNiw3ICs2LDcgQEAKICAgICA8cGFyZW50PgogICAgICAgICA8YXJ0aWZhY3RJZD50aW5rZXJwb3A8L2FydGlmYWN0SWQ+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgotICAgICAgICA8dmVyc2lvbj4zLjQuOS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9wYXJlbnQ+CiAgICAgPGFydGlmYWN0SWQ+c3BhcnFsLWdyZW1saW48L2FydGlmYWN0SWQ+CiAgICAgPG5hbWU+QXBhY2hlIFRpbmtlclBvcCA6OiBTUEFSUUwgR3JlbWxpbjwvbmFtZT4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0PC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPC9kZXBlbmRlbmNpZXM+CmRpZmYgLS1naXQgYS9zcGFycWwtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcnFsL1NwYXJxbFRvR3JlbWxpbkNvbXBpbGVyLmphdmEgYi9zcGFycWwtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcnFsL1NwYXJxbFRvR3JlbWxpbkNvbXBpbGVyLmphdmEKaW5kZXggMWRiYjE3My4uNjJlOTY0NyAxMDA2NDQKLS0tIGEvc3BhcnFsLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJxbC9TcGFycWxUb0dyZW1saW5Db21waWxlci5qYXZhCisrKyBiL3NwYXJxbC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFycWwvU3BhcnFsVG9HcmVtbGluQ29tcGlsZXIuamF2YQpAQCAtMjE4LDcgKzIxOCw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCB0aGUgc29ydCB3aWxsIGJlIGFzY2VuZGluZy4gZ2V0RGlyZWN0aW9uKCkgcmV0dXJucyAtMiBpZiB0aGUgREVTQy9BU0MgaXNuJ3QKICAgICAgICAgICAgICAgICAvLyBzdXBwbGllZCAtIHdlaXJkCi0gICAgICAgICAgICAgICAgb3JkZXJpbmdJbmRleC5wdXQoZXhwci5nZXRWYXJOYW1lKCksIHNvcnRDb25kaXRpb24uZ2V0RGlyZWN0aW9uKCkgPT0gLTEgPyBPcmRlci5kZWNyIDogT3JkZXIuaW5jcik7CisgICAgICAgICAgICAgICAgb3JkZXJpbmdJbmRleC5wdXQoZXhwci5nZXRWYXJOYW1lKCksIHNvcnRDb25kaXRpb24uZ2V0RGlyZWN0aW9uKCkgPT0gLTEgPyBPcmRlci5kZXNjIDogT3JkZXIuYXNjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcGFycWwtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcnFsL3Byb2Nlc3MvdHJhdmVyc2FsL2RzbC9zcGFycWwvU3BhcnFsVHJhdmVyc2FsU291cmNlLmphdmEgYi9zcGFycWwtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcnFsL3Byb2Nlc3MvdHJhdmVyc2FsL2RzbC9zcGFycWwvU3BhcnFsVHJhdmVyc2FsU291cmNlLmphdmEKaW5kZXggNzk4MTJiYi4uYmI4ZDcwYiAxMDA2NDQKLS0tIGEvc3BhcnFsLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJxbC9wcm9jZXNzL3RyYXZlcnNhbC9kc2wvc3BhcnFsL1NwYXJxbFRyYXZlcnNhbFNvdXJjZS5qYXZhCisrKyBiL3NwYXJxbC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFycWwvcHJvY2Vzcy90cmF2ZXJzYWwvZHNsL3NwYXJxbC9TcGFycWxUcmF2ZXJzYWxTb3VyY2UuamF2YQpAQCAtMTgsMTIgKzE4LDkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnNwYXJxbC5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuc3BhcnFsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MuY29tcHV0ZXIuQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnJlbW90ZS5SZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy5yZW1vdGUudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uUmVtb3RlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5CeXRlY29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNhbFN0cmF0ZWdpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVneTsKQEAgLTMzLDkgKzMwLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JbmplY3RTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3BhcnFsLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LlNwYXJxbFN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuU3RyaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLmVtcHR5LkVtcHR5R3JhcGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmluYXJ5T3BlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwpAQCAtMTc0LDIxICsxNjgsNiBAQAogICAgICAgICByZXR1cm4gKFNwYXJxbFRyYXZlcnNhbFNvdXJjZSkgc3VwZXIud2l0aG91dFN0cmF0ZWdpZXModHJhdmVyc2FsU3RyYXRlZ3lDbGFzc2VzKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3BhcnFsVHJhdmVyc2FsU291cmNlIHdpdGhSZW1vdGUoZmluYWwgQ29uZmlndXJhdGlvbiBjb25mKSB7Ci0gICAgICAgIHJldHVybiAoU3BhcnFsVHJhdmVyc2FsU291cmNlKSBzdXBlci53aXRoUmVtb3RlKGNvbmYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTcGFycWxUcmF2ZXJzYWxTb3VyY2Ugd2l0aFJlbW90ZShmaW5hbCBTdHJpbmcgY29uZmlnRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoU3BhcnFsVHJhdmVyc2FsU291cmNlKSBzdXBlci53aXRoUmVtb3RlKGNvbmZpZ0ZpbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTcGFycWxUcmF2ZXJzYWxTb3VyY2Ugd2l0aFJlbW90ZShmaW5hbCBSZW1vdGVDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIChTcGFycWxUcmF2ZXJzYWxTb3VyY2UpIHN1cGVyLndpdGhSZW1vdGUoY29ubmVjdGlvbik7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogVGhlIHN0YXJ0IHN0ZXAgZm9yIGEgU1BBUlFMIGJhc2VkIHRyYXZlcnNhbCB0aGF0IGFjY2VwdHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHF1ZXJ5IHRvIGV4ZWN1dGUuCiAgICAgICovCmRpZmYgLS1naXQgYS9zcGFycWwtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcnFsL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L1NwYXJxbFN0cmF0ZWd5LmphdmEgYi9zcGFycWwtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vc3BhcnFsL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L1NwYXJxbFN0cmF0ZWd5LmphdmEKaW5kZXggN2E2MmUzMS4uYTRhOTVjYyAxMDA2NDQKLS0tIGEvc3BhcnFsLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3NwYXJxbC9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9TcGFycWxTdHJhdGVneS5qYXZhCisrKyBiL3NwYXJxbC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi9zcGFycWwvcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvU3BhcnFsU3RyYXRlZ3kuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgewotICAgICAgICBpZiAoISh0cmF2ZXJzYWwuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBFbXB0eVN0ZXApKQorICAgICAgICBpZiAoISh0cmF2ZXJzYWwuaXNSb290KCkpKQogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIC8vIGFzc3VtZXMgdGhhdCB0aGUgdHJhdmVyc2FsIHN0YXJ0cyB3aXRoIHRoZSBzaW5nbGUgaW5qZWN0IHN0ZXAgdGhhdCBob2xkcyB0aGUgc3BhcnFsIHF1ZXJ5CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3BvbS54bWwgYi90aW5rZXJncmFwaC1ncmVtbGluL3BvbS54bWwKaW5kZXggN2MwOTI5Ni4uN2QxOWZkZCAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9wb20ueG1sCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vcG9tLnhtbApAQCAtMjEsNyArMjEsNyBAQAogICAgIDxwYXJlbnQ+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD50aW5rZXJwb3A8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNC45LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4zLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L3BhcmVudD4KICAgICA8YXJ0aWZhY3RJZD50aW5rZXJncmFwaC1ncmVtbGluPC9hcnRpZmFjdElkPgogICAgIDxuYW1lPkFwYWNoZSBUaW5rZXJQb3AgOjogVGlua2VyR3JhcGggR3JlbWxpbjwvbmFtZT4KZGlmZiAtLWdpdCBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3Byb2Nlc3MvY29tcHV0ZXIvVGlua2VyTWVzc2VuZ2VyLmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9wcm9jZXNzL2NvbXB1dGVyL1Rpbmtlck1lc3Nlbmdlci5qYXZhCmluZGV4IDNlNDljMzQuLmRkOTkzYzEgMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3Byb2Nlc3MvY29tcHV0ZXIvVGlua2VyTWVzc2VuZ2VyLmphdmEKKysrIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvcHJvY2Vzcy9jb21wdXRlci9UaW5rZXJNZXNzZW5nZXIuamF2YQpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VTY29wZS5Mb2NhbDxNPiBsb2NhbE1lc3NhZ2VTY29wZSA9IChNZXNzYWdlU2NvcGUuTG9jYWw8TT4pIG1lc3NhZ2VTY29wZTsKICAgICAgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzYWwuQWRtaW48VmVydGV4LCBFZGdlPiBpbmNpZGVudFRyYXZlcnNhbCA9IFRpbmtlck1lc3Nlbmdlci5zZXRWZXJ0ZXhTdGFydChsb2NhbE1lc3NhZ2VTY29wZS5nZXRJbmNpZGVudFRyYXZlcnNhbCgpLmdldCgpLmFzQWRtaW4oKSwgdGhpcy52ZXJ0ZXgpOwogICAgICAgICAgICAgICAgIGZpbmFsIERpcmVjdGlvbiBkaXJlY3Rpb24gPSBUaW5rZXJNZXNzZW5nZXIuZ2V0RGlyZWN0aW9uKGluY2lkZW50VHJhdmVyc2FsKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBFZGdlW10gZWRnZSA9IG5ldyBFZGdlWzFdOyAvLyBzaW11bGF0ZXMgc3RvcmFnZSBzaWRlLWVmZmVjdHMgYXZhaWxhYmxlIGluIEdyZW1saW4sIGJ1dCBub3QgSmF2YTggc3RyZWFtcworICAgICAgICAgICAgICAgIGZpbmFsIEVkZ2VbXSBlZGdlID0gbmV3IEVkZ2VbMV07IC8vIHNpbXVsYXRlcyBzdG9yYWdlIHNpZGUtZWZmZWN0cyBhdmFpbGFibGUgaW4gR3JlbWxpbiwgYnV0IG5vdCBKYXZhIHN0cmVhbXMKICAgICAgICAgICAgICAgICBtdWx0aUl0ZXJhdG9yLmFkZEl0ZXJhdG9yKFN0cmVhbVN1cHBvcnQuc3RyZWFtKFNwbGl0ZXJhdG9ycy5zcGxpdGVyYXRvclVua25vd25TaXplKFZlcnRleFByb2dyYW1IZWxwZXIucmV2ZXJzZShpbmNpZGVudFRyYXZlcnNhbC5hc0FkbWluKCkpLCBTcGxpdGVyYXRvci5JTU1VVEFCTEUgfCBTcGxpdGVyYXRvci5TSVpFRCksIGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoRWRnZSBlKSAtPiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZVswXSA9IGU7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vVGlua2VyR3JhcGhDb3VudFN0cmF0ZWd5LmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9vcHRpbWl6YXRpb24vVGlua2VyR3JhcGhDb3VudFN0cmF0ZWd5LmphdmEKaW5kZXggNTVlNmI1NS4uNTNiM2VjYSAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvb3B0aW1pemF0aW9uL1RpbmtlckdyYXBoQ291bnRTdHJhdGVneS5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L29wdGltaXphdGlvbi9UaW5rZXJHcmFwaENvdW50U3RyYXRlZ3kuamF2YQpAQCAtMjUsOSArMjUsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5UcmF2ZXJzYWxQYXJlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5Db3VudEdsb2JhbFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5HcmFwaFN0ZXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5NYXBTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuTm9PcEJhcnJpZXJTdGVwOwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5zaWRlRWZmZWN0LkFnZ3JlZ2F0ZVN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuQWdncmVnYXRlR2xvYmFsU3RlcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAuc2lkZUVmZmVjdC5JZGVudGl0eVN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnNpZGVFZmZlY3QuU2lkZUVmZmVjdFN0ZXA7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuQ29sbGVjdGluZ0JhcnJpZXJTdGVwOwpAQCAtNjEsNyArNjAsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgVHJhdmVyc2FsLkFkbWluPD8sID8+IHRyYXZlcnNhbCkgewotICAgICAgICBpZiAoISh0cmF2ZXJzYWwuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBFbXB0eVN0ZXApIHx8IFRyYXZlcnNhbEhlbHBlci5vbkdyYXBoQ29tcHV0ZXIodHJhdmVyc2FsKSkKKyAgICAgICAgaWYgKCEodHJhdmVyc2FsLmlzUm9vdCgpKSB8fCBUcmF2ZXJzYWxIZWxwZXIub25HcmFwaENvbXB1dGVyKHRyYXZlcnNhbCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGZpbmFsIExpc3Q8U3RlcD4gc3RlcHMgPSB0cmF2ZXJzYWwuZ2V0U3RlcHMoKTsKICAgICAgICAgaWYgKHN0ZXBzLnNpemUoKSA8IDIgfHwKQEAgLTc2LDcgKzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBpbnN0YW5jZW9mIE5vT3BCYXJyaWVyU3RlcCB8fAogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGluc3RhbmNlb2YgQ29sbGVjdGluZ0JhcnJpZXJTdGVwKSB8fAogICAgICAgICAgICAgICAgICAgICAoY3VycmVudCBpbnN0YW5jZW9mIFRyYXZlcnNhbFBhcmVudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhbEhlbHBlci5hbnlTdGVwUmVjdXJzaXZlbHkocyAtPiAocyBpbnN0YW5jZW9mIFNpZGVFZmZlY3RTdGVwIHx8IHMgaW5zdGFuY2VvZiBBZ2dyZWdhdGVTdGVwKSwgKFRyYXZlcnNhbFBhcmVudCkgY3VycmVudCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhbEhlbHBlci5hbnlTdGVwUmVjdXJzaXZlbHkocyAtPiAocyBpbnN0YW5jZW9mIFNpZGVFZmZlY3RTdGVwIHx8IHMgaW5zdGFuY2VvZiBBZ2dyZWdhdGVHbG9iYWxTdGVwKSwgKFRyYXZlcnNhbFBhcmVudCkgY3VycmVudCkpKQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRWxlbWVudD4gZWxlbWVudENsYXNzID0gKChHcmFwaFN0ZXA8PywgPz4pIHN0ZXBzLmdldCgwKSkuZ2V0UmV0dXJuQ2xhc3MoKTsKZGlmZiAtLWdpdCBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJFZGdlLmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyRWRnZS5qYXZhCmluZGV4IGJjZmU0ODUuLjAyZjdlZGUgMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJFZGdlLmphdmEKKysrIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckVkZ2UuamF2YQpAQCAtNDMsMTEgKzQzLDEzIEBACiAgICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFByb3BlcnR5PiBwcm9wZXJ0aWVzOwogICAgIHByb3RlY3RlZCBmaW5hbCBWZXJ0ZXggaW5WZXJ0ZXg7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFZlcnRleCBvdXRWZXJ0ZXg7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzOwogCiAgICAgcHJvdGVjdGVkIFRpbmtlckVkZ2UoZmluYWwgT2JqZWN0IGlkLCBmaW5hbCBWZXJ0ZXggb3V0VmVydGV4LCBmaW5hbCBTdHJpbmcgbGFiZWwsIGZpbmFsIFZlcnRleCBpblZlcnRleCkgewogICAgICAgICBzdXBlcihpZCwgbGFiZWwpOwogICAgICAgICB0aGlzLm91dFZlcnRleCA9IG91dFZlcnRleDsKICAgICAgICAgdGhpcy5pblZlcnRleCA9IGluVmVydGV4OworICAgICAgICB0aGlzLmFsbG93TnVsbFByb3BlcnR5VmFsdWVzID0gb3V0VmVydGV4LmdyYXBoKCkuZmVhdHVyZXMoKS5lZGdlKCkuc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKTsKICAgICAgICAgVGlua2VySGVscGVyLmF1dG9VcGRhdGVJbmRleCh0aGlzLCBULmxhYmVsLmdldEFjY2Vzc29yKCksIHRoaXMubGFiZWwsIG51bGwpOwogICAgIH0KIApAQCAtNTUsNiArNTcsMTIgQEAKICAgICBwdWJsaWMgPFY+IFByb3BlcnR5PFY+IHByb3BlcnR5KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFYgdmFsdWUpIHsKICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgdGhyb3cgZWxlbWVudEFscmVhZHlSZW1vdmVkKEVkZ2UuY2xhc3MsIGlkKTsKICAgICAgICAgRWxlbWVudEhlbHBlci52YWxpZGF0ZVByb3BlcnR5KGtleSwgdmFsdWUpOworCisgICAgICAgIGlmICghYWxsb3dOdWxsUHJvcGVydHlWYWx1ZXMgJiYgbnVsbCA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcHJvcGVydGllcyhrZXkpLmZvckVhY2hSZW1haW5pbmcoUHJvcGVydHk6OnJlbW92ZSk7CisgICAgICAgICAgICByZXR1cm4gUHJvcGVydHkuZW1wdHkoKTsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIFByb3BlcnR5IG9sZFByb3BlcnR5ID0gc3VwZXIucHJvcGVydHkoa2V5KTsKICAgICAgICAgZmluYWwgUHJvcGVydHk8Vj4gbmV3UHJvcGVydHkgPSBuZXcgVGlua2VyUHJvcGVydHk8Pih0aGlzLCBrZXksIHZhbHVlKTsKICAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5wcm9wZXJ0aWVzKSB0aGlzLnByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyRmFjdG9yeS5qYXZhIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckZhY3RvcnkuamF2YQppbmRleCA2YzBmMWIyLi42MWNjN2E4IDEwMDY0NAotLS0gYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyRmFjdG9yeS5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJGYWN0b3J5LmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnN0cnVjdHVyZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OwpkaWZmIC0tZ2l0IGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckdyYXBoLmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGguamF2YQppbmRleCA1ZGJjMzExLi42ZjRmODIxIDEwMDY0NAotLS0gYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGguamF2YQorKysgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGguamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWxTdHJhdGVnaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CkBAIC04Myw2ICs4Myw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFTUxJTl9USU5LRVJHUkFQSF9ERUZBVUxUX1ZFUlRFWF9QUk9QRVJUWV9DQVJESU5BTElUWSA9ICJncmVtbGluLnRpbmtlcmdyYXBoLmRlZmF1bHRWZXJ0ZXhQcm9wZXJ0eUNhcmRpbmFsaXR5IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVNTElOX1RJTktFUkdSQVBIX0dSQVBIX0xPQ0FUSU9OID0gImdyZW1saW4udGlua2VyZ3JhcGguZ3JhcGhMb2NhdGlvbiI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFTUxJTl9USU5LRVJHUkFQSF9HUkFQSF9GT1JNQVQgPSAiZ3JlbWxpbi50aW5rZXJncmFwaC5ncmFwaEZvcm1hdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFTUxJTl9USU5LRVJHUkFQSF9BTExPV19OVUxMX1BST1BFUlRZX1ZBTFVFUyA9ICJncmVtbGluLnRpbmtlcmdyYXBoLmFsbG93TnVsbFByb3BlcnR5VmFsdWVzIjsKIAogICAgIHByaXZhdGUgZmluYWwgVGlua2VyR3JhcGhGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBUaW5rZXJHcmFwaEZlYXR1cmVzKCk7CiAKQEAgLTk5LDYgKzEwMCw3IEBACiAgICAgcHJvdGVjdGVkIGZpbmFsIElkTWFuYWdlcjw/PiBlZGdlSWRNYW5hZ2VyOwogICAgIHByb3RlY3RlZCBmaW5hbCBJZE1hbmFnZXI8Pz4gdmVydGV4UHJvcGVydHlJZE1hbmFnZXI7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5IGRlZmF1bHRWZXJ0ZXhQcm9wZXJ0eUNhcmRpbmFsaXR5OworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ3JhcGhMb2NhdGlvbjsKQEAgLTExNCw2ICsxMTYsNyBAQAogICAgICAgICB2ZXJ0ZXhQcm9wZXJ0eUlkTWFuYWdlciA9IHNlbGVjdElkTWFuYWdlcihjb25maWd1cmF0aW9uLCBHUkVNTElOX1RJTktFUkdSQVBIX1ZFUlRFWF9QUk9QRVJUWV9JRF9NQU5BR0VSLCBWZXJ0ZXhQcm9wZXJ0eS5jbGFzcyk7CiAgICAgICAgIGRlZmF1bHRWZXJ0ZXhQcm9wZXJ0eUNhcmRpbmFsaXR5ID0gVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkudmFsdWVPZigKICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFN0cmluZyhHUkVNTElOX1RJTktFUkdSQVBIX0RFRkFVTFRfVkVSVEVYX1BST1BFUlRZX0NBUkRJTkFMSVRZLCBWZXJ0ZXhQcm9wZXJ0eS5DYXJkaW5hbGl0eS5zaW5nbGUubmFtZSgpKSk7CisgICAgICAgIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzID0gY29uZmlndXJhdGlvbi5nZXRCb29sZWFuKEdSRU1MSU5fVElOS0VSR1JBUEhfQUxMT1dfTlVMTF9QUk9QRVJUWV9WQUxVRVMsIGZhbHNlKTsKIAogICAgICAgICBncmFwaExvY2F0aW9uID0gY29uZmlndXJhdGlvbi5nZXRTdHJpbmcoR1JFTUxJTl9USU5LRVJHUkFQSF9HUkFQSF9MT0NBVElPTiwgbnVsbCk7CiAgICAgICAgIGdyYXBoRm9ybWF0ID0gY29uZmlndXJhdGlvbi5nZXRTdHJpbmcoR1JFTUxJTl9USU5LRVJHUkFQSF9HUkFQSF9GT1JNQVQsIG51bGwpOwpAQCAtMzg1LDYgKzM4OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBGZWF0dXJlcy5WZXJ0ZXhQcm9wZXJ0eUZlYXR1cmVzIHByb3BlcnRpZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gdmVydGV4UHJvcGVydHlGZWF0dXJlczsKICAgICAgICAgfQpAQCAtNDExLDYgKzQxOSwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ3VzdG9tSWRzKCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC00NDksNiArNDYyLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gYWxsb3dOdWxsUHJvcGVydHlWYWx1ZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDdXN0b21JZHMoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJbmRleC5qYXZhIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckluZGV4LmphdmEKaW5kZXggZjU4NzJjZi4uNzU5MjRkYSAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckluZGV4LmphdmEKKysrIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckluZGV4LmphdmEKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBwdXQoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgT2JqZWN0IHZhbHVlLCBmaW5hbCBUIGVsZW1lbnQpIHsKICAgICAgICAgTWFwPE9iamVjdCwgU2V0PFQ+PiBrZXlNYXAgPSB0aGlzLmluZGV4LmdldChrZXkpOwogICAgICAgICBpZiAobnVsbCA9PSBrZXlNYXApIHsKLSAgICAgICAgICAgIHRoaXMuaW5kZXgucHV0SWZBYnNlbnQoa2V5LCBuZXcgQ29uY3VycmVudEhhc2hNYXA8T2JqZWN0LCBTZXQ8VD4+KCkpOworICAgICAgICAgICAgdGhpcy5pbmRleC5wdXRJZkFic2VudChrZXksIG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCkpOwogICAgICAgICAgICAga2V5TWFwID0gdGhpcy5pbmRleC5nZXQoa2V5KTsKICAgICAgICAgfQogICAgICAgICBTZXQ8VD4gb2JqZWN0cyA9IGtleU1hcC5nZXQodmFsdWUpOwpAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICBpZiAobnVsbCA9PSBrZXlNYXApIHsKICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNldDxUPiBzZXQgPSBrZXlNYXAuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIFNldDxUPiBzZXQgPSBrZXlNYXAuZ2V0KGluZGV4YWJsZSh2YWx1ZSkpOwogICAgICAgICAgICAgaWYgKG51bGwgPT0gc2V0KQogICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgICAgIGVsc2UKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgICAgaWYgKG51bGwgPT0ga2V5TWFwKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNldDxUPiBzZXQgPSBrZXlNYXAuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxUPiBzZXQgPSBrZXlNYXAuZ2V0KGluZGV4YWJsZSh2YWx1ZSkpOwogICAgICAgICAgICAgaWYgKG51bGwgPT0gc2V0KQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgZWxzZQpAQCAtODksNyArODksNyBAQAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZShmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUsIGZpbmFsIFQgZWxlbWVudCkgewogICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBTZXQ8VD4+IGtleU1hcCA9IHRoaXMuaW5kZXguZ2V0KGtleSk7CiAgICAgICAgIGlmIChudWxsICE9IGtleU1hcCkgewotICAgICAgICAgICAgU2V0PFQ+IG9iamVjdHMgPSBrZXlNYXAuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxUPiBvYmplY3RzID0ga2V5TWFwLmdldChpbmRleGFibGUodmFsdWUpKTsKICAgICAgICAgICAgIGlmIChudWxsICE9IG9iamVjdHMpIHsKICAgICAgICAgICAgICAgICBvYmplY3RzLnJlbW92ZShlbGVtZW50KTsKICAgICAgICAgICAgICAgICBpZiAob2JqZWN0cy5zaXplKCkgPT0gMCkgewpAQCAtMTExLDE3ICsxMTEsMTEgQEAKIAogICAgIHB1YmxpYyB2b2lkIGF1dG9VcGRhdGUoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlLCBmaW5hbCBPYmplY3Qgb2xkVmFsdWUsIGZpbmFsIFQgZWxlbWVudCkgewogICAgICAgICBpZiAodGhpcy5pbmRleGVkS2V5cy5jb250YWlucyhrZXkpKSB7Ci0gICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShrZXksIG9sZFZhbHVlLCBlbGVtZW50KTsKKyAgICAgICAgICAgIHRoaXMucmVtb3ZlKGtleSwgb2xkVmFsdWUsIGVsZW1lbnQpOwogICAgICAgICAgICAgdGhpcy5wdXQoa2V5LCBuZXdWYWx1ZSwgZWxlbWVudCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhdXRvUmVtb3ZlKGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIE9iamVjdCBvbGRWYWx1ZSwgZmluYWwgVCBlbGVtZW50KSB7Ci0gICAgICAgIGlmICh0aGlzLmluZGV4ZWRLZXlzLmNvbnRhaW5zKGtleSkpCi0gICAgICAgICAgICB0aGlzLnJlbW92ZShrZXksIG9sZFZhbHVlLCBlbGVtZW50KTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBjcmVhdGVLZXlJbmRleChmaW5hbCBTdHJpbmcga2V5KSB7CiAgICAgICAgIGlmIChudWxsID09IGtleSkKICAgICAgICAgICAgIHRocm93IEdyYXBoLkV4Y2VwdGlvbnMuYXJndW1lbnRDYW5Ob3RCZU51bGwoImtleSIpOwpAQCAtMTMzLDggKzEyNyw4IEBACiAgICAgICAgIHRoaXMuaW5kZXhlZEtleXMuYWRkKGtleSk7CiAKICAgICAgICAgKFZlcnRleC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRoaXMuaW5kZXhDbGFzcykgPwotICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGgudmVydGljZXMudmFsdWVzKCkuPFQ+cGFyYWxsZWxTdHJlYW0oKSA6Ci0gICAgICAgICAgICAgICAgdGhpcy5ncmFwaC5lZGdlcy52YWx1ZXMoKS48VD5wYXJhbGxlbFN0cmVhbSgpKQorICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGgudmVydGljZXMudmFsdWVzKCkucGFyYWxsZWxTdHJlYW0oKSA6CisgICAgICAgICAgICAgICAgdGhpcy5ncmFwaC5lZGdlcy52YWx1ZXMoKS5wYXJhbGxlbFN0cmVhbSgpKQogICAgICAgICAgICAgICAgIC5tYXAoZSAtPiBuZXcgT2JqZWN0W117KChUKSBlKS5wcm9wZXJ0eShrZXkpLCBlfSkKICAgICAgICAgICAgICAgICAuZmlsdGVyKGEgLT4gKChQcm9wZXJ0eSkgYVswXSkuaXNQcmVzZW50KCkpCiAgICAgICAgICAgICAgICAgLmZvckVhY2goYSAtPiB0aGlzLnB1dChrZXksICgoUHJvcGVydHkpIGFbMF0pLnZhbHVlKCksIChUKSBhWzFdKSk7CkBAIC0xNDcsNyArMTQxLDM1IEBACiAgICAgICAgIHRoaXMuaW5kZXhlZEtleXMucmVtb3ZlKGtleSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgYSB3YXkgZm9yIGFuIGluZGV4IHRvIGhhdmUgYSB7QGNvZGUgbnVsbH0gdmFsdWUgYXMge0Bjb2RlIENvbmN1cnJlbnRIYXNoTWFwfSB3aWxsIG5vdCBhbGxvdyBhCisgICAgICoge0Bjb2RlIG51bGx9IGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbmRleGFibGUoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gbnVsbCA9PSBvYmogPyBJbmRleGVkTnVsbC5pbnN0YW5jZSgpIDogb2JqOworICAgIH0KKwogICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRJbmRleGVkS2V5cygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhlZEtleXM7CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbmRleGVkTnVsbCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEluZGV4ZWROdWxsIGluc3QgPSBuZXcgSW5kZXhlZE51bGwoKTsKKworICAgICAgICBwcml2YXRlIEluZGV4ZWROdWxsKCkge30KKworICAgICAgICBzdGF0aWMgSW5kZXhlZE51bGwgaW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5zdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIDc1MTkxMjEyMzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBvIGluc3RhbmNlb2YgSW5kZXhlZE51bGw7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VySW9SZWdpc3RyeVYxZDAuamF2YSBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjFkMC5qYXZhCmluZGV4IGQxNWE0YTcuLmUyMTQwYjEgMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjFkMC5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjFkMC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5BYnN0cmFjdElvUmVnaXN0cnk7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VySW9SZWdpc3RyeVYyZDAuamF2YSBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjJkMC5qYXZhCmluZGV4IDE4ZmQ1NDkuLmU2ZjU5YzkgMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjJkMC5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjJkMC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5BYnN0cmFjdElvUmVnaXN0cnk7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VySW9SZWdpc3RyeVYzZDAuamF2YSBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjNkMC5qYXZhCmluZGV4IGM2MmQxNzkuLjZlZTY4ZWUgMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjNkMC5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJJb1JlZ2lzdHJ5VjNkMC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5pby5BYnN0cmFjdElvUmVnaXN0cnk7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyUHJvcGVydHkuamF2YSBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJQcm9wZXJ0eS5qYXZhCmluZGV4IDBmNzA3N2IuLmRiNDAzNDYgMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJQcm9wZXJ0eS5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJQcm9wZXJ0eS5qYXZhCkBAIC01NCw5ICs1NCwxMiBAQAogICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGUgZXhpc3RlbmNlIG9mIHRoaXMgb2JqZWN0IGltcGxpZXMgdGhlIHByb3BlcnR5IGlzIHByZXNlbnQsIHRodXMgZXZlbiBhIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyAicHJlc2VudCIuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkgewotICAgICAgICByZXR1cm4gbnVsbCAhPSB0aGlzLnZhbHVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJWZXJ0ZXguamF2YSBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJWZXJ0ZXguamF2YQppbmRleCBiZTA4MTM3Li4xNzY1MDU0IDEwMDY0NAotLS0gYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyVmVydGV4LmphdmEKKysrIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlclZlcnRleC5qYXZhCkBAIC00NiwxMCArNDYsMTIgQEAKICAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU2V0PEVkZ2U+PiBvdXRFZGdlczsKICAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU2V0PEVkZ2U+PiBpbkVkZ2VzOwogICAgIHByaXZhdGUgZmluYWwgVGlua2VyR3JhcGggZ3JhcGg7CisgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzOwogCiAgICAgcHJvdGVjdGVkIFRpbmtlclZlcnRleChmaW5hbCBPYmplY3QgaWQsIGZpbmFsIFN0cmluZyBsYWJlbCwgZmluYWwgVGlua2VyR3JhcGggZ3JhcGgpIHsKICAgICAgICAgc3VwZXIoaWQsIGxhYmVsKTsKICAgICAgICAgdGhpcy5ncmFwaCA9IGdyYXBoOworICAgICAgICB0aGlzLmFsbG93TnVsbFByb3BlcnR5VmFsdWVzID0gZ3JhcGguZmVhdHVyZXMoKS52ZXJ0ZXgoKS5zdXBwb3J0c051bGxQcm9wZXJ0eVZhbHVlcygpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtODUsNiArODcsMTYgQEAKICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgdGhyb3cgZWxlbWVudEFscmVhZHlSZW1vdmVkKFZlcnRleC5jbGFzcywgaWQpOwogICAgICAgICBFbGVtZW50SGVscGVyLmxlZ2FsUHJvcGVydHlLZXlWYWx1ZUFycmF5KGtleVZhbHVlcyk7CiAgICAgICAgIEVsZW1lbnRIZWxwZXIudmFsaWRhdGVQcm9wZXJ0eShrZXksIHZhbHVlKTsKKworICAgICAgICAvLyBpZiB3ZSBkb24ndCBhbGxvdyBudWxsIHByb3BlcnR5IHZhbHVlcyBhbmQgdGhlIHZhbHVlIGlzIG51bGwgdGhlbiB0aGUga2V5IGNhbiBiZSByZW1vdmVkIGJ1dCBvbmx5IGlmIHRoZQorICAgICAgICAvLyBjYXJkaW5hbGl0eSBpcyBzaW5nbGUuIGlmIGl0IGlzIGxpc3Qvc2V0IHRoZW4gd2UgY2FuIGp1c3QgaWdub3JlIHRoZSBudWxsLgorICAgICAgICBpZiAoIWFsbG93TnVsbFByb3BlcnR5VmFsdWVzICYmIG51bGwgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIGZpbmFsIFZlcnRleFByb3BlcnR5LkNhcmRpbmFsaXR5IGNhcmQgPSBudWxsID09IGNhcmRpbmFsaXR5ID8gZ3JhcGguZmVhdHVyZXMoKS52ZXJ0ZXgoKS5nZXRDYXJkaW5hbGl0eShrZXkpIDogY2FyZGluYWxpdHk7CisgICAgICAgICAgICBpZiAoVmVydGV4UHJvcGVydHkuQ2FyZGluYWxpdHkuc2luZ2xlID09IGNhcmQpCisgICAgICAgICAgICAgICAgcHJvcGVydGllcyhrZXkpLmZvckVhY2hSZW1haW5pbmcoVmVydGV4UHJvcGVydHk6OnJlbW92ZSk7CisgICAgICAgICAgICByZXR1cm4gVmVydGV4UHJvcGVydHkuZW1wdHkoKTsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIE9wdGlvbmFsPE9iamVjdD4gb3B0aW9uYWxJZCA9IEVsZW1lbnRIZWxwZXIuZ2V0SWRWYWx1ZShrZXlWYWx1ZXMpOwogICAgICAgICBmaW5hbCBPcHRpb25hbDxWZXJ0ZXhQcm9wZXJ0eTxWPj4gb3B0aW9uYWxWZXJ0ZXhQcm9wZXJ0eSA9IEVsZW1lbnRIZWxwZXIuc3RhZ2VWZXJ0ZXhQcm9wZXJ0eSh0aGlzLCBjYXJkaW5hbGl0eSwga2V5LCB2YWx1ZSwga2V5VmFsdWVzKTsKICAgICAgICAgaWYgKG9wdGlvbmFsVmVydGV4UHJvcGVydHkuaXNQcmVzZW50KCkpIHJldHVybiBvcHRpb25hbFZlcnRleFByb3BlcnR5LmdldCgpOwpkaWZmIC0tZ2l0IGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlclZlcnRleFByb3BlcnR5LmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyVmVydGV4UHJvcGVydHkuamF2YQppbmRleCAzY2E4NzFhLi5mMjYzNWRmIDEwMDY0NAotLS0gYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyVmVydGV4UHJvcGVydHkuamF2YQorKysgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyVmVydGV4UHJvcGVydHkuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CkBAIC00NSw2ICs0NCw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBUaW5rZXJWZXJ0ZXggdmVydGV4OwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGtleTsKICAgICBwcml2YXRlIGZpbmFsIFYgdmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFsbG93TnVsbFByb3BlcnR5VmFsdWVzOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBjb25zdHJ1Y3RvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgSUQgdHlwZSBhZ2FpbnN0IHRoZSB7QGxpbmsgR3JhcGh9LiAgSXQgd2lsbCBhbHdheXMganVzdCB1c2UgYQpAQCAtNTIsMTIgKzUyLDcgQEAKICAgICAgKiB3aXRoIHtAbGluayBUaW5rZXJHcmFwaENvbXB1dGVyVmlld30uCiAgICAgICovCiAgICAgcHVibGljIFRpbmtlclZlcnRleFByb3BlcnR5KGZpbmFsIFRpbmtlclZlcnRleCB2ZXJ0ZXgsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFYgdmFsdWUsIGZpbmFsIE9iamVjdC4uLiBwcm9wZXJ0eUtleVZhbHVlcykgewotICAgICAgICBzdXBlcigoKFRpbmtlckdyYXBoKSB2ZXJ0ZXguZ3JhcGgoKSkudmVydGV4UHJvcGVydHlJZE1hbmFnZXIuZ2V0TmV4dElkKChUaW5rZXJHcmFwaCkgdmVydGV4LmdyYXBoKCkpLCBrZXkpOwotICAgICAgICB0aGlzLnZlcnRleCA9IHZlcnRleDsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgRWxlbWVudEhlbHBlci5sZWdhbFByb3BlcnR5S2V5VmFsdWVBcnJheShwcm9wZXJ0eUtleVZhbHVlcyk7Ci0gICAgICAgIEVsZW1lbnRIZWxwZXIuYXR0YWNoUHJvcGVydGllcyh0aGlzLCBwcm9wZXJ0eUtleVZhbHVlcyk7CisgICAgICAgIHRoaXMoKChUaW5rZXJHcmFwaCkgdmVydGV4LmdyYXBoKCkpLnZlcnRleFByb3BlcnR5SWRNYW5hZ2VyLmdldE5leHRJZCgoVGlua2VyR3JhcGgpIHZlcnRleC5ncmFwaCgpKSwgdmVydGV4LCBrZXksIHZhbHVlLCBwcm9wZXJ0eUtleVZhbHVlcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02Niw2ICs2MSwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBUaW5rZXJWZXJ0ZXhQcm9wZXJ0eShmaW5hbCBPYmplY3QgaWQsIGZpbmFsIFRpbmtlclZlcnRleCB2ZXJ0ZXgsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFYgdmFsdWUsIGZpbmFsIE9iamVjdC4uLiBwcm9wZXJ0eUtleVZhbHVlcykgewogICAgICAgICBzdXBlcihpZCwga2V5KTsKKyAgICAgICAgdGhpcy5hbGxvd051bGxQcm9wZXJ0eVZhbHVlcyA9IHZlcnRleC5ncmFwaCgpLmZlYXR1cmVzKCkudmVydGV4KCkucHJvcGVydGllcygpLnN1cHBvcnRzTnVsbFByb3BlcnR5VmFsdWVzKCk7CisgICAgICAgIGlmICghYWxsb3dOdWxsUHJvcGVydHlWYWx1ZXMgJiYgbnVsbCA9PSB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlIGNhbm5vdCBiZSBudWxsIGFzIGZlYXR1cmUgc3VwcG9ydHNOdWxsUHJvcGVydHlWYWx1ZXMgaXMgZmFsc2UiKTsKKwogICAgICAgICB0aGlzLnZlcnRleCA9IHZlcnRleDsKICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKQEAgLTExNyw2ICsxMTYsMTIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgPFU+IFByb3BlcnR5PFU+IHByb3BlcnR5KGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFUgdmFsdWUpIHsKICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgdGhyb3cgZWxlbWVudEFscmVhZHlSZW1vdmVkKFZlcnRleFByb3BlcnR5LmNsYXNzLCBpZCk7CisKKyAgICAgICAgaWYgKCghYWxsb3dOdWxsUHJvcGVydHlWYWx1ZXMgJiYgbnVsbCA9PSB2YWx1ZSkpIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMoa2V5KS5mb3JFYWNoUmVtYWluaW5nKFByb3BlcnR5OjpyZW1vdmUpOworICAgICAgICAgICAgcmV0dXJuIFByb3BlcnR5LmVtcHR5KCk7CisgICAgICAgIH0KKwogICAgICAgICBmaW5hbCBQcm9wZXJ0eTxVPiBwcm9wZXJ0eSA9IG5ldyBUaW5rZXJQcm9wZXJ0eTw+KHRoaXMsIGtleSwgdmFsdWUpOwogICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzID09IG51bGwpIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHByb3BlcnR5KTsKQEAgLTEzOCw3ICsxNDMsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBkZWxldGUgPSBuZXcgQXRvbWljQm9vbGVhbih0cnVlKTsKICAgICAgICAgICAgIHRoaXMudmVydGV4LnByb3BlcnRpZXModGhpcy5rZXkpLmZvckVhY2hSZW1haW5pbmcocHJvcGVydHkgLT4gewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZSgpLmVxdWFscyh0aGlzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY3VycmVudFByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eS52YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICgoY3VycmVudFByb3BlcnR5VmFsdWUgIT0gbnVsbCAmJiBjdXJyZW50UHJvcGVydHlWYWx1ZS5lcXVhbHModGhpcy52YWx1ZSkgfHwgbnVsbCA9PSBjdXJyZW50UHJvcGVydHlWYWx1ZSAmJiBudWxsID09IHRoaXMudmFsdWUpKQogICAgICAgICAgICAgICAgICAgICBkZWxldGUuc2V0KGZhbHNlKTsKICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgaWYgKGRlbGV0ZS5nZXQoKSkgVGlua2VySGVscGVyLnJlbW92ZUluZGV4KHRoaXMudmVydGV4LCB0aGlzLmtleSwgdGhpcy52YWx1ZSk7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9UaW5rZXJHcmFwaFByb3ZpZGVyLmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9UaW5rZXJHcmFwaFByb3ZpZGVyLmphdmEKaW5kZXggMGVmZDI0MC4uMzI1NGFhMSAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvVGlua2VyR3JhcGhQcm92aWRlci5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL1RpbmtlckdyYXBoUHJvdmlkZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGg7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uQWJzdHJhY3RHcmFwaFByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uTG9hZEdyYXBoV2l0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9wcm9jZXNzL1RpbmtlckdyYXBoQ29tcHV0ZXJQcm92aWRlci5qYXZhIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvcHJvY2Vzcy9UaW5rZXJHcmFwaENvbXB1dGVyUHJvdmlkZXIuamF2YQppbmRleCAwZWZjMzdhLi42MTIxZWY3IDEwMDY0NAotLS0gYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9wcm9jZXNzL1RpbmtlckdyYXBoQ29tcHV0ZXJQcm92aWRlci5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3Byb2Nlc3MvVGlua2VyR3JhcGhDb21wdXRlclByb3ZpZGVyLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnByb2Nlc3M7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uR3JhcGhQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkdyYXBoQ29tcHV0ZXI7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0hhbHRlZFRyYXZlcnNlclN0cmF0ZWd5VGVzdC5qYXZhIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9IYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneVRlc3QuamF2YQppbmRleCAyODhiNGI0Li5hNzY5ZjRhIDEwMDY0NAotLS0gYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9wcm9jZXNzL3RyYXZlcnNhbC9zdHJhdGVneS9kZWNvcmF0aW9uL0hhbHRlZFRyYXZlcnNlclN0cmF0ZWd5VGVzdC5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vSGFsdGVkVHJhdmVyc2VyU3RyYXRlZ3lUZXN0LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnRpbmtlcmdyYXBoLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5NYXBDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uMi5NYXBDb25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5IYWx0ZWRUcmF2ZXJzZXJTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0cmF0ZWd5LmRlY29yYXRpb24uU3ViZ3JhcGhTdHJhdGVneTsKZGlmZiAtLWdpdCBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3Byb2Nlc3MvdHJhdmVyc2FsL3N0cmF0ZWd5L2RlY29yYXRpb24vT3B0aW9uc1N0cmF0ZWd5VGVzdC5qYXZhIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9PcHRpb25zU3RyYXRlZ3lUZXN0LmphdmEKaW5kZXggY2UzOTk1My4uMzJhNzdmMiAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9PcHRpb25zU3RyYXRlZ3lUZXN0LmphdmEKKysrIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvcHJvY2Vzcy90cmF2ZXJzYWwvc3RyYXRlZ3kvZGVjb3JhdGlvbi9PcHRpb25zU3RyYXRlZ3lUZXN0LmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLlRyYXZlcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLmRzbC5ncmFwaC5HcmFwaFRyYXZlcnNhbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLk1hcFN0ZXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLm1hcC5TY2FsYXJNYXBTdGVwOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kuZGVjb3JhdGlvbi5PcHRpb25zU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuR3JhcGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi50aW5rZXJncmFwaC5zdHJ1Y3R1cmUuVGlua2VyR3JhcGg7CkBAIC01NCw3ICs1NCw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE9wdGlvbnMoZmluYWwgR3JhcGhUcmF2ZXJzYWxTb3VyY2Ugb3B0aW9uZWRHKSB7CiAgICAgICAgIEdyYXBoVHJhdmVyc2FsIHQgPSBvcHRpb25lZEcuaW5qZWN0KDEpOwotICAgICAgICB0ID0gdC5hc0FkbWluKCkuYWRkU3RlcChuZXcgTWFwU3RlcDxPYmplY3QsIE9iamVjdD4odC5hc0FkbWluKCkpIHsKKyAgICAgICAgdCA9IHQuYXNBZG1pbigpLmFkZFN0ZXAobmV3IFNjYWxhck1hcFN0ZXA8T2JqZWN0LCBPYmplY3Q+KHQuYXNBZG1pbigpKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgbWFwKGZpbmFsIFRyYXZlcnNlci5BZG1pbjxPYmplY3Q+IHRyYXZlcnNlcikgewogICAgICAgICAgICAgICAgIGZpbmFsIE9wdGlvbnNTdHJhdGVneSBzdHJhdGVneSA9IHRyYXZlcnNhbC5hc0FkbWluKCkuZ2V0U3RyYXRlZ2llcygpLmdldFN0cmF0ZWd5KE9wdGlvbnNTdHJhdGVneS5jbGFzcykuZ2V0KCk7CmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGhJZE1hbmFnZXJUZXN0LmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGhJZE1hbmFnZXJUZXN0LmphdmEKaW5kZXggZjAyZGUxYy4uZTU4OWM1YyAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckdyYXBoSWRNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJHcmFwaElkTWFuYWdlclRlc3QuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVDsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkdyYXBoOwpkaWZmIC0tZ2l0IGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckdyYXBoUGxheVRlc3QuamF2YSBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJHcmFwaFBsYXlUZXN0LmphdmEKaW5kZXggZjRhMGEwYS4uMDc5MWIxNiAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckdyYXBoUGxheVRlc3QuamF2YQorKysgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGhQbGF5VGVzdC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5UcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguR3JhcGhUcmF2ZXJzYWxTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5kc2wuZ3JhcGguX187CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuV2l0aE9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdGVwLnV0aWwuZXZlbnQuQ29uc29sZU11dGF0aW9uTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLnRyYXZlcnNhbC5zdHJhdGVneS5kZWNvcmF0aW9uLkV2ZW50U3RyYXRlZ3k7CkBAIC0yNjksMTAgKzI3MCw5IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBASWdub3JlCiAgICAgcHVibGljIHZvaWQgdGVzdEJ1Z3MoKSB7CiAgICAgICAgIEdyYXBoVHJhdmVyc2FsU291cmNlIGcgPSBUaW5rZXJGYWN0b3J5LmNyZWF0ZU1vZGVybigpLnRyYXZlcnNhbCgpOwotCisgICAgICAgIE9iamVjdCBvMSA9IGcuVigpLm1hcChfXy5WKDEpKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGcuVigpLmFzKCJhIikuYm90aCgpLmFzKCJiIikuZGVkdXAoImEiLCAiYiIpLmJ5KFQubGFiZWwpLnNlbGVjdCgiYSIsICJiIikuZXhwbGFpbigpKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGcuVigpLmFzKCJhIikuYm90aCgpLmFzKCJiIikuZGVkdXAoImEiLCAiYiIpLmJ5KFQubGFiZWwpLnNlbGVjdCgiYSIsICJiIikudG9MaXN0KCkpOwogCmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGhUZXN0LmphdmEgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvVGlua2VyR3JhcGhUZXN0LmphdmEKaW5kZXggYTIyMDhmNS4uNTU1YzdjYSAxMDA2NDQKLS0tIGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL1RpbmtlckdyYXBoVGVzdC5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9UaW5rZXJHcmFwaFRlc3QuamF2YQpAQCAtMTgsOCArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4udGlua2VyZ3JhcGguc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbjIuQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24yLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5HcmFwaEhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLlRlc3RIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5wcm9jZXNzLmNvbXB1dGVyLkNvbXB1dGVyOwpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLkdyYXBoVHJhdmVyc2FsU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuZHNsLmdyYXBoLl9fOwogaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kudmVyaWZpY2F0aW9uLlJlc2VydmVkS2V5c1ZlcmlmaWNhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RyYXRlZ3kudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnV0aWwuVHJhdmVyc2FsTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOwpkaWZmIC0tZ2l0IGEvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL2lvL2dyYXBoc29uL0Fic3RyYWN0VGlua2VyR3JhcGhHcmFwaFNPTlRyYW5zbGF0b3JQcm92aWRlci5qYXZhIGIvdGlua2VyZ3JhcGgtZ3JlbWxpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGlua2VycG9wL2dyZW1saW4vdGlua2VyZ3JhcGgvc3RydWN0dXJlL2lvL2dyYXBoc29uL0Fic3RyYWN0VGlua2VyR3JhcGhHcmFwaFNPTlRyYW5zbGF0b3JQcm92aWRlci5qYXZhCmluZGV4IDRkNGVlMDAuLjdmNGViZTggMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9pby9ncmFwaHNvbi9BYnN0cmFjdFRpbmtlckdyYXBoR3JhcGhTT05UcmFuc2xhdG9yUHJvdmlkZXIuamF2YQorKysgYi90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvaW8vZ3JhcGhzb24vQWJzdHJhY3RUaW5rZXJHcmFwaEdyYXBoU09OVHJhbnNsYXRvclByb3ZpZGVyLmphdmEKQEAgLTIxMywxMCArMjEzLDYgQEAKICAgICAgICAgbWV0aG9kID0gInNob3VsZE5ldmVyUHJvcGFnYXRlQU5vQnVsa1RyYXZlcnNlciIsCiAgICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCiBAR3JhcGguT3B0T3V0KAotICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuQ29yZVRyYXZlcnNhbFRlc3QiLAotICAgICAgICBtZXRob2QgPSAic2hvdWxkTmV2ZXJQcm9wYWdhdGVBTnVsbFZhbHVlZFRyYXZlcnNlciIsCi0gICAgICAgIHJlYXNvbiA9ICJSZWFzb24gcmVxdWlyZXMgaW52ZXN0aWdhdGlvbiIpCi1AR3JhcGguT3B0T3V0KAogICAgICAgICB0ZXN0ID0gIm9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4ucHJvY2Vzcy50cmF2ZXJzYWwuc3RlcC5tYXAuUmVhZFRlc3QiLAogICAgICAgICBtZXRob2QgPSAiKiIsCiAgICAgICAgIHJlYXNvbiA9ICJyZWFkIGFuZCB3cml0ZSB0ZXN0cyBkb24ndCB0cmFuc2xhdGUgbG9jYWxseSB3ZWxsIGJlY2F1c2Ugb2YgY2FsbGluZyBpdGVyYXRlKCkgaW5zaWRlIHJlYWQoKS93cml0ZSgpIGFkZCBhIG5vbmUoKSIpCmRpZmYgLS1naXQgYS90aW5rZXJncmFwaC1ncmVtbGluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aW5rZXJwb3AvZ3JlbWxpbi90aW5rZXJncmFwaC9zdHJ1Y3R1cmUvaW8vZ3J5by9UaW5rZXJHcmFwaEdyeW9UcmFuc2xhdG9yUHJvdmlkZXIuamF2YSBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9pby9ncnlvL1RpbmtlckdyYXBoR3J5b1RyYW5zbGF0b3JQcm92aWRlci5qYXZhCmluZGV4IGQ2ZDkzYTAuLjBkMzBkZjkgMTAwNjQ0Ci0tLSBhL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9pby9ncnlvL1RpbmtlckdyYXBoR3J5b1RyYW5zbGF0b3JQcm92aWRlci5qYXZhCisrKyBiL3RpbmtlcmdyYXBoLWdyZW1saW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RpbmtlcnBvcC9ncmVtbGluL3RpbmtlcmdyYXBoL3N0cnVjdHVyZS9pby9ncnlvL1RpbmtlckdyYXBoR3J5b1RyYW5zbGF0b3JQcm92aWRlci5qYXZhCkBAIC0yMDksMTAgKzIwOSw2IEBACiAgICAgICAgIG1ldGhvZCA9ICJzaG91bGROZXZlclByb3BhZ2F0ZUFOb0J1bGtUcmF2ZXJzZXIiLAogICAgICAgICByZWFzb24gPSAiUmVhc29uIHJlcXVpcmVzIGludmVzdGlnYXRpb24iKQogQEdyYXBoLk9wdE91dCgKLSAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLkNvcmVUcmF2ZXJzYWxUZXN0IiwKLSAgICAgICAgbWV0aG9kID0gInNob3VsZE5ldmVyUHJvcGFnYXRlQU51bGxWYWx1ZWRUcmF2ZXJzZXIiLAotICAgICAgICByZWFzb24gPSAiUmVhc29uIHJlcXVpcmVzIGludmVzdGlnYXRpb24iKQotQEdyYXBoLk9wdE91dCgKICAgICAgICAgdGVzdCA9ICJvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLnN0ZXAubWFwLlJlYWRUZXN0IiwKICAgICAgICAgbWV0aG9kID0gIioiLAogICAgICAgICByZWFzb24gPSAicmVhZCBhbmQgd3JpdGUgdGVzdHMgZG9uJ3QgdHJhbnNsYXRlIGxvY2FsbHkgd2VsbCBiZWNhdXNlIG9mIGNhbGxpbmcgaXRlcmF0ZSgpIGluc2lkZSByZWFkKCkvd3JpdGUoKSBhZGQgYSBub25lKCkiKQo=